decidim-elections 0.23.1 → 0.24.0.rc2

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 (327) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -0
  3. data/app/assets/config/admin/decidim_votings_manifest.css +0 -0
  4. data/app/assets/config/admin/decidim_votings_manifest.js +4 -0
  5. data/app/assets/config/decidim_elections_manifest.css +3 -0
  6. data/app/assets/config/decidim_elections_manifest.js +6 -0
  7. data/app/assets/config/decidim_votings_manifest.css +3 -0
  8. data/app/assets/config/decidim_votings_manifest.js +0 -0
  9. data/app/assets/images/decidim/votings/icon.svg +1 -0
  10. data/app/assets/javascripts/decidim/elections/admin/pending_action.js.es6 +16 -0
  11. data/app/assets/javascripts/decidim/elections/admin/vote_statistics.js.es6 +11 -0
  12. data/app/assets/javascripts/decidim/elections/trustee_zone.js.es6 +54 -0
  13. data/app/assets/javascripts/decidim/elections/trustee_zone/key_ceremony.js.es6 +126 -0
  14. data/app/assets/javascripts/decidim/elections/trustee_zone/tally.js.es6 +104 -0
  15. data/app/assets/javascripts/decidim/elections/vote.js.es6 +107 -160
  16. data/app/assets/javascripts/decidim/elections/vote_questions.component.js.es6 +129 -0
  17. data/app/assets/javascripts/decidim/elections/vote_verify.js.es6 +71 -0
  18. data/app/assets/javascripts/decidim/votings/admin/monitoring_committee_members_form.js.es6 +35 -0
  19. data/app/assets/javascripts/decidim/votings/admin/polling_officers_form.js.es6 +35 -0
  20. data/app/assets/javascripts/decidim/votings/admin/polling_officers_picker.js.es6 +35 -0
  21. data/app/assets/javascripts/decidim/votings/admin/polling_stations_form.js.es6 +5 -0
  22. data/app/assets/stylesheets/decidim/elections/elections.scss +0 -4
  23. data/app/assets/stylesheets/decidim/elections/focus/_accordion.scss +36 -0
  24. data/app/assets/stylesheets/decidim/elections/focus/_evote.scss +58 -0
  25. data/app/assets/stylesheets/decidim/elections/trustee_zone.scss +24 -0
  26. data/app/assets/stylesheets/decidim/votings/votings.scss +1 -0
  27. data/app/assets/stylesheets/decidim/votings/votings/_votings-header.scss +99 -0
  28. data/app/assets/stylesheets/decidim/votings/votings/_votings-home-banner.scss +11 -0
  29. data/app/cells/decidim/votings/content_block_cell.rb +17 -0
  30. data/app/cells/decidim/votings/content_blocks/highlighted_votings/show.erb +30 -0
  31. data/app/cells/decidim/votings/content_blocks/highlighted_votings_cell.rb +33 -0
  32. data/app/cells/decidim/votings/content_blocks/highlighted_votings_settings_form/show.erb +3 -0
  33. data/app/cells/decidim/votings/content_blocks/highlighted_votings_settings_form_cell.rb +19 -0
  34. data/app/cells/decidim/votings/content_blocks/landing_page/attachments_and_folders_cell.rb +15 -0
  35. data/app/cells/decidim/votings/content_blocks/landing_page/description_cell.rb +15 -0
  36. data/app/cells/decidim/votings/content_blocks/landing_page/elections_cell.rb +15 -0
  37. data/app/cells/decidim/votings/content_blocks/landing_page/header_cell.rb +15 -0
  38. data/app/cells/decidim/votings/content_blocks/landing_page/metrics_cell.rb +15 -0
  39. data/app/cells/decidim/votings/content_blocks/landing_page/polling_stations_cell.rb +15 -0
  40. data/app/cells/decidim/votings/content_blocks/landing_page/stats_cell.rb +15 -0
  41. data/app/cells/decidim/votings/content_blocks/landing_page/timeline_cell.rb +15 -0
  42. data/app/cells/decidim/votings/polling_officers/polling_officers_picker/polling_officers.erb +12 -0
  43. data/app/cells/decidim/votings/polling_officers/polling_officers_picker/show.erb +14 -0
  44. data/app/cells/decidim/votings/polling_officers/polling_officers_picker_cell.rb +73 -0
  45. data/app/cells/decidim/votings/voting_cell.rb +19 -0
  46. data/app/cells/decidim/votings/voting_m/data.erb +21 -0
  47. data/app/cells/decidim/votings/voting_m/footer.erb +5 -0
  48. data/app/cells/decidim/votings/voting_m_cell.rb +94 -0
  49. data/app/commands/decidim/elections/admin/add_user_as_trustee.rb +81 -0
  50. data/app/commands/decidim/elections/admin/create_election.rb +2 -1
  51. data/app/commands/decidim/elections/admin/end_vote.rb +63 -0
  52. data/app/commands/decidim/elections/admin/publish_results.rb +59 -0
  53. data/app/commands/decidim/elections/admin/remove_trustee_from_participatory_space.rb +37 -0
  54. data/app/commands/decidim/elections/admin/setup_election.rb +160 -0
  55. data/app/commands/decidim/elections/admin/start_key_ceremony.rb +63 -0
  56. data/app/commands/decidim/elections/admin/start_tally.rb +63 -0
  57. data/app/commands/decidim/elections/admin/start_vote.rb +63 -0
  58. data/app/commands/decidim/elections/admin/update_action_status.rb +47 -0
  59. data/app/commands/decidim/elections/admin/update_answer_selection.rb +41 -0
  60. data/app/commands/decidim/elections/admin/update_trustee_participatory_space.rb +40 -0
  61. data/app/commands/decidim/elections/trustee_zone/update_election_bulletin_board_status.rb +39 -0
  62. data/app/commands/decidim/elections/trustee_zone/update_trustee.rb +41 -0
  63. data/app/commands/decidim/elections/voter/cast_vote.rb +59 -0
  64. data/app/commands/decidim/elections/voter/update_vote_status.rb +70 -0
  65. data/app/commands/decidim/votings/admin/create_monitoring_committee_member.rb +99 -0
  66. data/app/commands/decidim/votings/admin/create_polling_officer.rb +99 -0
  67. data/app/commands/decidim/votings/admin/create_polling_station.rb +59 -0
  68. data/app/commands/decidim/votings/admin/create_voting.rb +59 -0
  69. data/app/commands/decidim/votings/admin/destroy_monitoring_committee_member.rb +51 -0
  70. data/app/commands/decidim/votings/admin/destroy_polling_officer.rb +52 -0
  71. data/app/commands/decidim/votings/admin/destroy_polling_station.rb +40 -0
  72. data/app/commands/decidim/votings/admin/manage_polling_station.rb +64 -0
  73. data/app/commands/decidim/votings/admin/publish_voting.rb +40 -0
  74. data/app/commands/decidim/votings/admin/unpublish_voting.rb +40 -0
  75. data/app/commands/decidim/votings/admin/update_polling_station.rb +50 -0
  76. data/app/commands/decidim/votings/admin/update_voting.rb +85 -0
  77. data/app/constraints/decidim/votings/current_component.rb +28 -0
  78. data/app/constraints/decidim/votings/current_voting.rb +43 -0
  79. data/app/controllers/concerns/decidim/elections/orderable.rb +2 -2
  80. data/app/controllers/concerns/decidim/polling_officers/admin/filterable.rb +58 -0
  81. data/app/controllers/concerns/decidim/polling_stations/admin/filterable.rb +57 -0
  82. data/app/controllers/concerns/decidim/votings/admin/filterable.rb +27 -0
  83. data/app/controllers/concerns/decidim/votings/admin/voting_admin.rb +48 -0
  84. data/app/controllers/concerns/decidim/votings/needs_voting.rb +44 -0
  85. data/app/controllers/concerns/decidim/votings/orderable.rb +32 -0
  86. data/app/controllers/decidim/elections/admin/answers_controller.rb +32 -0
  87. data/app/controllers/decidim/elections/admin/elections_controller.rb +2 -2
  88. data/app/controllers/decidim/elections/admin/feedback_forms_controller.rb +55 -0
  89. data/app/controllers/decidim/elections/admin/steps_controller.rb +96 -0
  90. data/app/controllers/decidim/elections/admin/trustees_participatory_spaces_controller.rb +89 -0
  91. data/app/controllers/decidim/elections/elections_controller.rb +5 -1
  92. data/app/controllers/decidim/elections/feedbacks_controller.rb +38 -0
  93. data/app/controllers/decidim/elections/trustee_zone/application_controller.rb +45 -0
  94. data/app/controllers/decidim/elections/trustee_zone/elections_controller.rb +35 -0
  95. data/app/controllers/decidim/elections/trustee_zone/trustees_controller.rb +36 -0
  96. data/app/controllers/decidim/elections/votes_controller.rb +54 -2
  97. data/app/controllers/decidim/votings/admin/application_controller.rb +26 -0
  98. data/app/controllers/decidim/votings/admin/component_permissions_controller.rb +13 -0
  99. data/app/controllers/decidim/votings/admin/components_controller.rb +15 -0
  100. data/app/controllers/decidim/votings/admin/monitoring_committee_members_controller.rb +62 -0
  101. data/app/controllers/decidim/votings/admin/polling_officers_controller.rb +66 -0
  102. data/app/controllers/decidim/votings/admin/polling_stations_controller.rb +92 -0
  103. data/app/controllers/decidim/votings/admin/voting_attachment_collections_controller.rb +22 -0
  104. data/app/controllers/decidim/votings/admin/voting_attachments_controller.rb +21 -0
  105. data/app/controllers/decidim/votings/admin/votings_controller.rb +124 -0
  106. data/app/controllers/decidim/votings/admin/votings_landing_page_content_blocks_controller.rb +44 -0
  107. data/app/controllers/decidim/votings/admin/votings_landing_page_controller.rb +46 -0
  108. data/app/controllers/decidim/votings/application_controller.rb +26 -0
  109. data/app/controllers/decidim/votings/polling_officer_zone/application_controller.rb +33 -0
  110. data/app/controllers/decidim/votings/polling_officer_zone/polling_officers_controller.rb +17 -0
  111. data/app/controllers/decidim/votings/polling_officer_zone/polling_stations_controller.rb +22 -0
  112. data/app/controllers/decidim/votings/votings_controller.rb +98 -0
  113. data/app/events/decidim/elections/trustees/notify_new_trustee_event.rb +28 -0
  114. data/app/events/decidim/elections/trustees/notify_trustee_new_election_event.rb +14 -0
  115. data/app/events/decidim/elections/votes/vote_accepted_event.rb +24 -0
  116. data/app/events/decidim/votings/polling_officers/polling_station_assigned_event.rb +44 -0
  117. data/app/forms/decidim/elections/admin/action_form.rb +34 -0
  118. data/app/forms/decidim/elections/admin/answer_form.rb +3 -2
  119. data/app/forms/decidim/elections/admin/election_form.rb +3 -2
  120. data/app/forms/decidim/elections/admin/setup_form.rb +79 -0
  121. data/app/forms/decidim/elections/admin/trustees_participatory_space_form.rb +22 -0
  122. data/app/forms/decidim/elections/admin/vote_period_form.rb +37 -0
  123. data/app/forms/decidim/elections/ballot/verify_vote_form.rb +29 -0
  124. data/app/forms/decidim/elections/trustee_zone/trustee_form.rb +26 -0
  125. data/app/forms/decidim/elections/voter/encrypted_vote_form.rb +49 -0
  126. data/app/forms/decidim/votings/admin/monitoring_committee_member_form.rb +27 -0
  127. data/app/forms/decidim/votings/admin/polling_officer_form.rb +27 -0
  128. data/app/forms/decidim/votings/admin/polling_station_form.rb +58 -0
  129. data/app/forms/decidim/votings/admin/voting_form.rb +71 -0
  130. data/app/helpers/decidim/elections/admin/answers_helper.rb +19 -0
  131. data/app/helpers/decidim/elections/admin/steps_helper.rb +23 -0
  132. data/app/helpers/decidim/elections/admin/trustees_participatory_spaces_helper.rb +31 -0
  133. data/app/helpers/decidim/elections/elections_helper.rb +29 -0
  134. data/app/helpers/decidim/votings/admin/polling_officers_picker_helper.rb +29 -0
  135. data/app/helpers/decidim/votings/votings_helper.rb +20 -0
  136. data/app/models/decidim/elections/action.rb +13 -0
  137. data/app/models/decidim/elections/election.rb +54 -3
  138. data/app/models/decidim/elections/elections_trustee.rb +11 -0
  139. data/app/models/decidim/elections/question.rb +19 -0
  140. data/app/models/decidim/elections/trustee.rb +26 -0
  141. data/app/models/decidim/elections/trustees_participatory_space.rb +13 -0
  142. data/app/models/decidim/elections/vote.rb +15 -0
  143. data/app/models/decidim/votings/monitoring_committee_member.rb +24 -0
  144. data/app/models/decidim/votings/polling_officer.rb +76 -0
  145. data/app/models/decidim/votings/polling_station.rb +64 -0
  146. data/app/models/decidim/votings/voting.rb +138 -0
  147. data/app/permissions/decidim/elections/admin/permissions.rb +50 -10
  148. data/app/permissions/decidim/elections/permissions.rb +20 -2
  149. data/app/permissions/decidim/elections/trustee_zone/permissions.rb +32 -0
  150. data/app/permissions/decidim/votings/admin/permissions.rb +127 -0
  151. data/app/permissions/decidim/votings/permissions.rb +40 -0
  152. data/app/permissions/decidim/votings/polling_officer_zone/permissions.rb +32 -0
  153. data/app/presenters/decidim/elections/admin_log/election_presenter.rb +1 -1
  154. data/app/presenters/decidim/elections/trustee_presenter.rb +24 -0
  155. data/app/presenters/decidim/votings/admin_log/voting_presenter.rb +45 -0
  156. data/app/presenters/decidim/votings/polling_station_presenter.rb +27 -0
  157. data/app/presenters/decidim/votings/voting_presenter.rb +36 -0
  158. data/app/queries/decidim/elections/admin/pending_actions.rb +20 -0
  159. data/app/queries/decidim/elections/admin/votes_for_statistics.rb +24 -0
  160. data/app/queries/decidim/elections/elections_finished_to_end.rb +19 -0
  161. data/app/queries/decidim/elections/elections_ready_to_start.rb +25 -0
  162. data/app/queries/decidim/elections/trustees/by_participatory_space.rb +24 -0
  163. data/app/queries/decidim/elections/trustees/by_participatory_space_trustee_ids.rb +24 -0
  164. data/app/queries/decidim/elections/votes/election_votes.rb +19 -0
  165. data/app/queries/decidim/elections/votes/pending_votes.rb +20 -0
  166. data/app/queries/decidim/elections/votes/user_election_last_vote.rb +26 -0
  167. data/app/queries/decidim/elections/votes/user_votes.rb +19 -0
  168. data/app/queries/decidim/votings/admin/admin_users.rb +39 -0
  169. data/app/queries/decidim/votings/admin/polling_officers_join_polling_stations.rb +33 -0
  170. data/app/queries/decidim/votings/admin/polling_officers_join_polling_stations_and_user.rb +34 -0
  171. data/app/queries/decidim/votings/admin/polling_officers_join_user.rb +32 -0
  172. data/app/queries/decidim/votings/organization_prioritized_votings.rb +21 -0
  173. data/app/queries/decidim/votings/organization_promoted_votings.rb +16 -0
  174. data/app/queries/decidim/votings/organization_published_votings.rb +19 -0
  175. data/app/queries/decidim/votings/organization_votings.rb +16 -0
  176. data/app/queries/decidim/votings/prioritized_votings.rb +13 -0
  177. data/app/queries/decidim/votings/published_votings.rb +12 -0
  178. data/app/services/decidim/votings/voting_search.rb +46 -0
  179. data/app/views/decidim/elections/admin/answers/index.html.erb +12 -0
  180. data/app/views/decidim/elections/admin/elections/index.html.erb +13 -1
  181. data/app/views/decidim/elections/admin/proposals_imports/new.html.erb +1 -1
  182. data/app/views/decidim/elections/admin/questions/index.html.erb +5 -1
  183. data/app/views/decidim/elections/admin/shared/_trustees_secondary_nav.html.erb +3 -0
  184. data/app/views/decidim/elections/admin/steps/_create_election.html.erb +38 -0
  185. data/app/views/decidim/elections/admin/steps/_created.html.erb +16 -0
  186. data/app/views/decidim/elections/admin/steps/_key_ceremony.html.erb +16 -0
  187. data/app/views/decidim/elections/admin/steps/_key_ceremony_ended.html.erb +15 -0
  188. data/app/views/decidim/elections/admin/steps/_tally.html.erb +17 -0
  189. data/app/views/decidim/elections/admin/steps/_tally_ended.html.erb +9 -0
  190. data/app/views/decidim/elections/admin/steps/_vote.html.erb +21 -0
  191. data/app/views/decidim/elections/admin/steps/_vote_ended.html.erb +15 -0
  192. data/app/views/decidim/elections/admin/steps/_vote_stats.html.erb +31 -0
  193. data/app/views/decidim/elections/admin/steps/index.html.erb +43 -0
  194. data/app/views/decidim/elections/admin/trustees_participatory_spaces/_form.html.erb +19 -0
  195. data/app/views/decidim/elections/admin/trustees_participatory_spaces/index.html.erb +64 -0
  196. data/app/views/decidim/elections/admin/trustees_participatory_spaces/new.html.erb +7 -0
  197. data/app/views/decidim/elections/elections/_filters_small_view.html.erb +1 -1
  198. data/app/views/decidim/elections/elections/_preview.html.erb +26 -0
  199. data/app/views/decidim/elections/elections/_results.html.erb +47 -0
  200. data/app/views/decidim/elections/elections/show.html.erb +39 -12
  201. data/app/views/decidim/elections/trustee_zone/elections/_backup_modal.html.erb +24 -0
  202. data/app/views/decidim/elections/trustee_zone/elections/_key_ceremony_steps.html.erb +44 -0
  203. data/app/views/decidim/elections/trustee_zone/elections/_restore_modal.html.erb +25 -0
  204. data/app/views/decidim/elections/trustee_zone/elections/_tally_steps.html.erb +43 -0
  205. data/app/views/decidim/elections/trustee_zone/elections/show.html.erb +38 -0
  206. data/app/views/decidim/elections/trustee_zone/elections/update.js.erb +5 -0
  207. data/app/views/decidim/elections/trustee_zone/trustees/show.html.erb +102 -0
  208. data/app/views/decidim/elections/votes/_election_votes_confirmed.html.erb +38 -17
  209. data/app/views/decidim/elections/votes/_election_votes_failed.html.erb +21 -0
  210. data/app/views/decidim/elections/votes/_election_votes_question.html.erb +4 -4
  211. data/app/views/decidim/elections/votes/cast_failed.js.erb +1 -0
  212. data/app/views/decidim/elections/votes/cast_success.js.erb +1 -0
  213. data/app/views/decidim/elections/votes/new.html.erb +41 -33
  214. data/app/views/decidim/elections/votes/verify.html.erb +78 -0
  215. data/app/views/decidim/votings/admin/monitoring_committee_members/_form.html.erb +27 -0
  216. data/app/views/decidim/votings/admin/monitoring_committee_members/index.html.erb +41 -0
  217. data/app/views/decidim/votings/admin/monitoring_committee_members/new.html.erb +7 -0
  218. data/app/views/decidim/votings/admin/polling_officers/_form.html.erb +27 -0
  219. data/app/views/decidim/votings/admin/polling_officers/index.html.erb +50 -0
  220. data/app/views/decidim/votings/admin/polling_officers/new.html.erb +7 -0
  221. data/app/views/decidim/votings/admin/polling_stations/_form.html.erb +40 -0
  222. data/app/views/decidim/votings/admin/polling_stations/edit.html.erb +7 -0
  223. data/app/views/decidim/votings/admin/polling_stations/index.html.erb +55 -0
  224. data/app/views/decidim/votings/admin/polling_stations/new.html.erb +7 -0
  225. data/app/views/decidim/votings/admin/votings/_form.html.erb +63 -0
  226. data/app/views/decidim/votings/admin/votings/edit.html.erb +31 -0
  227. data/app/views/decidim/votings/admin/votings/index.html.erb +87 -0
  228. data/app/views/decidim/votings/admin/votings/new.html.erb +13 -0
  229. data/app/views/decidim/votings/admin/votings/polling_officers_picker.html.erb +2 -0
  230. data/app/views/decidim/votings/polling_officer_zone/polling_officers/show.html.erb +42 -0
  231. data/app/views/decidim/votings/polling_officer_zone/polling_stations/show.html.erb +1 -0
  232. data/app/views/decidim/votings/votings/_count.html.erb +1 -0
  233. data/app/views/decidim/votings/votings/_filters.html.erb +25 -0
  234. data/app/views/decidim/votings/votings/_filters_small_view.html.erb +23 -0
  235. data/app/views/decidim/votings/votings/_promoted_voting.html.erb +27 -0
  236. data/app/views/decidim/votings/votings/_voting_details.html.erb +7 -0
  237. data/app/views/decidim/votings/votings/_votings.html.erb +25 -0
  238. data/app/views/decidim/votings/votings/index.html.erb +42 -0
  239. data/app/views/decidim/votings/votings/index.js.erb +10 -0
  240. data/app/views/decidim/votings/votings/show.html.erb +20 -0
  241. data/app/views/layouts/decidim/_voting_header.html.erb +16 -0
  242. data/app/views/layouts/decidim/admin/voting.html.erb +101 -0
  243. data/app/views/layouts/decidim/voting.html.erb +16 -0
  244. data/config/initializers/decidim_bulletin_board.rb +23 -0
  245. data/config/locales/ca.yml +635 -6
  246. data/config/locales/cs.yml +635 -6
  247. data/config/locales/de.yml +677 -10
  248. data/config/locales/el.yml +4 -2
  249. data/config/locales/en.yml +636 -6
  250. data/config/locales/es-MX.yml +636 -7
  251. data/config/locales/es-PY.yml +636 -7
  252. data/config/locales/es.yml +636 -7
  253. data/config/locales/fi-plain.yml +636 -7
  254. data/config/locales/fi.yml +637 -8
  255. data/config/locales/fr-CA.yml +419 -6
  256. data/config/locales/fr.yml +419 -6
  257. data/config/locales/gl.yml +168 -0
  258. data/config/locales/it.yml +108 -6
  259. data/config/locales/ja.yml +12 -6
  260. data/config/locales/lv.yml +4 -2
  261. data/config/locales/nl.yml +502 -6
  262. data/config/locales/no.yml +0 -6
  263. data/config/locales/pl.yml +657 -9
  264. data/config/locales/pt.yml +4 -6
  265. data/config/locales/ro-RO.yml +4 -6
  266. data/config/locales/si-LK.yml +1 -0
  267. data/config/locales/sv.yml +11 -6
  268. data/config/locales/sw-KE.yml +1 -0
  269. data/config/locales/tr-TR.yml +366 -0
  270. data/config/locales/zh-CN.yml +4 -6
  271. data/db/migrate/20200915142713_add_questionnaire_to_existing_elections.rb +29 -0
  272. data/db/migrate/20200918153813_create_decidim_elections_trustees_participatory_spaces.rb +13 -0
  273. data/db/migrate/20200918153824_create_decidim_elections_elections_trustees.rb +10 -0
  274. data/db/migrate/20200918153835_create_decidim_elections_trustees.rb +12 -0
  275. data/db/migrate/20201026163334_add_blocked_at_and_bb_status_to_elections.rb +8 -0
  276. data/db/migrate/20201028090110_add_votes_to_decidim_elections_answers.rb +7 -0
  277. data/db/migrate/20201028135614_add_selected_to_decidim_elections_answers.rb +7 -0
  278. data/db/migrate/20201209110653_create_decidim_elections_votes.rb +14 -0
  279. data/db/migrate/20201216091123_add_name_to_trustees.rb +7 -0
  280. data/db/migrate/20210113113818_add_message_id_to_decidim_elections_votes.rb +7 -0
  281. data/db/migrate/20210113120115_create_decidim_elections_votings.rb +20 -0
  282. data/db/migrate/20210114100749_add_published_at_to_decidim_votings_votings.rb +7 -0
  283. data/db/migrate/20210114111850_add_user_to_decidim_elections_votes.rb +7 -0
  284. data/db/migrate/20210120164634_add_promoted_to_voting.rb +7 -0
  285. data/db/migrate/20210125124801_add_voting_type_to_voting_voting.rb +7 -0
  286. data/db/migrate/20210129124956_create_decidim_elections_actions.rb +14 -0
  287. data/db/migrate/20210204132111_add_votings_polling_stations.rb +19 -0
  288. data/db/migrate/20210208090441_add_polling_officers_to_votings.rb +12 -0
  289. data/db/migrate/20210210090738_add_votings_polling_station_references_to_votings_polling_officer.rb +8 -0
  290. data/db/migrate/20210216074707_add_monitoring_committee_member.rb +12 -0
  291. data/db/seeds/city.jpeg +0 -0
  292. data/lib/decidim/api/election_answer_type.rb +23 -0
  293. data/lib/decidim/api/election_question_type.rb +22 -0
  294. data/lib/decidim/api/election_type.rb +27 -0
  295. data/lib/decidim/api/elections_type.rb +32 -0
  296. data/lib/decidim/api/trustee_type.rb +16 -0
  297. data/lib/decidim/api/voting_type.rb +20 -0
  298. data/lib/decidim/elections.rb +19 -2
  299. data/lib/decidim/elections/admin_engine.rb +42 -1
  300. data/lib/decidim/elections/answer_serializer.rb +48 -0
  301. data/lib/decidim/elections/api.rb +11 -0
  302. data/lib/decidim/elections/component.rb +367 -24
  303. data/lib/decidim/elections/engine.rb +8 -1
  304. data/lib/decidim/elections/test/factories.rb +201 -4
  305. data/lib/decidim/elections/trustee_zone.rb +10 -0
  306. data/lib/decidim/elections/trustee_zone_engine.rb +35 -0
  307. data/lib/decidim/elections/version.rb +1 -1
  308. data/lib/decidim/votings.rb +16 -0
  309. data/lib/decidim/votings/admin.rb +10 -0
  310. data/lib/decidim/votings/admin_engine.rb +71 -0
  311. data/lib/decidim/votings/api.rb +7 -0
  312. data/lib/decidim/votings/engine.rb +147 -0
  313. data/lib/decidim/votings/participatory_space.rb +92 -0
  314. data/lib/decidim/votings/polling_officer_zone.rb +10 -0
  315. data/lib/decidim/votings/polling_officer_zone_engine.rb +33 -0
  316. data/lib/decidim/votings/query_extensions.rb +43 -0
  317. data/lib/decidim/votings/test/capybara_polling_officers_picker.rb +49 -0
  318. data/lib/decidim/votings/test/factories.rb +83 -0
  319. data/lib/decidim/votings/voting_serializer.rb +54 -0
  320. data/lib/tasks/decidim_elections.rake +68 -5
  321. metadata +309 -24
  322. data/app/types/decidim/elections/election_answer_type.rb +0 -24
  323. data/app/types/decidim/elections/election_question_type.rb +0 -25
  324. data/app/types/decidim/elections/election_type.rb +0 -27
  325. data/app/types/decidim/elections/elections_type.rb +0 -32
  326. data/config/i18n-tasks.yml +0 -10
  327. data/lib/decidim/elections/bulletin_board_client.rb +0 -35
@@ -0,0 +1,98 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Votings
5
+ # A controller that holds the logic to show votings in a
6
+ # public layout.
7
+ class VotingsController < Decidim::Votings::ApplicationController
8
+ layout "layouts/decidim/voting", only: :show
9
+
10
+ include ParticipatorySpaceContext
11
+ include NeedsVoting
12
+ include FilterResource
13
+ include Paginable
14
+ include Decidim::Votings::Orderable
15
+
16
+ helper_method :published_votings, :paginated_votings, :filter, :promoted_votings, :only_finished_votings?
17
+
18
+ helper Decidim::FiltersHelper
19
+ helper Decidim::OrdersHelper
20
+ helper Decidim::SanitizeHelper
21
+ helper Decidim::PaginateHelper
22
+ helper Decidim::IconHelper
23
+ helper Decidim::WidgetUrlsHelper
24
+ helper Decidim::ResourceHelper
25
+
26
+ def index
27
+ raise ActionController::RoutingError, "Not Found" if published_votings.none?
28
+
29
+ enforce_permission_to :read, :votings
30
+ redirect_to voting_path(single) if single?
31
+ end
32
+
33
+ def show
34
+ raise ActionController::RoutingError, "Not Found" unless current_voting
35
+
36
+ enforce_permission_to :read, :voting, voting: current_voting
37
+ end
38
+
39
+ private
40
+
41
+ def current_participatory_space_manifest
42
+ @current_participatory_space_manifest ||= Decidim.find_participatory_space_manifest(:votings)
43
+ end
44
+
45
+ def published_votings
46
+ @published_votings ||= Voting.where(organization: current_organization).published
47
+ end
48
+
49
+ def paginated_votings
50
+ @paginated_votings ||= paginate(search.results.published)
51
+ @paginated_votings = reorder(@paginated_votings)
52
+ end
53
+
54
+ def promoted_votings
55
+ @promoted_votings ||= OrganizationPromotedVotings.new(current_organization)
56
+ end
57
+
58
+ def finished_votings
59
+ @finished_votings ||= search_klass.new(search_params.merge(state: ["finished"])).results
60
+ end
61
+
62
+ def only_finished_votings?
63
+ return if finished_votings.blank?
64
+
65
+ published_votings.count == finished_votings.count
66
+ end
67
+
68
+ def search_klass
69
+ VotingSearch
70
+ end
71
+
72
+ def default_filter_params
73
+ {
74
+ search_text: "",
75
+ state: [""]
76
+ }
77
+ end
78
+
79
+ def context_params
80
+ {
81
+ organization: current_organization,
82
+ current_user: current_user
83
+ }
84
+ end
85
+
86
+ # Public: Checks if the component has only one election resource.
87
+ #
88
+ # Returns Boolean.
89
+ def single?
90
+ published_votings.one?
91
+ end
92
+
93
+ def single
94
+ published_votings.first if single?
95
+ end
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,28 @@
1
+ # frozen-string_literal: true
2
+
3
+ module Decidim
4
+ module Elections
5
+ module Trustees
6
+ class NotifyNewTrusteeEvent < Decidim::Events::SimpleEvent
7
+ # This event sends a notification when a new trustee gets created.
8
+
9
+ delegate :organization, to: :user, prefix: false
10
+ delegate :url_helpers, to: "Decidim::Core::Engine.routes"
11
+
12
+ i18n_attributes :resource_name, :trustee_zone_url
13
+
14
+ def resource_name
15
+ @resource_name ||= translated_attribute(participatory_space.title)
16
+ end
17
+
18
+ def participatory_space
19
+ @participatory_space ||= resource
20
+ end
21
+
22
+ def trustee_zone_url
23
+ url_helpers.decidim_elections_trustee_zone_url(host: organization.host)
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,14 @@
1
+ # frozen-string_literal: true
2
+
3
+ module Decidim
4
+ module Elections
5
+ module Trustees
6
+ class NotifyTrusteeNewElectionEvent < Decidim::Events::SimpleEvent
7
+ # This event sends a notification when a new trustee gets an election.
8
+ def resource_name
9
+ @resource_name ||= translated_attribute(election.title)
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,24 @@
1
+ # frozen-string_literal: true
2
+
3
+ module Decidim
4
+ module Elections
5
+ module Votes
6
+ class VoteAcceptedEvent < Decidim::Events::SimpleEvent
7
+ # This event sends a notification with the vote hash and further instructions
8
+ i18n_attributes :resource_name, :encrypted_vote_hash, :verify_url
9
+
10
+ def resource_name
11
+ @resource_name ||= translated_attribute(resource.title)
12
+ end
13
+
14
+ def encrypted_vote_hash
15
+ extra[:vote]["encrypted_vote_hash"]
16
+ end
17
+
18
+ def verify_url
19
+ Decidim::EngineRouter.main_proxy(resource.component).verify_election_vote_url(resource)
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,44 @@
1
+ # frozen-string_literal: true
2
+
3
+ module Decidim
4
+ module Votings
5
+ module PollingOfficers
6
+ class PollingStationAssignedEvent < Decidim::Events::SimpleEvent
7
+ # This event sends a notification when a polling station is assigned to a polling officer
8
+
9
+ delegate :organization, to: :user, prefix: false
10
+ delegate :url_helpers, to: "Decidim::Core::Engine.routes"
11
+
12
+ i18n_attributes :polling_station_name, :polling_officer_zone_url, :role
13
+
14
+ def polling_station_name
15
+ @polling_station_name ||= translated_attribute(polling_station.title)
16
+ end
17
+
18
+ def polling_officer_zone_url
19
+ url_helpers.decidim_votings_polling_officer_zone_url(host: organization.host)
20
+ end
21
+
22
+ def role
23
+ I18n.t(polling_officer.role, scope: "decidim.votings.polling_officers.roles")
24
+ end
25
+
26
+ private
27
+
28
+ def polling_officer
29
+ @polling_officer ||= Decidim::Votings::PollingOfficer.find_by(id: extra[:polling_officer_id])
30
+ end
31
+
32
+ def polling_station
33
+ @polling_station ||=
34
+ case polling_officer.role
35
+ when :president
36
+ polling_officer.presided_polling_station
37
+ when :manager
38
+ polling_officer.managed_polling_station
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Elections
5
+ module Admin
6
+ # This class holds a form to perform an action on the BB.
7
+ class ActionForm < Decidim::Form
8
+ validates :pending_action, absence: true
9
+
10
+ def messages
11
+ @messages ||= {}
12
+ end
13
+
14
+ def current_step
15
+ @current_step ||= election.bb_status
16
+ end
17
+
18
+ def election
19
+ @election ||= context[:election]
20
+ end
21
+
22
+ def pending_action
23
+ return @pending_action if defined?(@pending_action)
24
+
25
+ @pending_action = election.actions.pending.first
26
+ end
27
+
28
+ def bulletin_board
29
+ @bulletin_board ||= context[:bulletin_board] || Decidim::Elections.bulletin_board
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -6,15 +6,16 @@ module Decidim
6
6
  # This class holds a Form to create/update answers from Decidim's admin panel.
7
7
  class AnswerForm < Decidim::Form
8
8
  include TranslatableAttributes
9
+ include AttachmentAttributes
9
10
 
10
11
  translatable_attribute :title, String
11
12
  translatable_attribute :description, String
12
13
  attribute :proposal_ids, Array[Integer]
13
14
  attribute :attachment, AttachmentForm
14
- attribute :photos, Array[String]
15
- attribute :add_photos, Array
16
15
  attribute :weight, Integer, default: 0
17
16
 
17
+ attachments_attribute :photos
18
+
18
19
  validates :title, translatable_presence: true
19
20
  validate :notify_missing_attachment_if_errored
20
21
 
@@ -6,14 +6,15 @@ module Decidim
6
6
  # This class holds a Form to create/update elections from Decidim's admin panel.
7
7
  class ElectionForm < Decidim::Form
8
8
  include TranslatableAttributes
9
+ include AttachmentAttributes
9
10
 
10
11
  translatable_attribute :title, String
11
12
  translatable_attribute :description, String
12
13
  attribute :start_time, Decidim::Attributes::TimeWithZone
13
14
  attribute :end_time, Decidim::Attributes::TimeWithZone
14
15
  attribute :attachment, AttachmentForm
15
- attribute :photos, Array[String]
16
- attribute :add_photos, Array
16
+
17
+ attachments_attribute :photos
17
18
 
18
19
  validates :title, translatable_presence: true
19
20
  validates :description, translatable_presence: true
@@ -0,0 +1,79 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Elections
5
+ module Admin
6
+ # This class holds a form to setup elections from Decidim's admin panel.
7
+ class SetupForm < Decidim::Form
8
+ mimic :setup
9
+
10
+ attribute :trustee_ids, Array[Integer]
11
+
12
+ validate do
13
+ validations.each do |message, t_args, valid|
14
+ errors.add(message, I18n.t("steps.create_election.errors.#{message}", **t_args, scope: "decidim.elections.admin")) unless valid
15
+ end
16
+ end
17
+
18
+ def current_step; end
19
+
20
+ def pending_action; end
21
+
22
+ def trustee_ids
23
+ choose_random_trustees
24
+ end
25
+
26
+ def trustees
27
+ ids = trustee_ids
28
+ @trustees ||= Decidim::Elections::Trustees::ByParticipatorySpaceTrusteeIds.new(ids).to_a.sort_by(&:id)
29
+ end
30
+
31
+ def validations
32
+ @validations ||= [
33
+ [:minimum_questions, {}, election.questions.any?],
34
+ [:minimum_answers, {}, election.minimum_answers?],
35
+ [:max_selections, {}, election.valid_questions?],
36
+ [:published, {}, election.published_at.present?],
37
+ [:time_before, { hours: Decidim::Elections.setup_minimum_hours_before_start }, election.minimum_hours_before_start?],
38
+ [:trustees_number, { number: bulletin_board.number_of_trustees }, participatory_space_trustees_with_public_key.size >= bulletin_board.number_of_trustees]
39
+ ].freeze
40
+ end
41
+
42
+ def messages
43
+ @messages ||= validations.map do |message, t_args, _valid|
44
+ [message, I18n.t("steps.create_election.requirements.#{message}", **t_args, scope: "decidim.elections.admin")]
45
+ end.to_h
46
+ end
47
+
48
+ def participatory_space_trustees
49
+ @participatory_space_trustees ||= Decidim::Elections::Trustees::ByParticipatorySpace.new(election.component.participatory_space).to_a
50
+ end
51
+
52
+ def election
53
+ @election ||= context[:election]
54
+ end
55
+
56
+ def bulletin_board
57
+ @bulletin_board ||= context[:bulletin_board] || Decidim::Elections.bulletin_board
58
+ end
59
+
60
+ private
61
+
62
+ def choose_random_trustees
63
+ return @trustee_ids if @trustee_ids.any? || defined?(@trustees)
64
+
65
+ @trustees = if participatory_space_trustees_with_public_key.count >= bulletin_board.number_of_trustees
66
+ participatory_space_trustees_with_public_key.sample(bulletin_board.number_of_trustees)
67
+ else
68
+ []
69
+ end
70
+ @trustee_ids = @trustees.pluck(:id)
71
+ end
72
+
73
+ def participatory_space_trustees_with_public_key
74
+ @participatory_space_trustees_with_public_key ||= participatory_space_trustees.filter { |trustee| trustee.public_key.present? }
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Elections
5
+ module Admin
6
+ # This class holds a form to add users as trustees from Decidim's admin panel.
7
+ class TrusteesParticipatorySpaceForm < Decidim::Form
8
+ attribute :user_id, Integer
9
+
10
+ validates :user_id, presence: true
11
+
12
+ def map_model(trustee)
13
+ self.user_id = trustee.decidim_user_id
14
+ end
15
+
16
+ def user
17
+ @user ||= current_organization.users.find_by(id: user_id)
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Elections
5
+ module Admin
6
+ # This class holds a form to start and end the voting period.
7
+ class VotePeriodForm < ActionForm
8
+ validate do
9
+ validations.each do |message, t_args, valid|
10
+ errors.add(message, I18n.t("steps.#{current_step}.errors.#{message}", **t_args, scope: "decidim.elections.admin")) unless valid
11
+ end
12
+ end
13
+
14
+ def validations
15
+ @validations ||= if current_step == "key_ceremony_ended"
16
+ [
17
+ [:time_before,
18
+ { start_time: I18n.l(election.start_time, format: :long),
19
+ hours: Decidim::Elections.start_vote_maximum_hours_before_start },
20
+ election.maximum_hours_before_start?]
21
+ ].freeze
22
+ else
23
+ [
24
+ [:time_after, { end_time: I18n.l(election.end_time, format: :long) }, election.finished?]
25
+ ].freeze
26
+ end
27
+ end
28
+
29
+ def messages
30
+ @messages ||= validations.map do |message, t_args, _valid|
31
+ [message, I18n.t("steps.#{current_step}.requirements.#{message}", **t_args, scope: "decidim.elections.admin")]
32
+ end.to_h
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Elections
5
+ module Ballot
6
+ # This class holds the data to verify a vote.
7
+ class VerifyVoteForm < Decidim::Form
8
+ attribute :vote_identifier, String
9
+
10
+ validates :vote_identifier, :election, presence: true
11
+
12
+ delegate :id, to: :election, prefix: true
13
+
14
+ def election_unique_id
15
+ @election_unique_id ||= Decidim::BulletinBoard::MessageIdentifier.unique_election_id(bulletin_board.authority_slug, election_id)
16
+ end
17
+
18
+ # Public: returns the associated election for the vote.
19
+ def election
20
+ @election ||= context.election
21
+ end
22
+
23
+ def bulletin_board
24
+ @bulletin_board ||= context[:bulletin_board] || Decidim::Elections.bulletin_board
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end