voluntary 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (295) hide show
  1. data/MIT-LICENSE +20 -0
  2. data/README.rdoc +48 -0
  3. data/Rakefile +27 -0
  4. data/app/assets/javascripts/voluntary/application.js +6 -0
  5. data/app/assets/javascripts/voluntary/base.js.coffee +34 -0
  6. data/app/assets/javascripts/voluntary/bootstrap.js.coffee +4 -0
  7. data/app/assets/javascripts/voluntary/functions.js +24 -0
  8. data/app/assets/javascripts/voluntary/users.js.coffee +12 -0
  9. data/app/assets/stylesheets/voluntary/application.css +15 -0
  10. data/app/assets/stylesheets/voluntary/base.css.scss +40 -0
  11. data/app/assets/stylesheets/voluntary/bootstrap_and_overrides.css.less +67 -0
  12. data/app/controllers/areas_controller.rb +66 -0
  13. data/app/controllers/candidatures_controller.rb +79 -0
  14. data/app/controllers/comments_controller.rb +70 -0
  15. data/app/controllers/devise_extensions/registrations_controller.rb +37 -0
  16. data/app/controllers/home_controller.rb +7 -0
  17. data/app/controllers/organizations_controller.rb +67 -0
  18. data/app/controllers/pages_controller.rb +54 -0
  19. data/app/controllers/products_controller.rb +62 -0
  20. data/app/controllers/professions_controller.rb +66 -0
  21. data/app/controllers/projects_controller.rb +56 -0
  22. data/app/controllers/results_controller.rb +93 -0
  23. data/app/controllers/stories_controller.rb +96 -0
  24. data/app/controllers/tasks_controller.rb +88 -0
  25. data/app/controllers/users_controller.rb +52 -0
  26. data/app/controllers/vacancies_controller.rb +79 -0
  27. data/app/controllers/voluntary/application_controller.rb +92 -0
  28. data/app/controllers/workflow/candidatures_controller.rb +20 -0
  29. data/app/controllers/workflow/products_controller.rb +6 -0
  30. data/app/controllers/workflow/project_owner_controller.rb +33 -0
  31. data/app/controllers/workflow/stories_controller.rb +6 -0
  32. data/app/controllers/workflow/tasks_controller.rb +147 -0
  33. data/app/controllers/workflow/user_controller.rb +6 -0
  34. data/app/controllers/workflow/vacancies_controller.rb +17 -0
  35. data/app/controllers/workflow_controller.rb +7 -0
  36. data/app/helpers/application_helper.rb +65 -0
  37. data/app/helpers/collection_helper.rb +31 -0
  38. data/app/helpers/comments_helper.rb +11 -0
  39. data/app/helpers/form_helper.rb +39 -0
  40. data/app/helpers/language_helper.rb +15 -0
  41. data/app/helpers/layout_helper.rb +24 -0
  42. data/app/helpers/product_helper.rb +32 -0
  43. data/app/helpers/show_helper.rb +65 -0
  44. data/app/helpers/wizard_helper.rb +27 -0
  45. data/app/models/area.rb +19 -0
  46. data/app/models/area_user.rb +19 -0
  47. data/app/models/candidature.rb +35 -0
  48. data/app/models/comment.rb +16 -0
  49. data/app/models/history_tracker.rb +3 -0
  50. data/app/models/mongo_db_document.rb +11 -0
  51. data/app/models/organization.rb +19 -0
  52. data/app/models/page.rb +30 -0
  53. data/app/models/product.rb +99 -0
  54. data/app/models/product/new_product.rb +3 -0
  55. data/app/models/product/project_management.rb +29 -0
  56. data/app/models/profession.rb +13 -0
  57. data/app/models/project.rb +66 -0
  58. data/app/models/project_user.rb +13 -0
  59. data/app/models/result.rb +55 -0
  60. data/app/models/role.rb +8 -0
  61. data/app/models/role/admin.rb +2 -0
  62. data/app/models/role/master.rb +2 -0
  63. data/app/models/role/project_owner.rb +2 -0
  64. data/app/models/role/user.rb +2 -0
  65. data/app/models/state_machines/candidature.rb +42 -0
  66. data/app/models/state_machines/page.rb +18 -0
  67. data/app/models/state_machines/story.rb +51 -0
  68. data/app/models/state_machines/task.rb +46 -0
  69. data/app/models/state_machines/vacancy.rb +41 -0
  70. data/app/models/story.rb +82 -0
  71. data/app/models/task.rb +85 -0
  72. data/app/models/user.rb +95 -0
  73. data/app/models/user_role.rb +6 -0
  74. data/app/models/vacancy.rb +41 -0
  75. data/app/observers/candidature_observer.rb +29 -0
  76. data/app/observers/story_observer.rb +6 -0
  77. data/app/observers/task_observer.rb +34 -0
  78. data/app/presenters/layout/application_presenter.rb +3 -0
  79. data/app/presenters/layout_presenter.rb +9 -0
  80. data/app/presenters/presenter.rb +46 -0
  81. data/app/presenters/resource_presenter.rb +30 -0
  82. data/app/presenters/resources/general/wizard_presenter.rb +17 -0
  83. data/app/presenters/resources/general/wizards/story/steps/activate_presenter.rb +3 -0
  84. data/app/presenters/resources/general/wizards/story/steps/setup_tasks_presenter.rb +5 -0
  85. data/app/presenters/resources/general/wizards/story_presenter.rb +3 -0
  86. data/app/presenters/resources/user/form_presenter.rb +16 -0
  87. data/app/presenters/shared/collection/table_presenter.rb +33 -0
  88. data/app/views/areas/_form.html.erb +11 -0
  89. data/app/views/areas/edit.html.erb +3 -0
  90. data/app/views/areas/index.html.erb +5 -0
  91. data/app/views/areas/new.html.erb +3 -0
  92. data/app/views/areas/show.html.erb +6 -0
  93. data/app/views/candidatures/_form.html.erb +13 -0
  94. data/app/views/candidatures/edit.html.erb +3 -0
  95. data/app/views/candidatures/index.html.erb +11 -0
  96. data/app/views/candidatures/new.html.erb +3 -0
  97. data/app/views/candidatures/show.html.erb +18 -0
  98. data/app/views/comments/_form.html.erb +16 -0
  99. data/app/views/comments/_resource.html.erb +16 -0
  100. data/app/views/comments/edit.html.erb +3 -0
  101. data/app/views/comments/new.html.erb +3 -0
  102. data/app/views/devise/mailer/confirmation_instructions.html.erb +10 -0
  103. data/app/views/devise/registrations/new.html.erb +5 -0
  104. data/app/views/general/wizard.html.erb +16 -0
  105. data/app/views/kaminari/_first_page.html.erb +13 -0
  106. data/app/views/kaminari/_gap.html.erb +8 -0
  107. data/app/views/kaminari/_last_page.html.erb +13 -0
  108. data/app/views/kaminari/_next_page.html.erb +13 -0
  109. data/app/views/kaminari/_page.html.erb +12 -0
  110. data/app/views/kaminari/_paginator.html.erb +25 -0
  111. data/app/views/kaminari/_prev_page.html.erb +13 -0
  112. data/app/views/layouts/application.html.erb +48 -0
  113. data/app/views/layouts/shared/_flash_messages.html.erb +7 -0
  114. data/app/views/layouts/shared/_navigation.html.erb +7 -0
  115. data/app/views/organizations/_form.html.erb +11 -0
  116. data/app/views/organizations/edit.html.erb +3 -0
  117. data/app/views/organizations/index.html.erb +5 -0
  118. data/app/views/organizations/new.html.erb +3 -0
  119. data/app/views/organizations/show.html.erb +6 -0
  120. data/app/views/pages/_form.html.erb +12 -0
  121. data/app/views/pages/edit.html.erb +3 -0
  122. data/app/views/pages/index.html.erb +5 -0
  123. data/app/views/pages/new.html.erb +3 -0
  124. data/app/views/pages/show.html.erb +10 -0
  125. data/app/views/products/_form.html.erb +28 -0
  126. data/app/views/products/edit.html.erb +3 -0
  127. data/app/views/products/index.html.erb +5 -0
  128. data/app/views/products/mixins/_keywords.html.erb +4 -0
  129. data/app/views/products/new.html.erb +3 -0
  130. data/app/views/products/show.html.erb +11 -0
  131. data/app/views/products/types/text_creation/stories/_form.html.erb +19 -0
  132. data/app/views/products/types/text_creation/stories/_task_fields.html.erb +7 -0
  133. data/app/views/projects/_form.html.erb +16 -0
  134. data/app/views/projects/edit.html.erb +3 -0
  135. data/app/views/projects/index.html.erb +5 -0
  136. data/app/views/projects/new.html.erb +3 -0
  137. data/app/views/projects/show.html.erb +13 -0
  138. data/app/views/shared/_comments.html.erb +7 -0
  139. data/app/views/shared/collection/_list.html.erb +37 -0
  140. data/app/views/shared/collection/_table.html.erb +36 -0
  141. data/app/views/shared/form/_error_messages.html.erb +10 -0
  142. data/app/views/shared/resource/_actions.html.erb +26 -0
  143. data/app/views/shared/resource/_event_elements.html.erb +7 -0
  144. data/app/views/stories/_collection.html.erb +8 -0
  145. data/app/views/stories/_form.html.erb +19 -0
  146. data/app/views/stories/_task_fields.html.erb +11 -0
  147. data/app/views/stories/index.html.erb +1 -0
  148. data/app/views/stories/show.html.erb +13 -0
  149. data/app/views/stories/steps/_activate.html.erb +17 -0
  150. data/app/views/stories/steps/_setup_tasks.html.erb +35 -0
  151. data/app/views/stories/tasks.html.erb +0 -0
  152. data/app/views/tasks/_collection.html.erb +12 -0
  153. data/app/views/users/_form.html.erb +43 -0
  154. data/app/views/users/edit.html.erb +3 -0
  155. data/app/views/users/index.html.erb +6 -0
  156. data/app/views/users/new.html.erb +3 -0
  157. data/app/views/users/preferences.html.erb +11 -0
  158. data/app/views/users/show.html.erb +6 -0
  159. data/app/views/vacancies/_form.html.erb +15 -0
  160. data/app/views/vacancies/edit.html.erb +3 -0
  161. data/app/views/vacancies/index.html.erb +7 -0
  162. data/app/views/vacancies/new.html.erb +3 -0
  163. data/app/views/vacancies/show.html.erb +17 -0
  164. data/app/views/workflow/index.html.erb +0 -0
  165. data/app/views/workflow/products/show.html.erb +34 -0
  166. data/app/views/workflow/project_owner/_candidatures.html.erb +31 -0
  167. data/app/views/workflow/project_owner/_stories.html.erb +29 -0
  168. data/app/views/workflow/project_owner/_tasks.html.erb +34 -0
  169. data/app/views/workflow/project_owner/_vacancies.html.erb +27 -0
  170. data/app/views/workflow/project_owner/index.html.erb +24 -0
  171. data/app/views/workflow/tasks/_work_form.html.erb +8 -0
  172. data/app/views/workflow/tasks/_work_head.html.erb +15 -0
  173. data/app/views/workflow/tasks/edit.html.erb +3 -0
  174. data/app/views/workflow/tasks/index.html.erb +31 -0
  175. data/app/views/workflow/tasks/next.html.erb +0 -0
  176. data/app/views/workflow/tasks/steps/_complete.html.erb +11 -0
  177. data/app/views/workflow/tasks/steps/_review.html.erb +13 -0
  178. data/app/views/workflow/tasks/steps/_work.html.erb +17 -0
  179. data/app/views/workflow/user/_tasks.html.erb +30 -0
  180. data/app/views/workflow/user/index.html.erb +14 -0
  181. data/config/initializers/1_initialize_app_config.rb +5 -0
  182. data/config/initializers/devise.rb +193 -0
  183. data/config/initializers/locale_settings.rb +42 -0
  184. data/config/initializers/mongoid-history.rb +2 -0
  185. data/config/initializers/recaptcha.rb +7 -0
  186. data/config/initializers/simple_form.rb +178 -0
  187. data/config/initializers/simple_navigation.rb +2 -0
  188. data/config/locales/devise.en.yml +59 -0
  189. data/config/locales/en.yml +26 -0
  190. data/config/locales/general/en.yml +71 -0
  191. data/config/locales/resources/area/en.yml +12 -0
  192. data/config/locales/resources/candidature/en.yml +19 -0
  193. data/config/locales/resources/comment/en.yml +11 -0
  194. data/config/locales/resources/organization/en.yml +11 -0
  195. data/config/locales/resources/page/en.yml +11 -0
  196. data/config/locales/resources/product/en.yml +23 -0
  197. data/config/locales/resources/project/en.yml +9 -0
  198. data/config/locales/resources/result/en.yml +9 -0
  199. data/config/locales/resources/story/en.yml +34 -0
  200. data/config/locales/resources/task/en.yml +36 -0
  201. data/config/locales/resources/user/en.yml +14 -0
  202. data/config/locales/resources/vacancy/en.yml +29 -0
  203. data/config/locales/simple_form.en.yml +26 -0
  204. data/config/locales/workflow/en.yml +37 -0
  205. data/config/routes.rb +188 -0
  206. data/db/migrate/20120907144853_create_schema.rb +217 -0
  207. data/db/migrate/20120911093743_remove_timestamps_from_habtm_tables.rb +21 -0
  208. data/db/migrate/20120919161831_add_unique_index_for_one_user_candidature_per_vacancy.rb +9 -0
  209. data/db/migrate/20120922201955_create_mongo_db_documents.rb +13 -0
  210. data/db/migrate/20120923140109_add_product_to_project.rb +6 -0
  211. data/db/migrate/20121004061413_add_extra_user_attributes.rb +9 -0
  212. data/db/migrate/20121004132105_create_professions.rb +13 -0
  213. data/db/migrate/20121006162913_add_public_attribute_to_roles.rb +6 -0
  214. data/db/migrate/20121006170407_add_type_attribute_to_roles.rb +5 -0
  215. data/db/migrate/20121007071543_add_foreign_languages_to_user.rb +6 -0
  216. data/db/migrate/20121028073712_create_organizations.rb +13 -0
  217. data/db/seeds.rb +14 -0
  218. data/lib/applicat/mvc/controller.rb +171 -0
  219. data/lib/applicat/mvc/controller/error_handling.rb +40 -0
  220. data/lib/applicat/mvc/controller/resource.rb +19 -0
  221. data/lib/applicat/mvc/controller/transition_actions.rb +43 -0
  222. data/lib/applicat/mvc/model/resource/base.rb +56 -0
  223. data/lib/applicat/mvc/model/tokenable.rb +24 -0
  224. data/lib/applicat/mvc/model/tree.rb +82 -0
  225. data/lib/db_seed.rb +150 -0
  226. data/lib/environment_configuration.rb +54 -0
  227. data/lib/generators/voluntary/install/install_generator.rb +118 -0
  228. data/lib/generators/voluntary/install/templates/app/controllers/application_controller.rb +3 -0
  229. data/lib/generators/voluntary/install/templates/app/models/ability.rb +49 -0
  230. data/lib/generators/voluntary/install/templates/app/models/app_config.rb +32 -0
  231. data/lib/generators/voluntary/install/templates/app/views/layouts/application.html.erb +50 -0
  232. data/lib/generators/voluntary/install/templates/config/application.yml +147 -0
  233. data/lib/generators/voluntary/install/templates/config/cucumber.yml +8 -0
  234. data/lib/generators/voluntary/install/templates/config/database.example.yml +28 -0
  235. data/lib/generators/voluntary/install/templates/config/deploy.rb +59 -0
  236. data/lib/generators/voluntary/install/templates/config/email.example.yml +9 -0
  237. data/lib/generators/voluntary/install/templates/config/initializers/recaptcha_example +4 -0
  238. data/lib/generators/voluntary/install/templates/config/locale_settings.yml +121 -0
  239. data/lib/generators/voluntary/install/templates/config/main_navigation.rb +262 -0
  240. data/lib/generators/voluntary/install/templates/config/mongoid.yml +78 -0
  241. data/lib/generators/voluntary/install/templates/config/nginx.conf +27 -0
  242. data/lib/generators/voluntary/install/templates/config/unicorn.rb +9 -0
  243. data/lib/generators/voluntary/install/templates/config/unicorn_init.sh +84 -0
  244. data/lib/generators/voluntary/install/templates/db/seeds.rb +14 -0
  245. data/lib/generators/voluntary/install/templates/features/step_definitions/email_steps.rb +89 -0
  246. data/lib/generators/voluntary/install/templates/features/step_definitions/factory_steps.rb +120 -0
  247. data/lib/generators/voluntary/install/templates/features/step_definitions/javascript_steps.rb +15 -0
  248. data/lib/generators/voluntary/install/templates/features/step_definitions/navigation_steps.rb +3 -0
  249. data/lib/generators/voluntary/install/templates/features/step_definitions/resources_steps.rb +8 -0
  250. data/lib/generators/voluntary/install/templates/features/step_definitions/session_steps.rb +35 -0
  251. data/lib/generators/voluntary/install/templates/features/step_definitions/web_steps.rb +271 -0
  252. data/lib/generators/voluntary/install/templates/features/support/database_cleaner_patches.rb +24 -0
  253. data/lib/generators/voluntary/install/templates/features/support/env.rb +83 -0
  254. data/lib/generators/voluntary/install/templates/features/support/integration_sessions_controller.rb +32 -0
  255. data/lib/generators/voluntary/install/templates/features/support/integration_sessions_form.html.erb +1 -0
  256. data/lib/generators/voluntary/install/templates/features/support/paths.rb +98 -0
  257. data/lib/generators/voluntary/install/templates/features/support/selectors.rb +44 -0
  258. data/lib/generators/voluntary/install/templates/features/support/spork_env +72 -0
  259. data/lib/generators/voluntary/install/templates/features/support/user_cuke_helpers.rb +78 -0
  260. data/lib/generators/voluntary/install/templates/lib/volontariat_seed.rb +36 -0
  261. data/lib/generators/voluntary/install/templates/spec/spec_helper.rb +72 -0
  262. data/lib/generators/voluntary/install/templates/spec/support/deferred_garbage_collector.rb +45 -0
  263. data/lib/generators/voluntary/install/templates/spec/support/devise.rb +3 -0
  264. data/lib/generators/voluntary/install/templates/spec/support/mongo_database_cleaner.rb +19 -0
  265. data/lib/generators/voluntary/install/templates/vendor/assets/javascripts/jquery.tokeninput.js +915 -0
  266. data/lib/generators/voluntary/install/templates/vendor/assets/stylesheets/token-input-facebook.css +122 -0
  267. data/lib/generators/voluntary/install/templates/vendor/assets/stylesheets/token-input-mac.css +204 -0
  268. data/lib/generators/voluntary/install/templates/vendor/assets/stylesheets/token-input.css +127 -0
  269. data/lib/i18n_interpolation_fallbacks.rb +21 -0
  270. data/lib/model/mongo_db/commentable.rb +17 -0
  271. data/lib/model/mongo_db/core_extensions.rb +10 -0
  272. data/lib/model/mongo_db/customizable.rb +23 -0
  273. data/lib/model/mongo_db/product/keywords.rb +31 -0
  274. data/lib/model/mongo_db/state_version_attributes.rb +15 -0
  275. data/lib/tasks/cucumber.rake +65 -0
  276. data/lib/tasks/voluntary_tasks.rake +4 -0
  277. data/lib/vendors/active_model/naming.rb +14 -0
  278. data/lib/vendors/simple_navigation/renderer/breadcrumbs_without_method_links.rb +30 -0
  279. data/lib/vendors/simple_navigation/renderer/twitter_sidenav.rb +34 -0
  280. data/lib/voluntary.rb +87 -0
  281. data/lib/voluntary/engine.rb +11 -0
  282. data/lib/voluntary/helpers/application.rb +69 -0
  283. data/lib/voluntary/helpers/collection.rb +35 -0
  284. data/lib/voluntary/helpers/comments.rb +15 -0
  285. data/lib/voluntary/helpers/form.rb +43 -0
  286. data/lib/voluntary/helpers/language.rb +19 -0
  287. data/lib/voluntary/helpers/layout.rb +28 -0
  288. data/lib/voluntary/helpers/product.rb +36 -0
  289. data/lib/voluntary/helpers/show.rb +69 -0
  290. data/lib/voluntary/helpers/wizard.rb +31 -0
  291. data/lib/voluntary/version.rb +3 -0
  292. data/lib/wizard.rb +58 -0
  293. data/lib/wizard/controller/concerns/paths.rb +31 -0
  294. data/lib/wizard/controller/concerns/steps.rb +142 -0
  295. metadata +1217 -0
@@ -0,0 +1,27 @@
1
+ module WizardHelper
2
+ def section_header(wizard_step)
3
+ wizard_step_index = wizard_steps.index(wizard_step) + 1
4
+
5
+ content = ["#{wizard_step_index} / #{wizard_steps.length}"]
6
+ content << t("stories.steps.#{wizard_step}.title")
7
+ content << (future_step?(wizard_step) ? t('general.not_available') : '')
8
+
9
+ content.join(' ')
10
+ end
11
+
12
+ def step_pane(wizard_step)
13
+ return if future_step?(wizard_step)
14
+
15
+ partial_path = wizard_step == :initialization ? 'form' : "steps/#{wizard_step}"
16
+
17
+ if @presenter.respond_to?(wizard_step)
18
+ @step_presenter = @presenter.send(wizard_step)
19
+ else
20
+ @step_presenter = nil
21
+ end
22
+
23
+ render_product_specific_partial_if_available(
24
+ resource, "#{controller_name}/#{partial_path}"
25
+ )
26
+ end
27
+ end
@@ -0,0 +1,19 @@
1
+ class Area < ActiveRecord::Base
2
+ include Applicat::Mvc::Model::Resource::Base
3
+ include Applicat::Mvc::Model::Tree
4
+ include Applicat::Mvc::Model::Tokenable
5
+
6
+ has_and_belongs_to_many :users
7
+ has_and_belongs_to_many :projects
8
+
9
+ validates :name, presence: true, uniqueness: true
10
+
11
+ attr_accessible :name
12
+
13
+ extend FriendlyId
14
+
15
+ friendly_id :name, :use => :slugged
16
+
17
+ def products
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ class AreaUser < ActiveRecord::Base
2
+ self.table_name = 'areas_users'
3
+
4
+ belongs_to :area
5
+ belongs_to :user
6
+
7
+ after_create :increment_area_users_count
8
+ after_destroy :decrement_area_users_count
9
+
10
+ private
11
+
12
+ def increment_area_users_count
13
+ area.users_count.increment!
14
+ end
15
+
16
+ def decrement_area_users_count
17
+ area.users_count.decrement!
18
+ end
19
+ end
@@ -0,0 +1,35 @@
1
+ class Candidature < ActiveRecord::Base
2
+ include StateMachines::Candidature
3
+
4
+ belongs_to :vacancy
5
+ belongs_to :offeror, class_name: 'User'
6
+ belongs_to :user
7
+
8
+ has_many :comments, as: :commentable, dependent: :destroy
9
+
10
+ scope :accepted, where(state: 'accepted')
11
+
12
+ validates :vacancy_id, presence: true
13
+ validates :offeror_id, presence: true
14
+ validates :user_id, presence: true, uniqueness: { scope: :vacancy_id }
15
+ #validates :name, presence: true, uniqueness: { scope: :vacancy_id }
16
+ validates :text, presence: true
17
+
18
+ attr_accessible :vacancy_id, :name, :text
19
+
20
+ #extend FriendlyId
21
+ #friendly_id :name, use: :slugged
22
+
23
+ before_validation :set_offeror
24
+
25
+ # association shortcuts
26
+ def project
27
+ vacancy.project
28
+ end
29
+
30
+ private
31
+
32
+ def set_offeror
33
+ self.offeror_id = vacancy.project.user_id
34
+ end
35
+ end
@@ -0,0 +1,16 @@
1
+ class Comment < ActiveRecord::Base
2
+ has_ancestry
3
+
4
+ belongs_to :commentable, polymorphic: true
5
+ belongs_to :user
6
+
7
+ validates :commentable_type, presence: true
8
+ validates :commentable_id, presence: true
9
+ validates :user_id, presence: true
10
+ validates :name, presence: true
11
+ validates :text, presence: true
12
+
13
+ attr_accessible :commentable_type, :commentable_id, :parent_id, :name, :text
14
+
15
+ COMMENTABLE_TYPES = ['project', 'vacancy', 'candidature']
16
+ end
@@ -0,0 +1,3 @@
1
+ class HistoryTracker
2
+ include Mongoid::History::Tracker
3
+ end
@@ -0,0 +1,11 @@
1
+ class MongoDbDocument < ActiveRecord::Base
2
+ has_many :comments, as: :commentable, dependent: :destroy
3
+
4
+ validates :mongo_db_object_id, presence: true, uniqueness: { scope: :klass_name }
5
+ validates :klass_name, presence: true
6
+ validates :name, presence: true
7
+
8
+ def mongo_db_object
9
+ klass_name.constantize.find(mongo_db_object_id)
10
+ end
11
+ end
@@ -0,0 +1,19 @@
1
+ class Organization < ActiveRecord::Base
2
+ include Applicat::Mvc::Model::Resource::Base
3
+ #include Applicat::Mvc::Model::Tree
4
+ include Applicat::Mvc::Model::Tokenable
5
+
6
+ belongs_to :user
7
+
8
+ has_many :projects
9
+
10
+ validates :name, presence: true, uniqueness: true
11
+
12
+ attr_accessible :name
13
+
14
+ extend FriendlyId
15
+
16
+ friendly_id :name, :use => :slugged
17
+
18
+ PARENT_TYPES = ['user']
19
+ end
@@ -0,0 +1,30 @@
1
+ class Page
2
+ include Mongoid::Document
3
+ include Mongoid::Timestamps
4
+ include Mongoid::History::Trackable
5
+ include Mongoid::Slug
6
+
7
+ include StateMachines::Page
8
+
9
+ field :user_id, type: Integer
10
+ field :name, type: String
11
+ field :text, type: String
12
+ field :state, type: String
13
+
14
+ index({ name: 1 }, { unique: true })
15
+
16
+ attr_accessible :name, :text
17
+
18
+ scope :active, where(state: 'active')
19
+
20
+ validates :user_id, presence: true
21
+ validates :name, presence: true, uniqueness: true
22
+ validates :text, presence: true
23
+
24
+ track_history on: [:user_id, :name, :text, :state]
25
+ slug :name
26
+
27
+ # belongs_to (SQL)
28
+ def user; user_id ? User.find(user_id) : nil; end
29
+ def user=(value); self.user_id = value.id; end
30
+ end
@@ -0,0 +1,99 @@
1
+ class Product
2
+ include Mongoid::Document
3
+ include Mongoid::Timestamps
4
+
5
+ field :_id, type: String, default: -> { name.to_s.parameterize }
6
+ field :user_id, type: Integer
7
+ field :name, type: String, localize: true
8
+ field :text, type: String, localize: true
9
+ field :area_ids, type: Array, default: []
10
+ field :state, type: String
11
+
12
+ attr_accessible :name, :text, :area_ids
13
+
14
+ validates :user_id, presence: true
15
+ validates :name, presence: true, uniqueness: true
16
+ validates :area_ids, presence: true
17
+
18
+ validate :english_name_available?
19
+ validate :existing_model_file?
20
+
21
+ index({ name: 1 }, { unique: true })
22
+
23
+ before_validation :set_type
24
+
25
+ # active record compatibility
26
+ # just belongs_to reflections for cucumber's factory steps
27
+ def self.reflections
28
+ struct = OpenStruct.new(values: [])
29
+
30
+ # sql belongs_to relations
31
+ struct.values << OpenStruct.new(name: 'user', options: {})
32
+
33
+ ::Product.relations.each do |relation_name, relation|
34
+ # select only belongs_to relations
35
+ next unless relation_name == relation_name.singularize
36
+
37
+ # automatically include mongo db's belongs_to relations
38
+ struct.values << OpenStruct.new(name: relation_name, options: {})
39
+ end
40
+
41
+ struct
42
+ end
43
+
44
+ def self.stories(id, user, page)
45
+ collection = if id == 'no-name'
46
+ Story.exists(_type: false)
47
+ else
48
+ product = Product.find(id)
49
+
50
+ begin
51
+ product.story_class.for_user(user)
52
+ rescue NotImplementedError
53
+ product.story_class
54
+ end
55
+ end
56
+
57
+ collection.where(:users_without_tasks_ids.ne => user.id)#.page(page).per(1)
58
+ end
59
+
60
+ # belongs_to (SQL)
61
+ def user; User.find(offeror_id); end
62
+ def user=(value); self.user_id = value.id; end
63
+
64
+ # has_many (SQL)
65
+ def areas; Area.where(id: area_ids); end
66
+
67
+ private
68
+
69
+ def english_name_available?
70
+ unless attributes['name']['en'].present?
71
+ errors[:name] << I18n.t(
72
+ 'activerecord.errors.models.product.attributes.name.missing_english_name'
73
+ )
74
+ end
75
+ end
76
+
77
+ def existing_model_file?
78
+ unless (get_type.constantize rescue false)
79
+ errors[:name] << I18n.t(
80
+ 'activerecord.errors.models.product.attributes.name.missing_model_file'
81
+ )
82
+ end
83
+ end
84
+
85
+ def get_type
86
+ if name == 'Product'
87
+ 'Product'
88
+ else
89
+ [
90
+ 'Product', name.gsub(' - ', '_').gsub('-', '_').gsub(' ', '_').classify
91
+ ].join('::')
92
+ end
93
+ end
94
+
95
+ def set_type
96
+ # TODO: check with a better internet connection a better regex on rubular.com
97
+ self._type = get_type
98
+ end
99
+ end
@@ -0,0 +1,3 @@
1
+ class Product::NewProduct < Product
2
+
3
+ end
@@ -0,0 +1,29 @@
1
+ module Product::ProjectManagement
2
+ extend ActiveSupport::Concern
3
+
4
+ included do
5
+ has_many :stories, dependent: :nullify
6
+ end
7
+
8
+ module ClassMethods
9
+ def stories(id, user, page)
10
+ collection = if id == 'no-name'
11
+ Story.exists(_type: false)
12
+ else
13
+ product = Product.find(id)
14
+
15
+ begin
16
+ product.story_class.for_user(user)
17
+ rescue NotImplementedError
18
+ product.story_class
19
+ end
20
+ end
21
+
22
+ collection.where(:users_without_tasks_ids.ne => user.id)#.page(page).per(1)
23
+ end
24
+ end
25
+
26
+ def projects; Project.where(product_id: id); end
27
+
28
+ def story_class; "#{self.class.name}::Story".constantize rescue Story; end
29
+ end
@@ -0,0 +1,13 @@
1
+ class Profession < ActiveRecord::Base
2
+ include Applicat::Mvc::Model::Resource::Base
3
+
4
+ has_many :users
5
+
6
+ validates :name, presence: true, uniqueness: true
7
+
8
+ attr_accessible :name
9
+
10
+ extend FriendlyId
11
+
12
+ friendly_id :name, :use => :slugged
13
+ end
@@ -0,0 +1,66 @@
1
+ class Project < ActiveRecord::Base
2
+ belongs_to :user
3
+ belongs_to :organization
4
+
5
+ has_many :project_users, dependent: :destroy
6
+ has_many :vacancies, dependent: :destroy
7
+ has_many :roles, through: :project_users
8
+ has_many :comments, as: :commentable, dependent: :destroy
9
+
10
+ has_and_belongs_to_many :users
11
+ has_and_belongs_to_many :areas
12
+
13
+ accepts_nested_attributes_for :areas, allow_destroy: true
14
+
15
+ validates :user_id, presence: true
16
+ validates :name, presence: true, uniqueness: true
17
+ validates :text, presence: true
18
+ validates :area_ids, presence: true
19
+
20
+ attr_accessible :organization_id, :product_id, :name, :text, :url, :area_ids
21
+
22
+ extend FriendlyId
23
+
24
+ before_validation :include_areas_of_product
25
+ after_create :create_project_user
26
+ after_destroy :destroy_non_active_records
27
+
28
+ friendly_id :name, use: :slugged
29
+
30
+ PARENT_TYPES = ['area', 'product', 'user']
31
+
32
+ # belongs_to (Mongo DB)
33
+ def product
34
+ product_id.blank? ? nil : Product.find(product_id)
35
+ end
36
+
37
+ # has_many (Mongo DB)
38
+ def story_class
39
+ if product_id.present?
40
+ "#{product.class.name}::Story".constantize rescue Story
41
+ else
42
+ Story
43
+ end
44
+ end
45
+
46
+ def stories; story_class.where(project_id: id); end
47
+
48
+ private
49
+
50
+ def include_areas_of_product
51
+ self.area_ids ||= []
52
+
53
+ if product
54
+ self.area_ids += product.areas.map(&:id)
55
+ self.area_ids.uniq!
56
+ end
57
+ end
58
+
59
+ def create_project_user
60
+ ProjectUser.create(project_id: id, user_id: user_id)
61
+ end
62
+
63
+ def destroy_non_active_records
64
+ stories.all.map(&:destroy)
65
+ end
66
+ end
@@ -0,0 +1,13 @@
1
+ class ProjectUser < ActiveRecord::Base#
2
+ self.table_name = 'projects_users'
3
+
4
+ belongs_to :project
5
+ belongs_to :vacancy
6
+ belongs_to :user
7
+ belongs_to :role
8
+
9
+ validates :project_id, presence: true
10
+ validates :user_id, presence: true, uniqueness: { scope: [:project_id, :vacancy_id] }
11
+
12
+ attr_accessible :project_id, :vacancy_id, :user_id, :role_id
13
+ end
@@ -0,0 +1,55 @@
1
+ class Result
2
+ include Mongoid::Document
3
+ include Mongoid::Timestamps
4
+ #include Mongoid::History::Trackable
5
+
6
+ include Model::MongoDb::Customizable
7
+ include Model::MongoDb::Commentable
8
+
9
+ #embedded_in :task
10
+ belongs_to :task
11
+
12
+ # cached associations
13
+ belongs_to :story
14
+
15
+ field :offeror_id, type: Integer
16
+ field :user_id, type: Integer
17
+ field :name, type: String
18
+ field :text, type: String
19
+ field :state, type: String
20
+
21
+ attr_accessible :task_id, :name, :text
22
+
23
+ validates :task_id, presence: true
24
+ validates :story_id, presence: true
25
+ validates :offeror_id, presence: true
26
+ validates :text, presence: true
27
+
28
+ after_initialize :cache_associations
29
+ before_validation :cache_associations
30
+ after_create :set_tasks_result_association
31
+ after_destroy :unset_tasks_result_association
32
+
33
+ #track_history on: [:name, :text, :state], scope: :task
34
+
35
+ # belongs_to (SQL)
36
+ def offeror; offeror_id ? User.find(offeror_id) : nil; end
37
+ def offeror=(value); self.offeror_id = value.id; end
38
+
39
+ def user; user_id ? User.find(user_id) : nil; end
40
+ def user=(value); self.user_id = value.id; end
41
+
42
+ private
43
+
44
+ def cache_associations
45
+ self.story_id = task.story_id if task_id.present? && (task rescue nil)
46
+ self.offeror_id = task.offeror_id if task_id.present? && (task rescue nil)
47
+ end
48
+
49
+ def cache_product_association
50
+ self.product_id = task.product_id if task_id.present? && (task rescue nil)
51
+ end
52
+
53
+ def set_tasks_result_association; task.update_attribute(:result_id, id); end
54
+ def unset_tasks_result_association; task.update_attribute(:result_id, nil); end
55
+ end