decidim 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of decidim might be problematic. Click here for more details.

Files changed (439) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +12 -0
  3. data/Dockerfile +2 -0
  4. data/Gemfile.lock +80 -54
  5. data/README.md +15 -2
  6. data/decidim-admin/app/assets/javascripts/decidim/admin/application.js.es6 +3 -2
  7. data/decidim-admin/app/assets/javascripts/decidim/admin/tab_focus.js.es6 +1 -1
  8. data/decidim-admin/app/assets/stylesheets/decidim/admin/_foundation_and_overrides.scss +1 -1
  9. data/decidim-admin/app/commands/decidim/admin/{create_participatory_process_attachment.rb → create_attachment.rb} +6 -7
  10. data/decidim-admin/app/commands/decidim/admin/create_participatory_process.rb +12 -3
  11. data/decidim-admin/app/commands/decidim/admin/{update_participatory_process_attachment.rb → update_attachment.rb} +7 -6
  12. data/decidim-admin/app/commands/decidim/admin/update_feature.rb +2 -1
  13. data/decidim-admin/app/commands/decidim/admin/update_organization.rb +1 -0
  14. data/decidim-admin/app/commands/decidim/admin/update_participatory_process.rb +16 -4
  15. data/decidim-admin/app/constraints/decidim/admin/organization_dashboard_constraint.rb +1 -1
  16. data/decidim-admin/app/controllers/decidim/admin/application_controller.rb +2 -2
  17. data/decidim-admin/app/controllers/decidim/admin/concerns/has_attachments.rb +116 -0
  18. data/decidim-admin/app/controllers/decidim/admin/participatory_process_attachments_controller.rb +5 -67
  19. data/decidim-admin/app/controllers/decidim/admin/users_controller.rb +5 -5
  20. data/decidim-admin/app/forms/decidim/admin/{participatory_process_attachment_form.rb → attachment_form.rb} +2 -2
  21. data/decidim-admin/app/forms/decidim/admin/feature_form.rb +1 -0
  22. data/decidim-admin/app/forms/decidim/admin/organization_form.rb +1 -0
  23. data/decidim-admin/app/forms/decidim/admin/participatory_process_form.rb +8 -1
  24. data/decidim-admin/app/helpers/decidim/admin/application_helper.rb +1 -0
  25. data/decidim-admin/app/helpers/decidim/admin/feature_settings_helper.rb +29 -0
  26. data/decidim-admin/app/models/decidim/admin/abilities/admin_user.rb +4 -4
  27. data/decidim-admin/app/models/decidim/admin/abilities/base.rb +3 -3
  28. data/decidim-admin/app/models/decidim/admin/abilities/participatory_process_admin.rb +15 -7
  29. data/decidim-admin/app/views/decidim/admin/{participatory_process_attachments → attachments}/_form.html.erb +0 -0
  30. data/decidim-admin/app/views/decidim/admin/attachments/edit.html.erb +9 -0
  31. data/decidim-admin/app/views/decidim/admin/attachments/index.html.erb +37 -0
  32. data/decidim-admin/app/views/decidim/admin/attachments/new.html.erb +9 -0
  33. data/decidim-admin/app/views/decidim/admin/attachments/show.html.erb +25 -0
  34. data/decidim-admin/app/views/decidim/admin/features/_form.html.erb +1 -0
  35. data/decidim-admin/app/views/decidim/admin/features/_settings_fields.html.erb +6 -3
  36. data/decidim-admin/app/views/decidim/admin/organization/_form.html.erb +4 -0
  37. data/decidim-admin/app/views/decidim/admin/participatory_processes/_form.html.erb +16 -0
  38. data/decidim-admin/app/views/decidim/admin/participatory_processes/show.html.erb +11 -1
  39. data/decidim-admin/app/views/layouts/decidim/admin/_header.html.erb +2 -2
  40. data/decidim-admin/app/views/layouts/decidim/admin/_sidebar.html.erb +1 -1
  41. data/decidim-admin/app/views/layouts/decidim/admin/participatory_process.html.erb +2 -2
  42. data/decidim-admin/config/locales/ca.yml +29 -27
  43. data/decidim-admin/config/locales/en.yml +29 -27
  44. data/decidim-admin/config/locales/es.yml +29 -27
  45. data/decidim-admin/config/routes.rb +1 -1
  46. data/decidim-admin/db/migrate/20170128112958_change_user_groups_verified_to_timestamp.rb +9 -0
  47. data/decidim-admin/decidim-admin.gemspec +0 -1
  48. data/decidim-admin/lib/decidim/admin/engine.rb +2 -2
  49. data/decidim-admin/lib/decidim/admin/test/manage_attachments_examples.rb +103 -0
  50. data/decidim-admin/spec/commands/create_category_spec.rb +1 -1
  51. data/decidim-admin/spec/commands/create_feature_spec.rb +1 -1
  52. data/decidim-admin/spec/commands/create_participatory_process_spec.rb +32 -2
  53. data/decidim-admin/spec/commands/create_static_page_spec.rb +1 -1
  54. data/decidim-admin/spec/commands/destroy_category_spec.rb +1 -1
  55. data/decidim-admin/spec/commands/destroy_feature_spec.rb +2 -2
  56. data/decidim-admin/spec/commands/destroy_participatory_process_step_spec.rb +1 -1
  57. data/decidim-admin/spec/commands/update_category_spec.rb +1 -1
  58. data/decidim-admin/spec/commands/update_feature_spec.rb +3 -1
  59. data/decidim-admin/spec/commands/update_organization_spec.rb +12 -2
  60. data/decidim-admin/spec/commands/update_static_page_spec.rb +1 -1
  61. data/decidim-admin/spec/features/admin_manages_organization_admins_spec.rb +1 -1
  62. data/decidim-admin/spec/features/admin_manages_organization_scopes_spec.rb +1 -1
  63. data/decidim-admin/spec/features/admin_manages_participatory_processes_spec.rb +1 -1
  64. data/decidim-admin/spec/features/static_pages_spec.rb +1 -1
  65. data/decidim-admin/spec/forms/participatory_process_form_spec.rb +32 -2
  66. data/decidim-admin/spec/forms/participatory_process_step_form_spec.rb +3 -3
  67. data/decidim-admin/spec/forms/scope_form_spec.rb +2 -2
  68. data/decidim-admin/spec/forms/static_page_form_spec.rb +2 -2
  69. data/decidim-admin/spec/helpers/feature_settings_helper_spec.rb +56 -0
  70. data/decidim-admin/spec/models/abilities/admin_user_spec.rb +7 -6
  71. data/decidim-admin/spec/models/abilities/participatory_process_admin_spec.rb +5 -8
  72. data/decidim-admin/spec/shared/manage_process_admins_examples.rb +1 -1
  73. data/decidim-admin/spec/shared/manage_process_attachments_examples.rb +4 -94
  74. data/decidim-admin/spec/shared/manage_process_categories_examples.rb +2 -1
  75. data/decidim-admin/spec/shared/manage_process_steps_examples.rb +1 -1
  76. data/decidim-admin/spec/shared/manage_processes_examples.rb +4 -3
  77. data/decidim-admin/spec/views/decidim/static_pages/_form.html.erb_spec.rb +2 -2
  78. data/decidim-api/app/views/layouts/decidim/api/documentation.html.erb +1 -1
  79. data/decidim-api/decidim-api.gemspec +1 -1
  80. data/decidim-api/lib/decidim/api.rb +1 -0
  81. data/decidim-api/lib/decidim/api/schema.rb +5 -0
  82. data/decidim-api/lib/decidim/api/test/type_context.rb +1 -0
  83. data/decidim-api/lib/decidim/api/types/author_interface.rb +13 -0
  84. data/decidim-api/spec/types/query_type_spec.rb +1 -1
  85. data/decidim-api/spec/types/translated_field_type_spec.rb +1 -1
  86. data/decidim-budgets/.gitignore +7 -0
  87. data/decidim-budgets/README.md +23 -0
  88. data/decidim-budgets/Rakefile +2 -0
  89. data/decidim-budgets/app/assets/config/decidim_budgets_manifest.js +1 -0
  90. data/decidim-budgets/app/assets/images/decidim/budgets/icon.svg +4 -0
  91. data/decidim-budgets/app/assets/javascripts/decidim/budgets/projects.js.es6 +28 -0
  92. data/decidim-budgets/app/assets/stylesheets/decidim/budgets/_budgets.scss +1 -0
  93. data/decidim-budgets/app/assets/stylesheets/decidim/budgets/budget/_budget-list.scss +32 -0
  94. data/decidim-budgets/app/assets/stylesheets/decidim/budgets/budget/_budget-meter.scss +78 -0
  95. data/decidim-budgets/app/assets/stylesheets/decidim/budgets/budget/_progress.scss +17 -0
  96. data/decidim-budgets/app/commands/decidim/budgets/add_line_item.rb +43 -0
  97. data/decidim-budgets/app/commands/decidim/budgets/admin/create_project.rb +52 -0
  98. data/decidim-budgets/app/commands/decidim/budgets/admin/update_project.rb +56 -0
  99. data/decidim-budgets/app/commands/decidim/budgets/cancel_order.rb +36 -0
  100. data/decidim-budgets/app/commands/decidim/budgets/checkout.rb +34 -0
  101. data/decidim-budgets/app/commands/decidim/budgets/remove_line_item.rb +35 -0
  102. data/decidim-budgets/app/controllers/concerns/decidim/budgets/needs_current_order.rb +27 -0
  103. data/decidim-budgets/app/controllers/decidim/budgets/admin/application_controller.rb +14 -0
  104. data/decidim-budgets/app/controllers/decidim/budgets/admin/projects_controller.rb +69 -0
  105. data/decidim-budgets/app/controllers/decidim/budgets/application_controller.rb +13 -0
  106. data/decidim-budgets/app/controllers/decidim/budgets/line_items_controller.rb +43 -0
  107. data/decidim-budgets/app/controllers/decidim/budgets/orders_controller.rb +38 -0
  108. data/decidim-budgets/app/controllers/decidim/budgets/projects_controller.rb +44 -0
  109. data/decidim-budgets/app/forms/decidim/budgets/admin/project_form.rb +44 -0
  110. data/decidim-budgets/app/helpers/decidim/budgets/application_helper.rb +12 -0
  111. data/decidim-budgets/app/helpers/decidim/budgets/projects_helper.rb +29 -0
  112. data/decidim-budgets/app/models/decidim/budgets/application_record.rb +9 -0
  113. data/decidim-budgets/app/models/decidim/budgets/line_item.rb +20 -0
  114. data/decidim-budgets/app/models/decidim/budgets/order.rb +52 -0
  115. data/decidim-budgets/app/models/decidim/budgets/project.rb +15 -0
  116. data/decidim-budgets/app/services/decidim/budgets/project_search.rb +58 -0
  117. data/decidim-budgets/app/views/decidim/budgets/admin/projects/_form.html.erb +31 -0
  118. data/decidim-budgets/app/views/decidim/budgets/admin/projects/edit.html.erb +9 -0
  119. data/decidim-budgets/app/views/decidim/budgets/admin/projects/index.html.erb +27 -0
  120. data/{decidim-admin/app/views/decidim/admin/participatory_process_attachments → decidim-budgets/app/views/decidim/budgets/admin/projects}/new.html.erb +0 -0
  121. data/decidim-budgets/app/views/decidim/budgets/line_items/update_budget.js.erb +21 -0
  122. data/decidim-budgets/app/views/decidim/budgets/projects/_budget_confirm.html.erb +30 -0
  123. data/decidim-budgets/app/views/decidim/budgets/projects/_budget_excess.html.erb +14 -0
  124. data/decidim-budgets/app/views/decidim/budgets/projects/_budget_summary.html.erb +46 -0
  125. data/decidim-budgets/app/views/decidim/budgets/projects/_count.html.erb +1 -0
  126. data/decidim-budgets/app/views/decidim/budgets/projects/_filters.html.erb +24 -0
  127. data/decidim-budgets/app/views/decidim/budgets/projects/_linked_projects.html.erb +12 -0
  128. data/decidim-budgets/app/views/decidim/budgets/projects/_order_progress.html.erb +34 -0
  129. data/decidim-budgets/app/views/decidim/budgets/projects/_order_selected_projects.html.erb +25 -0
  130. data/decidim-budgets/app/views/decidim/budgets/projects/_order_total_budget.html.erb +1 -0
  131. data/decidim-budgets/app/views/decidim/budgets/projects/_project.html.erb +40 -0
  132. data/decidim-budgets/app/views/decidim/budgets/projects/_project_budget_button.html.erb +9 -0
  133. data/decidim-budgets/app/views/decidim/budgets/projects/_projects.html.erb +8 -0
  134. data/decidim-budgets/app/views/decidim/budgets/projects/_tags.html.erb +10 -0
  135. data/decidim-budgets/app/views/decidim/budgets/projects/index.html.erb +26 -0
  136. data/decidim-budgets/app/views/decidim/budgets/projects/index.js.erb +2 -0
  137. data/decidim-budgets/app/views/decidim/budgets/projects/show.html.erb +48 -0
  138. data/decidim-budgets/bin/rails +14 -0
  139. data/decidim-budgets/config/i18n-tasks.yml +4 -0
  140. data/decidim-budgets/config/locales/ca.yml +84 -0
  141. data/decidim-budgets/config/locales/en.yml +95 -0
  142. data/decidim-budgets/config/locales/es.yml +84 -0
  143. data/decidim-budgets/db/migrate/20170127114122_create_projects.rb +15 -0
  144. data/decidim-budgets/db/migrate/20170130095615_create_orders.rb +13 -0
  145. data/decidim-budgets/db/migrate/20170130101825_create_line_items.rb +10 -0
  146. data/decidim-budgets/decidim-budgets.gemspec +24 -0
  147. data/decidim-budgets/lib/decidim/budgets.rb +11 -0
  148. data/decidim-budgets/lib/decidim/budgets/admin.rb +9 -0
  149. data/decidim-budgets/lib/decidim/budgets/admin_engine.rb +22 -0
  150. data/decidim-budgets/lib/decidim/budgets/feature.rb +59 -0
  151. data/decidim-budgets/lib/decidim/budgets/list_engine.rb +30 -0
  152. data/decidim-budgets/lib/decidim/budgets/test/factories.rb +43 -0
  153. data/decidim-budgets/spec/commands/add_line_item_spec.rb +48 -0
  154. data/decidim-budgets/spec/commands/cancel_order_spec.rb +42 -0
  155. data/decidim-budgets/spec/commands/checkout_spec.rb +45 -0
  156. data/decidim-budgets/spec/commands/create_project_spec.rb +72 -0
  157. data/decidim-budgets/spec/commands/remove_line_item_spec.rb +31 -0
  158. data/decidim-budgets/spec/commands/update_project_spec.rb +65 -0
  159. data/decidim-budgets/spec/factories.rb +4 -0
  160. data/decidim-budgets/spec/features/admin_manages_projects_spec.rb +16 -0
  161. data/decidim-budgets/spec/features/orders_spec.rb +149 -0
  162. data/decidim-budgets/spec/features/process_admin_manages_projects_spec.rb +17 -0
  163. data/decidim-budgets/spec/forms/project_form_spec.rb +115 -0
  164. data/decidim-budgets/spec/models/line_item_spec.rb +35 -0
  165. data/decidim-budgets/spec/models/order_spec.rb +45 -0
  166. data/decidim-budgets/spec/models/project_spec.rb +30 -0
  167. data/decidim-budgets/spec/services/project_search_spec.rb +97 -0
  168. data/decidim-budgets/spec/shared/admin_shared_context.rb +11 -0
  169. data/decidim-budgets/spec/shared/manage_projects_examples.rb +104 -0
  170. data/decidim-budgets/spec/spec_helper.rb +2 -0
  171. data/decidim-comments/app/assets/javascripts/decidim/comments/bundle.js +0 -0
  172. data/decidim-comments/app/commands/decidim/comments/create_comment.rb +2 -1
  173. data/decidim-comments/app/forms/decidim/comments/comment_form.rb +1 -0
  174. data/decidim-comments/app/frontend/application/apollo_client.js +1 -1
  175. data/decidim-comments/app/frontend/application/application.component.jsx +1 -1
  176. data/decidim-comments/app/frontend/comments/add_comment_form.component.jsx +76 -20
  177. data/decidim-comments/app/frontend/comments/add_comment_form.component.test.jsx +77 -22
  178. data/decidim-comments/app/frontend/comments/add_comment_form.fragment.graphql +6 -0
  179. data/decidim-comments/app/frontend/comments/add_comment_form.mutation.graphql +2 -2
  180. data/decidim-comments/app/frontend/comments/comment.component.jsx +15 -15
  181. data/decidim-comments/app/frontend/comments/comment.component.test.jsx +42 -41
  182. data/decidim-comments/app/frontend/comments/comment_order_selector.component.jsx +1 -1
  183. data/decidim-comments/app/frontend/comments/comment_thread.component.jsx +7 -7
  184. data/decidim-comments/app/frontend/comments/comment_thread.component.test.jsx +21 -19
  185. data/decidim-comments/app/frontend/comments/comments.component.jsx +21 -17
  186. data/decidim-comments/app/frontend/comments/comments.component.test.jsx +47 -32
  187. data/decidim-comments/app/frontend/comments/comments.query.graphql +6 -3
  188. data/decidim-comments/app/frontend/comments/down_vote_button.component.jsx +21 -10
  189. data/decidim-comments/app/frontend/comments/up_vote_button.component.jsx +23 -12
  190. data/decidim-comments/app/frontend/comments/vote_button.component.jsx +15 -7
  191. data/decidim-comments/app/frontend/comments/vote_button_component.test.jsx +7 -2
  192. data/decidim-comments/app/frontend/entry.js +1 -8
  193. data/decidim-comments/app/frontend/support/generate_user_data.js +13 -0
  194. data/decidim-comments/app/frontend/support/generate_user_group_data.js +14 -0
  195. data/decidim-comments/app/helpers/decidim/comments/comments_helper.rb +10 -15
  196. data/decidim-comments/app/models/decidim/comments/comment.rb +5 -7
  197. data/decidim-comments/app/types/decidim/comments/comment_type.rb +5 -1
  198. data/decidim-comments/config/locales/ca.yml +5 -1
  199. data/decidim-comments/config/locales/en.yml +4 -1
  200. data/decidim-comments/config/locales/es.yml +5 -1
  201. data/decidim-comments/db/migrate/20170123102043_add_user_group_id_to_comments.rb +5 -0
  202. data/decidim-comments/decidim-comments.gemspec +0 -1
  203. data/decidim-comments/lib/decidim/comments/engine.rb +0 -1
  204. data/decidim-comments/lib/decidim/comments/mutation_extensions.rb +2 -1
  205. data/decidim-comments/spec/commands/create_comment_spec.rb +6 -3
  206. data/decidim-comments/spec/commands/vote_comment_spec.rb +4 -4
  207. data/decidim-comments/spec/features/comments_spec.rb +27 -3
  208. data/decidim-comments/spec/forms/comment_form_spec.rb +6 -3
  209. data/decidim-comments/spec/models/comment_spec.rb +25 -32
  210. data/decidim-comments/spec/queries/comments_with_replies_spec.rb +2 -2
  211. data/decidim-comments/spec/types/comment_type_spec.rb +2 -2
  212. data/decidim-comments/spec/types/query_type_spec.rb +5 -5
  213. data/decidim-dev/app/views/decidim/dummy_resource/_linked_dummys.html.erb +5 -0
  214. data/decidim-dev/config/locales/en.yml +5 -0
  215. data/decidim-dev/decidim-dev.gemspec +3 -3
  216. data/decidim-dev/lib/decidim/dev/assets/avatar.jpg +0 -0
  217. data/decidim-dev/lib/decidim/dev/assets/icon.png +0 -0
  218. data/decidim-dev/lib/decidim/dev/test/base_spec_helper.rb +1 -0
  219. data/decidim-dev/lib/decidim/dev/test/rspec_support/action_mailer.rb +1 -1
  220. data/decidim-dev/lib/decidim/dev/test/rspec_support/engine_routes.rb +9 -5
  221. data/decidim-dev/lib/decidim/dev/test/rspec_support/feature.rb +24 -0
  222. data/decidim-meetings/app/assets/config/decidim_meetings_manifest.js +2 -0
  223. data/decidim-meetings/app/assets/javascripts/decidim/meetings/map.js.es6.erb +92 -0
  224. data/decidim-meetings/app/assets/stylesheets/decidim/meetings/map.css +1 -0
  225. data/decidim-meetings/app/commands/decidim/meetings/admin/close_meeting.rb +53 -0
  226. data/decidim-meetings/app/commands/decidim/meetings/admin/create_meeting.rb +15 -3
  227. data/decidim-meetings/app/commands/decidim/meetings/admin/update_meeting.rb +15 -3
  228. data/decidim-meetings/app/controllers/decidim/meetings/admin/application_controller.rb +9 -0
  229. data/decidim-meetings/app/controllers/decidim/meetings/admin/attachments_controller.rb +29 -0
  230. data/decidim-meetings/app/controllers/decidim/meetings/admin/meeting_closes_controller.rb +38 -0
  231. data/decidim-meetings/app/controllers/decidim/meetings/admin/meetings_controller.rb +0 -12
  232. data/decidim-meetings/app/controllers/decidim/meetings/meetings_controller.rb +11 -9
  233. data/decidim-meetings/app/forms/decidim/meetings/admin/close_meeting_form.rb +31 -0
  234. data/decidim-meetings/app/forms/decidim/meetings/admin/meeting_form.rb +0 -2
  235. data/decidim-meetings/app/helpers/decidim/meetings/admin/application_helper.rb +12 -0
  236. data/decidim-meetings/app/helpers/decidim/meetings/application_helper.rb +1 -0
  237. data/decidim-meetings/app/helpers/decidim/meetings/map_helper.rb +46 -0
  238. data/decidim-meetings/app/models/decidim/meetings/meeting.rb +11 -15
  239. data/decidim-meetings/app/services/decidim/meetings/meeting_search.rb +0 -1
  240. data/decidim-meetings/app/services/decidim/meetings/static_map_generator.rb +50 -0
  241. data/decidim-meetings/app/views/decidim/meetings/admin/meeting_closes/_form.html.erb +23 -0
  242. data/decidim-meetings/app/views/decidim/meetings/admin/meeting_closes/edit.html.erb +9 -0
  243. data/decidim-meetings/app/views/decidim/meetings/admin/meetings/_form.html.erb +2 -6
  244. data/decidim-meetings/app/views/decidim/meetings/admin/meetings/index.html.erb +14 -0
  245. data/decidim-meetings/app/views/decidim/meetings/meetings/_datetime.html.erb +8 -0
  246. data/decidim-meetings/app/views/decidim/meetings/meetings/_filters.html.erb +2 -2
  247. data/decidim-meetings/app/views/decidim/meetings/meetings/_filters_small_view.html.erb +18 -0
  248. data/decidim-meetings/app/views/decidim/meetings/meetings/_linked_meetings.html.erb +22 -0
  249. data/decidim-meetings/app/views/decidim/meetings/meetings/_meetings.html.erb +3 -10
  250. data/decidim-meetings/app/views/decidim/meetings/meetings/index.html.erb +42 -0
  251. data/decidim-meetings/app/views/decidim/meetings/meetings/index.js.erb +6 -0
  252. data/decidim-meetings/app/views/decidim/meetings/meetings/show.html.erb +33 -7
  253. data/decidim-meetings/bin/rails +1 -1
  254. data/decidim-meetings/config/i18n-tasks.yml +2 -0
  255. data/decidim-meetings/config/locales/ca.yml +37 -4
  256. data/decidim-meetings/config/locales/en.yml +34 -1
  257. data/decidim-meetings/config/locales/es.yml +36 -3
  258. data/decidim-meetings/db/migrate/20170110142105_close_a_meeting.rb +9 -0
  259. data/decidim-meetings/db/migrate/20170123151650_add_latitude_and_longitude_to_meetings.rb +6 -0
  260. data/decidim-meetings/db/migrate/20170129153716_remove_short_description_from_meetings.rb +5 -0
  261. data/decidim-meetings/decidim-meetings.gemspec +7 -0
  262. data/decidim-meetings/lib/decidim/meetings/admin_engine.rb +31 -1
  263. data/decidim-meetings/lib/decidim/meetings/feature.rb +20 -6
  264. data/decidim-meetings/lib/decidim/meetings/list_engine.rb +10 -1
  265. data/decidim-meetings/lib/decidim/meetings/seeds/Exampledocument.pdf +0 -0
  266. data/decidim-meetings/lib/decidim/meetings/seeds/city.jpeg +0 -0
  267. data/decidim-meetings/lib/decidim/meetings/test/factories.rb +23 -0
  268. data/decidim-meetings/spec/commands/close_meeting_spec.rb +78 -0
  269. data/decidim-meetings/spec/commands/create_meeting_spec.rb +22 -3
  270. data/decidim-meetings/spec/commands/update_meeting_spec.rb +32 -3
  271. data/decidim-meetings/spec/controllers/meetings_controller_spec.rb +41 -0
  272. data/decidim-meetings/spec/factories.rb +3 -13
  273. data/decidim-meetings/spec/features/admin_manages_meetings_attachments_spec.rb +10 -0
  274. data/decidim-meetings/spec/features/explore_meetings_spec.rb +55 -1
  275. data/decidim-meetings/spec/features/process_admin_manages_meetings_attachments_spec.rb +12 -0
  276. data/decidim-meetings/spec/forms/close_meeting_form_spec.rb +90 -0
  277. data/decidim-meetings/spec/forms/meeting_form_spec.rb +1 -7
  278. data/decidim-meetings/spec/models/meeting_spec.rb +42 -24
  279. data/decidim-meetings/spec/services/meeting_search_spec.rb +1 -17
  280. data/decidim-meetings/spec/services/static_map_generator_spec.rb +33 -0
  281. data/decidim-meetings/spec/shared/manage_attachments_examples.rb +17 -0
  282. data/decidim-meetings/spec/shared/manage_meetings_examples.rb +58 -8
  283. data/decidim-meetings/spec/spec_helper.rb +5 -0
  284. data/decidim-meetings/spec/support/geocoder.rb +7 -0
  285. data/decidim-meetings/vendor/assets/javascripts/leaflet-svg-icon.js +179 -0
  286. data/decidim-meetings/vendor/assets/javascripts/leaflet-tilelayer-here.js +166 -0
  287. data/decidim-meetings/vendor/assets/javascripts/leaflet.js +9 -0
  288. data/decidim-meetings/vendor/assets/stylesheets/leaflet.css +624 -0
  289. data/decidim-pages/app/models/decidim/pages/page.rb +10 -1
  290. data/decidim-pages/app/views/decidim/pages/application/show.html.erb +2 -1
  291. data/decidim-pages/spec/commands/create_page_spec.rb +2 -2
  292. data/decidim-pages/spec/commands/destroy_page_spec.rb +1 -1
  293. data/decidim-pages/spec/commands/update_page_spec.rb +1 -1
  294. data/decidim-pages/spec/factories.rb +1 -1
  295. data/decidim-pages/spec/features/admin_spec.rb +1 -0
  296. data/decidim-pages/spec/models/page_spec.rb +15 -0
  297. data/decidim-proposals/app/assets/stylesheets/decidim/proposals/social_share.css.scss +5 -0
  298. data/decidim-proposals/app/commands/decidim/proposals/admin/answer_proposal.rb +43 -0
  299. data/decidim-proposals/app/commands/decidim/proposals/create_proposal.rb +1 -0
  300. data/decidim-proposals/app/controllers/decidim/proposals/admin/proposal_answers_controller.rb +37 -0
  301. data/decidim-proposals/app/controllers/decidim/proposals/admin/proposals_controller.rb +1 -0
  302. data/decidim-proposals/app/controllers/decidim/proposals/proposal_votes_controller.rb +18 -7
  303. data/decidim-proposals/app/controllers/decidim/proposals/proposals_controller.rb +8 -7
  304. data/decidim-proposals/app/forms/decidim/proposals/admin/proposal_answer_form.rb +18 -0
  305. data/decidim-proposals/app/forms/decidim/proposals/proposal_form.rb +1 -0
  306. data/decidim-proposals/app/helpers/decidim/proposals/application_helper.rb +17 -0
  307. data/decidim-proposals/app/helpers/decidim/proposals/proposal_votes_helper.rb +19 -0
  308. data/decidim-proposals/app/models/decidim/proposals/abilities/current_user.rb +59 -0
  309. data/decidim-proposals/app/models/decidim/proposals/proposal.rb +30 -33
  310. data/decidim-proposals/app/models/decidim/proposals/proposal_vote.rb +2 -0
  311. data/decidim-proposals/app/services/decidim/proposals/proposal_search.rb +11 -0
  312. data/decidim-proposals/app/views/decidim/proposals/admin/proposal_answers/edit.html.erb +15 -0
  313. data/decidim-proposals/app/views/decidim/proposals/admin/proposals/index.html.erb +8 -0
  314. data/decidim-proposals/app/views/decidim/proposals/proposal_votes/update_buttons_and_counters.js.erb +20 -0
  315. data/decidim-proposals/app/views/decidim/proposals/proposals/_filters.html.erb +3 -1
  316. data/decidim-proposals/app/views/decidim/proposals/proposals/_filters_small_view.html.erb +18 -0
  317. data/decidim-proposals/app/views/decidim/proposals/proposals/_linked_proposals.html.erb +27 -0
  318. data/decidim-proposals/app/views/decidim/proposals/proposals/_proposal.html.erb +3 -2
  319. data/decidim-proposals/app/views/decidim/proposals/proposals/_proposal_badge.html.erb +3 -0
  320. data/decidim-proposals/app/views/decidim/proposals/proposals/_remaining_votes_count.html.erb +1 -0
  321. data/decidim-proposals/app/views/decidim/proposals/proposals/_share.html.erb +1 -1
  322. data/decidim-proposals/app/views/decidim/proposals/proposals/_vote_button.html.erb +16 -4
  323. data/decidim-proposals/app/views/decidim/proposals/proposals/_votes_limit.html.erb +23 -0
  324. data/decidim-proposals/app/views/decidim/proposals/proposals/index.html.erb +13 -3
  325. data/decidim-proposals/app/views/decidim/proposals/proposals/new.html.erb +6 -0
  326. data/decidim-proposals/app/views/decidim/proposals/proposals/show.html.erb +15 -2
  327. data/decidim-proposals/config/i18n-tasks.yml +3 -0
  328. data/decidim-proposals/config/locales/ca.yml +54 -1
  329. data/decidim-proposals/config/locales/en.yml +54 -0
  330. data/decidim-proposals/config/locales/es.yml +54 -1
  331. data/decidim-proposals/db/migrate/20170120151202_add_user_group_id_to_proposals.rb +5 -0
  332. data/decidim-proposals/db/migrate/20170131092413_add_answers_to_proposals.rb +7 -0
  333. data/decidim-proposals/decidim-proposals.gemspec +3 -0
  334. data/decidim-proposals/lib/decidim/proposals/admin_engine.rb +3 -1
  335. data/decidim-proposals/lib/decidim/proposals/engine.rb +7 -1
  336. data/decidim-proposals/lib/decidim/proposals/feature.rb +28 -1
  337. data/decidim-proposals/lib/decidim/proposals/test/factories.rb +83 -0
  338. data/decidim-proposals/spec/commands/decidim/proposals/admin_create_proposal_spec.rb +14 -0
  339. data/decidim-proposals/spec/commands/decidim/proposals/answer_proposal_spec.rb +53 -0
  340. data/decidim-proposals/spec/commands/decidim/proposals/create_proposal_spec.rb +3 -56
  341. data/decidim-proposals/spec/controllers/decidim/admin/proposal_answers_controller_spec.rb +45 -0
  342. data/decidim-proposals/spec/controllers/decidim/proposal_votes_controller_spec.rb +113 -0
  343. data/decidim-proposals/spec/controllers/decidim/proposals_controller_spec.rb +53 -0
  344. data/decidim-proposals/spec/factories.rb +1 -23
  345. data/decidim-proposals/spec/features/proposals_spec.rb +201 -38
  346. data/decidim-proposals/spec/features/vote_proposal_spec.rb +83 -11
  347. data/decidim-proposals/spec/forms/decidim/proposals/admin_proposal_form_spec.rb +13 -0
  348. data/decidim-proposals/spec/forms/decidim/proposals/proposal_answer_form_spec.rb +50 -0
  349. data/decidim-proposals/spec/forms/decidim/proposals/proposal_form_spec.rb +5 -93
  350. data/decidim-proposals/spec/helpers/application_helper_spec.rb +33 -0
  351. data/decidim-proposals/spec/helpers/proposal_votes_helper_spec.rb +53 -0
  352. data/decidim-proposals/spec/lib/decidim/proposals/feature_spec.rb +1 -1
  353. data/decidim-proposals/spec/models/decidim/proposals/proposal_spec.rb +21 -19
  354. data/decidim-proposals/spec/models/decidim/proposals/proposal_vote_spec.rb +19 -1
  355. data/decidim-proposals/spec/services/decidim/proposals/proposal_search_spec.rb +66 -25
  356. data/decidim-proposals/spec/shared/create_proposal_examples.rb +69 -0
  357. data/decidim-proposals/spec/shared/manage_proposals_examples.rb +49 -0
  358. data/decidim-proposals/spec/shared/proposal_form_examples.rb +100 -0
  359. data/decidim-results/.gitignore +7 -0
  360. data/decidim-results/README.md +23 -0
  361. data/decidim-results/Rakefile +2 -0
  362. data/decidim-results/app/assets/images/decidim/results/icon.svg +1 -0
  363. data/decidim-results/app/commands/decidim/results/admin/create_result.rb +65 -0
  364. data/decidim-results/app/commands/decidim/results/admin/update_result.rb +69 -0
  365. data/decidim-results/app/controllers/decidim/results/admin/application_controller.rb +14 -0
  366. data/decidim-results/app/controllers/decidim/results/admin/results_controller.rb +69 -0
  367. data/decidim-results/app/controllers/decidim/results/application_controller.rb +13 -0
  368. data/decidim-results/app/controllers/decidim/results/results_controller.rb +42 -0
  369. data/decidim-results/app/forms/decidim/results/admin/result_form.rb +40 -0
  370. data/decidim-results/app/helpers/decidim/results/application_helper.rb +11 -0
  371. data/decidim-results/app/models/decidim/results/application_record.rb +9 -0
  372. data/decidim-results/app/models/decidim/results/result.rb +15 -0
  373. data/decidim-results/app/services/decidim/results/result_search.rb +44 -0
  374. data/decidim-results/app/services/decidim/results/result_stats_calculator.rb +51 -0
  375. data/decidim-results/app/views/decidim/results/admin/results/_form.html.erb +23 -0
  376. data/decidim-results/app/views/decidim/results/admin/results/edit.html.erb +9 -0
  377. data/decidim-results/app/views/decidim/results/admin/results/index.html.erb +27 -0
  378. data/decidim-results/app/views/decidim/results/admin/results/new.html.erb +9 -0
  379. data/decidim-results/app/views/decidim/results/results/_count.html.erb +1 -0
  380. data/decidim-results/app/views/decidim/results/results/_filters.html.erb +22 -0
  381. data/decidim-results/app/views/decidim/results/results/_linked_results.html.erb +12 -0
  382. data/decidim-results/app/views/decidim/results/results/_results.html.erb +16 -0
  383. data/decidim-results/app/views/decidim/results/results/_tags.html.erb +10 -0
  384. data/decidim-results/app/views/decidim/results/results/index.html.erb +22 -0
  385. data/decidim-results/app/views/decidim/results/results/index.js.erb +2 -0
  386. data/decidim-results/app/views/decidim/results/results/show.html.erb +52 -0
  387. data/decidim-results/bin/rails +14 -0
  388. data/decidim-results/config/i18n-tasks.yml +5 -0
  389. data/decidim-results/config/locales/ca.yml +61 -0
  390. data/decidim-results/config/locales/en.yml +62 -0
  391. data/decidim-results/config/locales/es.yml +61 -0
  392. data/decidim-results/db/migrate/20170116104125_create_results.rb +14 -0
  393. data/decidim-results/db/migrate/20170129164553_remove_short_description_from_results.rb +5 -0
  394. data/decidim-results/decidim-results.gemspec +26 -0
  395. data/decidim-results/lib/decidim/results.rb +11 -0
  396. data/decidim-results/lib/decidim/results/admin.rb +9 -0
  397. data/decidim-results/lib/decidim/results/admin_engine.rb +22 -0
  398. data/decidim-results/lib/decidim/results/feature.rb +52 -0
  399. data/decidim-results/lib/decidim/results/list_engine.rb +19 -0
  400. data/decidim-results/lib/decidim/results/test/factories.rb +11 -0
  401. data/decidim-results/spec/commands/create_result_spec.rb +90 -0
  402. data/decidim-results/spec/commands/update_result_spec.rb +83 -0
  403. data/decidim-results/spec/factories.rb +6 -0
  404. data/decidim-results/spec/features/admin_manages_results_spec.rb +16 -0
  405. data/decidim-results/spec/features/explore_results_spec.rb +186 -0
  406. data/decidim-results/spec/features/process_admin_manages_results_spec.rb +17 -0
  407. data/decidim-results/spec/forms/result_form_spec.rb +91 -0
  408. data/decidim-results/spec/models/result_spec.rb +18 -0
  409. data/decidim-results/spec/services/result_search_spec.rb +97 -0
  410. data/decidim-results/spec/services/result_stats_calculator_spec.rb +93 -0
  411. data/decidim-results/spec/shared/admin_shared_context.rb +11 -0
  412. data/decidim-results/spec/shared/manage_results_examples.rb +96 -0
  413. data/decidim-results/spec/spec_helper.rb +2 -0
  414. data/decidim-system/app/assets/javascripts/decidim/system/application.js.es6 +1 -3
  415. data/decidim-system/app/views/layouts/decidim/system/_header.html.erb +2 -2
  416. data/decidim-system/decidim-system.gemspec +0 -1
  417. data/decidim-system/lib/decidim/system/engine.rb +0 -1
  418. data/decidim-system/spec/features/manage_admins_spec.rb +1 -1
  419. data/decidim-system/spec/features/organizations_spec.rb +1 -1
  420. data/decidim.gemspec +2 -0
  421. data/docs/how_to_create_a_plugin.md +0 -2
  422. data/lib/decidim.rb +2 -0
  423. data/lib/generators/decidim/install_generator.rb +1 -0
  424. data/lib/generators/decidim/templates/Gemfile.erb +10 -1
  425. data/lib/generators/decidim/templates/initializer.rb +9 -0
  426. data/lib/generators/decidim/templates/secrets.yml.erb +3 -0
  427. data/lib/generators/decidim/templates/social_share_button.rb +1 -1
  428. data/package.json +2 -3
  429. data/yarn.lock +10 -8
  430. metadata +265 -32
  431. data/decidim-admin/app/helpers/decidim/admin/aria_selected_link_to_helper.rb +0 -28
  432. data/decidim-admin/app/views/decidim/admin/participatory_process_attachments/edit.html.erb +0 -9
  433. data/decidim-admin/app/views/decidim/admin/participatory_process_attachments/index.html.erb +0 -37
  434. data/decidim-admin/app/views/decidim/admin/participatory_process_attachments/show.html.erb +0 -25
  435. data/decidim-comments/app/frontend/support/generate_current_user_data.js +0 -13
  436. data/decidim-comments/app/types/decidim/comments/author_type.rb +0 -15
  437. data/decidim-comments/spec/types/author_type_spec.rb +0 -21
  438. data/decidim-dev/lib/decidim/dev/assets/avatar.svg +0 -14
  439. data/decidim-proposals/app/views/decidim/proposals/proposal_votes/create.js.erb +0 -5
@@ -4,9 +4,18 @@ module Decidim
4
4
  # The data store for a Page in the Decidim::Pages component. It stores a
5
5
  # title, description and any other useful information to render a custom page.
6
6
  class Page < Pages::ApplicationRecord
7
- validates :title, :feature, presence: true
8
7
  belongs_to :feature, foreign_key: "decidim_feature_id", class_name: Decidim::Feature
9
8
  has_one :organization, through: :feature
9
+
10
+ validates :title, :feature, presence: true
11
+ validate :feature_manifest_matches
12
+
13
+ private
14
+
15
+ def feature_manifest_matches
16
+ return unless feature
17
+ errors.add(:feature, :invalid) unless feature.manifest_name == "pages"
18
+ end
10
19
  end
11
20
  end
12
21
  end
@@ -1,4 +1,5 @@
1
- <% content_for(:title, translated_attribute(@page.title)) %>
1
+ <% content_for(:meta_title, translated_attribute(@page.title)) %>
2
+
2
3
  <div class="row column">
3
4
  <div class="row">
4
5
  <div class="columns medium-7 mediumlarge-8">
@@ -5,7 +5,7 @@ module Decidim
5
5
  module Pages
6
6
  describe CreatePage, :db do
7
7
  describe "call" do
8
- let(:feature) { create(:feature) }
8
+ let(:feature) { create(:feature, manifest_name: "pages") }
9
9
  let(:command) { described_class.new(feature) }
10
10
 
11
11
  describe "when the page is not saved" do
@@ -20,7 +20,7 @@ module Decidim
20
20
  it "doesn't create a page" do
21
21
  expect do
22
22
  command.call
23
- end.to_not change { Page.count }
23
+ end.not_to change { Page.count }
24
24
  end
25
25
  end
26
26
 
@@ -5,7 +5,7 @@ module Decidim
5
5
  module Pages
6
6
  describe DestroyPage, :db do
7
7
  describe "call" do
8
- let(:feature) { create(:feature) }
8
+ let(:feature) { create(:feature, manifest_name: "pages") }
9
9
  let!(:page) { create(:page, feature: feature) }
10
10
  let(:command) { described_class.new(feature) }
11
11
 
@@ -7,7 +7,7 @@ module Decidim
7
7
  describe UpdatePage, :db do
8
8
  let(:current_organization) { create(:organization) }
9
9
  let(:participatory_process) { create(:participatory_process, organization: current_organization) }
10
- let(:feature) { create(:feature, participatory_process: participatory_process) }
10
+ let(:feature) { create(:feature, manifest_name: "pages", participatory_process: participatory_process) }
11
11
  let(:page) { create(:page, feature: feature) }
12
12
  let(:form_params) do
13
13
  {
@@ -5,6 +5,6 @@ FactoryGirl.define do
5
5
  factory :page, class: Decidim::Pages::Page do
6
6
  title { Decidim::Faker::Localized.sentence(3) }
7
7
  body { Decidim::Faker::Localized.wrapped("<p>", "</p>") { Decidim::Faker::Localized.sentence(4) } }
8
- feature
8
+ feature { build(:feature, manifest_name: "pages") }
9
9
  end
10
10
  end
@@ -4,6 +4,7 @@ require "spec_helper"
4
4
 
5
5
  describe "Edit a page", type: :feature do
6
6
  include_context "feature admin"
7
+ let(:feature) { create(:feature, manifest_name: "pages", participatory_process: participatory_process) }
7
8
  let(:manifest_name) { "pages" }
8
9
 
9
10
  describe "admin page" do
@@ -5,6 +5,21 @@ module Decidim
5
5
  module Pages
6
6
  describe Page do
7
7
  let(:page) { create(:page) }
8
+ subject { page }
9
+
10
+ it { is_expected.to be_valid }
11
+
12
+ context "without a feature" do
13
+ let(:page) { build :page, feature: nil }
14
+
15
+ it { is_expected.not_to be_valid }
16
+ end
17
+
18
+ context "without a valid feature" do
19
+ let(:page) { build :page, feature: build(:feature, manifest_name: "proposals") }
20
+
21
+ it { is_expected.not_to be_valid }
22
+ end
8
23
 
9
24
  it "has an associated feature" do
10
25
  expect(page.feature).to be_a(Decidim::Feature)
@@ -1,6 +1,11 @@
1
1
  /*= require social-share-button */
2
2
  $size: 45px;
3
3
 
4
+ .share-link:hover {
5
+ text-decoration: underline;
6
+ cursor: pointer;
7
+ }
8
+
4
9
  .social-share-button {
5
10
  display: inline-block;
6
11
  vertical-align: top;
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+ module Decidim
3
+ module Proposals
4
+ module Admin
5
+ # A command with all the business logic when an admin answers a proposal.
6
+ class AnswerProposal < Rectify::Command
7
+ # Public: Initializes the command.
8
+ #
9
+ # form - A form object with the params.
10
+ # proposal - The proposal to write the answer for.
11
+ def initialize(form, proposal)
12
+ @form = form
13
+ @proposal = proposal
14
+ end
15
+
16
+ # Executes the command. Broadcasts these events:
17
+ #
18
+ # - :ok when everything is valid.
19
+ # - :invalid if the form wasn't valid and we couldn't proceed.
20
+ #
21
+ # Returns nothing.
22
+ def call
23
+ return broadcast(:invalid) if form.invalid?
24
+
25
+ answer_proposal
26
+ broadcast(:ok)
27
+ end
28
+
29
+ private
30
+
31
+ attr_reader :form, :proposal
32
+
33
+ def answer_proposal
34
+ proposal.update_attributes!(
35
+ state: @form.state,
36
+ answer: @form.answer,
37
+ answered_at: Time.current
38
+ )
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -36,6 +36,7 @@ module Decidim
36
36
  category: form.category,
37
37
  scope: form.scope,
38
38
  author: @current_user,
39
+ decidim_user_group_id: form.user_group_id,
39
40
  feature: form.feature
40
41
  )
41
42
  end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+ module Decidim
3
+ module Proposals
4
+ module Admin
5
+ # This controller allows admins to answer proposals in a participatory process.
6
+ class ProposalAnswersController < Admin::ApplicationController
7
+ helper_method :proposal
8
+
9
+ def edit
10
+ @form = form(Admin::ProposalAnswerForm).from_model(proposal)
11
+ end
12
+
13
+ def update
14
+ @form = form(Admin::ProposalAnswerForm).from_params(params)
15
+
16
+ Admin::AnswerProposal.call(@form, proposal) do
17
+ on(:ok) do
18
+ flash[:notice] = I18n.t("proposals.answer.success", scope: "decidim.proposals.admin")
19
+ redirect_to proposals_path
20
+ end
21
+
22
+ on(:invalid) do
23
+ flash.now[:alert] = I18n.t("proposals.answer.invalid", scope: "decidim.proposals.admin")
24
+ render action: "edit"
25
+ end
26
+ end
27
+ end
28
+
29
+ private
30
+
31
+ def proposal
32
+ @proposals ||= Proposal.where(feature: current_feature).find(params[:id])
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -4,6 +4,7 @@ module Decidim
4
4
  module Admin
5
5
  # This controller allows admins to manage proposals in a participatory process.
6
6
  class ProposalsController < Admin::ApplicationController
7
+ helper Proposals::ApplicationHelper
7
8
  helper_method :proposals
8
9
 
9
10
  def new
@@ -4,21 +4,32 @@ module Decidim
4
4
  module Proposals
5
5
  # Exposes the proposal vote resource so users can vote proposals.
6
6
  class ProposalVotesController < Decidim::Proposals::ApplicationController
7
+ include ProposalVotesHelper
8
+
9
+ helper_method :proposal
10
+
7
11
  before_action :authenticate_user!
8
- before_action :check_current_settings!
9
12
 
10
13
  def create
11
- @proposal = Proposal.where(feature: current_feature).find(params[:proposal_id])
12
- @proposal.votes.create!(author: current_user)
14
+ authorize! :vote, proposal
15
+
16
+ proposal.votes.create!(author: current_user)
17
+ @from_proposals_list = params[:from_proposals_list] == "true"
18
+ render :update_buttons_and_counters
19
+ end
20
+
21
+ def destroy
22
+ authorize! :unvote, proposal
23
+
24
+ proposal.votes.where(author: current_user).delete_all
13
25
  @from_proposals_list = params[:from_proposals_list] == "true"
26
+ render :update_buttons_and_counters
14
27
  end
15
28
 
16
29
  private
17
30
 
18
- # The vote buttons should not be visible if the setting is not enabled.
19
- # This ensure the votes cannot be created using a POST request directly.
20
- def check_current_settings!
21
- raise "This setting is not enabled for this step" unless current_settings.votes_enabled?
31
+ def proposal
32
+ @proposal ||= Proposal.where(feature: current_feature).find(params[:proposal_id])
22
33
  end
23
34
  end
24
35
  end
@@ -18,14 +18,21 @@ module Decidim
18
18
  .results
19
19
  .includes(:author)
20
20
  .includes(votes: [:author])
21
+ .page(params[:page])
22
+ .per(12)
23
+
21
24
  @random_seed = search.random_seed
22
25
  end
23
26
 
24
27
  def new
28
+ authorize! :create, Proposal
29
+
25
30
  @form = form(ProposalForm).from_params({})
26
31
  end
27
32
 
28
33
  def create
34
+ authorize! :create, Proposal
35
+
29
36
  @form = form(ProposalForm).from_params(params)
30
37
 
31
38
  CreateProposal.call(@form, current_user) do
@@ -47,19 +54,13 @@ module Decidim
47
54
  ProposalSearch
48
55
  end
49
56
 
50
- def default_search_params
51
- {
52
- page: params[:page],
53
- per_page: 12
54
- }
55
- end
56
-
57
57
  def default_filter_params
58
58
  {
59
59
  search_text: "",
60
60
  origin: "all",
61
61
  activity: "",
62
62
  category_id: "",
63
+ state: "all",
63
64
  random_seed: params[:random_seed]
64
65
  }
65
66
  end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+ module Decidim
3
+ module Proposals
4
+ module Admin
5
+ # A form object to be used when admin users want to answer a proposal.
6
+ class ProposalAnswerForm < Decidim::Form
7
+ include TranslatableAttributes
8
+ mimic :proposal_answer
9
+
10
+ translatable_attribute :answer, String
11
+ attribute :state, String
12
+
13
+ validates :state, presence: true, inclusion: { in: %w(accepted rejected) }
14
+ validates :answer, translatable_presence: true, if: ->(form) { form.state == "rejected" }
15
+ end
16
+ end
17
+ end
18
+ end
@@ -9,6 +9,7 @@ module Decidim
9
9
  attribute :body, String
10
10
  attribute :category_id, Integer
11
11
  attribute :scope_id, Integer
12
+ attribute :user_group_id, Integer
12
13
 
13
14
  validates :title, :body, presence: true
14
15
  validates :category, presence: true, if: ->(form) { form.category_id.present? }
@@ -7,6 +7,23 @@ module Decidim
7
7
  include Decidim::Comments::CommentsHelper
8
8
  include PaginateHelper
9
9
  include ProposalVotesHelper
10
+
11
+ # Public: The state of a proposal in a way a human can understand.
12
+ #
13
+ # state - The String state of the proposal.
14
+ #
15
+ # Returns a String.
16
+ def humanize_proposal_state(state)
17
+ value = if state == "accepted"
18
+ "accepted"
19
+ elsif state == "rejected"
20
+ "rejected"
21
+ else
22
+ "not_answered"
23
+ end
24
+
25
+ I18n.t(value, scope: "decidim.proposals.answers")
26
+ end
10
27
  end
11
28
  end
12
29
  end
@@ -22,6 +22,25 @@ module Decidim
22
22
  return "small" if from_proposals_list
23
23
  "expanded button--sc"
24
24
  end
25
+
26
+ # Check if the vote limit is enabled for the current feature
27
+ #
28
+ # Returns true if the vote limit is enabled
29
+ def vote_limit_enabled?
30
+ current_user && feature_settings.vote_limit.present? && feature_settings.vote_limit.positive?
31
+ end
32
+
33
+ # Return the remaining votes for a user if the current feature has a vote limit
34
+ #
35
+ # user - A User object
36
+ #
37
+ # Returns a number with the remaining votes for that user
38
+ def remaining_votes_count_for(user)
39
+ return 0 unless vote_limit_enabled?
40
+ proposals = Proposal.where(feature: current_feature)
41
+ votes_count = ProposalVote.where(author: user, proposal: proposals).size
42
+ feature_settings.vote_limit - votes_count
43
+ end
25
44
  end
26
45
  end
27
46
  end
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+ module Decidim
3
+ module Proposals
4
+ module Abilities
5
+ # Defines the abilities related to proposals for a logged in user.
6
+ # Intended to be used with `cancancan`.
7
+ class CurrentUser
8
+ include CanCan::Ability
9
+
10
+ attr_reader :user, :context
11
+
12
+ def initialize(user, context)
13
+ return unless user
14
+
15
+ @user = user
16
+ @context = context
17
+
18
+ can :vote, Proposal do |_proposal|
19
+ voting_enabled? && remaining_votes.positive?
20
+ end
21
+
22
+ can :unvote, Proposal do |_proposal|
23
+ voting_enabled? && vote_limit_enabled?
24
+ end
25
+
26
+ can :create, Proposal if current_settings.try(:creation_enabled?)
27
+ end
28
+
29
+ private
30
+
31
+ def vote_limit_enabled?
32
+ return unless feature_settings
33
+ feature_settings.vote_limit.present? && feature_settings.vote_limit.positive?
34
+ end
35
+
36
+ def remaining_votes
37
+ return 1 unless vote_limit_enabled?
38
+
39
+ proposals = Proposal.where(feature: context.fetch(:current_feature))
40
+ votes_count = ProposalVote.where(author: user, proposal: proposals).size
41
+ feature_settings.vote_limit - votes_count
42
+ end
43
+
44
+ def voting_enabled?
45
+ return unless current_settings
46
+ current_settings.votes_enabled? && !current_settings.votes_blocked?
47
+ end
48
+
49
+ def current_settings
50
+ context.fetch(:current_settings, nil)
51
+ end
52
+
53
+ def feature_settings
54
+ context.fetch(:feature_settings, nil)
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -3,58 +3,55 @@ module Decidim
3
3
  module Proposals
4
4
  # The data store for a Proposal in the Decidim::Proposals component.
5
5
  class Proposal < Proposals::ApplicationRecord
6
- belongs_to :feature, foreign_key: "decidim_feature_id", class_name: Decidim::Feature
7
- belongs_to :author, foreign_key: "decidim_author_id", class_name: Decidim::User
8
- belongs_to :category, foreign_key: "decidim_category_id", class_name: Decidim::Category
9
- belongs_to :scope, foreign_key: "decidim_scope_id", class_name: Decidim::Scope
10
- has_one :organization, through: :feature
6
+ include Decidim::Resourceable
7
+ include Decidim::Authorable
8
+ include Decidim::HasFeature
9
+ include Decidim::HasScope
10
+ include Decidim::HasCategory
11
+
12
+ feature_manifest_name "proposals"
13
+
11
14
  has_many :votes, foreign_key: "decidim_proposal_id", class_name: ProposalVote, dependent: :destroy
12
15
 
13
- validates :title, :feature, :body, presence: true
14
- validate :category_belongs_to_feature
15
- validate :scope_belongs_to_organization
16
- validate :author_belongs_to_organization
16
+ validates :title, :body, presence: true
17
+
18
+ scope :accepted, -> { where(state: "accepted") }
19
+ scope :rejected, -> { where(state: "rejected") }
17
20
 
18
21
  def author_name
19
- author&.name || I18n.t("decidim.proposals.models.proposal.fields.official_proposal")
22
+ user_group&.name || author&.name || I18n.t("decidim.proposals.models.proposal.fields.official_proposal")
20
23
  end
21
24
 
22
25
  def author_avatar_url
23
26
  author&.avatar&.url || ActionController::Base.helpers.asset_path("decidim/default-avatar.svg")
24
27
  end
25
28
 
26
- # Public: Canpeople comment on this proposal?
29
+ # Public: Check if the user has voted the proposal.
27
30
  #
28
- # Until we have a way to store options fore features and its resources we
29
- # assume all proposals can be commented.
30
- #
31
- # Returns Boolean
32
- def commentable?
33
- true
34
- end
35
-
36
- # Public: Check if the user has voted the proposal
37
- #
38
- # Returns Boolean
31
+ # Returns Boolean.
39
32
  def voted_by?(user)
40
33
  votes.any? { |vote| vote.author == user }
41
34
  end
42
35
 
43
- private
44
-
45
- def category_belongs_to_feature
46
- return unless category
47
- errors.add(:category, :invalid) unless feature.categories.where(id: category.id).exists?
36
+ # Public: Checks if the organization has given an answer for the proposal.
37
+ #
38
+ # Returns Boolean.
39
+ def answered?
40
+ answered_at.present?
48
41
  end
49
42
 
50
- def scope_belongs_to_organization
51
- return unless scope
52
- errors.add(:scope, :invalid) unless feature.scopes.where(id: scope.id).exists?
43
+ # Public: Checks if the organization has accepted a proposal.
44
+ #
45
+ # Returns Boolean.
46
+ def accepted?
47
+ state == "accepted"
53
48
  end
54
49
 
55
- def author_belongs_to_organization
56
- return unless author
57
- errors.add(:author, :invalid) unless Decidim::User.where(decidim_organization_id: feature.organization.id, id: author.id).exists?
50
+ # Public: Checks if the organization has rejected a proposal.
51
+ #
52
+ # Returns Boolean.
53
+ def rejected?
54
+ state == "rejected"
58
55
  end
59
56
  end
60
57
  end