decidim-proposals 0.27.5 → 0.28.0.rc4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (273) hide show
  1. checksums.yaml +4 -4
  2. data/app/cells/decidim/proposals/collaborative_draft_cell.rb +1 -1
  3. data/app/cells/decidim/proposals/collaborative_draft_l_cell.rb +16 -0
  4. data/app/cells/decidim/proposals/collaborative_draft_link_to_proposal/show.erb +4 -12
  5. data/app/cells/decidim/proposals/collaborative_draft_link_to_proposal_cell.rb +0 -29
  6. data/app/cells/decidim/proposals/collaborative_draft_metadata_cell.rb +30 -0
  7. data/app/cells/decidim/proposals/content_blocks/highlighted_proposals_cell.rb +2 -8
  8. data/app/cells/decidim/proposals/cost_report/show.erb +5 -34
  9. data/app/cells/decidim/proposals/cost_report_cell.rb +0 -13
  10. data/app/cells/decidim/proposals/highlighted_proposals_for_component/show.erb +29 -17
  11. data/app/cells/decidim/proposals/highlighted_proposals_for_component_cell.rb +34 -8
  12. data/app/cells/decidim/proposals/irreversible_action_modal/show.erb +9 -17
  13. data/app/cells/decidim/proposals/irreversible_action_modal_cell.rb +7 -9
  14. data/app/cells/decidim/proposals/participatory_text_proposal/buttons.erb +21 -31
  15. data/app/cells/decidim/proposals/participatory_text_proposal/show.erb +5 -9
  16. data/app/cells/decidim/proposals/participatory_text_proposal_cell.rb +0 -9
  17. data/app/cells/decidim/proposals/proposal_activity_cell.rb +1 -12
  18. data/app/cells/decidim/proposals/proposal_cell.rb +6 -1
  19. data/app/cells/decidim/proposals/proposal_l_cell.rb +47 -0
  20. data/app/cells/decidim/proposals/proposal_link_to_collaborative_draft_cell.rb +6 -4
  21. data/app/cells/decidim/proposals/proposal_link_to_rejected_emendation_cell.rb +9 -7
  22. data/app/cells/decidim/proposals/proposal_linked_resources/show.erb +3 -8
  23. data/app/cells/decidim/proposals/proposal_metadata_cell.rb +61 -0
  24. data/app/cells/decidim/proposals/proposal_s_cell.rb +21 -0
  25. data/app/cells/decidim/proposals/proposals_picker/show.erb +13 -13
  26. data/app/cells/decidim/proposals/proposals_picker_cell.rb +15 -38
  27. data/app/commands/decidim/proposals/accept_access_to_collaborative_draft.rb +1 -1
  28. data/app/commands/decidim/proposals/admin/answer_proposal.rb +1 -1
  29. data/app/commands/decidim/proposals/admin/assign_proposals_to_valuator.rb +3 -3
  30. data/app/commands/decidim/proposals/admin/create_proposal.rb +2 -2
  31. data/app/commands/decidim/proposals/admin/create_proposal_note.rb +4 -4
  32. data/app/commands/decidim/proposals/admin/discard_participatory_text.rb +1 -1
  33. data/app/commands/decidim/proposals/admin/import_participatory_text.rb +1 -1
  34. data/app/commands/decidim/proposals/admin/import_proposals.rb +2 -13
  35. data/app/commands/decidim/proposals/admin/merge_proposals.rb +1 -1
  36. data/app/commands/decidim/proposals/admin/notify_proposal_answer.rb +3 -3
  37. data/app/commands/decidim/proposals/admin/publish_answers.rb +1 -1
  38. data/app/commands/decidim/proposals/admin/publish_participatory_text.rb +2 -2
  39. data/app/commands/decidim/proposals/admin/split_proposals.rb +1 -1
  40. data/app/commands/decidim/proposals/admin/unassign_proposals_from_valuator.rb +2 -2
  41. data/app/commands/decidim/proposals/admin/update_participatory_text.rb +1 -1
  42. data/app/commands/decidim/proposals/admin/update_proposal.rb +5 -1
  43. data/app/commands/decidim/proposals/admin/update_proposal_scope.rb +1 -1
  44. data/app/commands/decidim/proposals/create_collaborative_draft.rb +13 -3
  45. data/app/commands/decidim/proposals/create_proposal.rb +14 -5
  46. data/app/commands/decidim/proposals/hashtags_methods.rb +1 -1
  47. data/app/commands/decidim/proposals/publish_proposal.rb +1 -1
  48. data/app/commands/decidim/proposals/reject_access_to_collaborative_draft.rb +1 -1
  49. data/app/commands/decidim/proposals/request_access_to_collaborative_draft.rb +1 -1
  50. data/app/commands/decidim/proposals/unvote_proposal.rb +2 -2
  51. data/app/commands/decidim/proposals/update_collaborative_draft.rb +12 -2
  52. data/app/commands/decidim/proposals/update_proposal.rb +16 -14
  53. data/app/commands/decidim/proposals/vote_proposal.rb +2 -2
  54. data/app/controllers/concerns/decidim/proposals/admin/filterable.rb +4 -13
  55. data/app/controllers/decidim/proposals/admin/proposal_answers_controller.rb +2 -2
  56. data/app/controllers/decidim/proposals/admin/proposal_notes_controller.rb +1 -1
  57. data/app/controllers/decidim/proposals/admin/proposals_controller.rb +2 -2
  58. data/app/controllers/decidim/proposals/collaborative_drafts_controller.rb +3 -9
  59. data/app/controllers/decidim/proposals/proposal_votes_controller.rb +3 -3
  60. data/app/controllers/decidim/proposals/proposals_controller.rb +42 -12
  61. data/app/events/decidim/proposals/accepted_proposal_event.rb +1 -1
  62. data/app/events/decidim/proposals/admin/proposal_note_created_event.rb +1 -1
  63. data/app/events/decidim/proposals/admin/update_proposal_category_event.rb +1 -1
  64. data/app/events/decidim/proposals/admin/update_proposal_scope_event.rb +1 -1
  65. data/app/events/decidim/proposals/collaborative_draft_access_accepted_event.rb +1 -1
  66. data/app/events/decidim/proposals/collaborative_draft_access_rejected_event.rb +1 -1
  67. data/app/events/decidim/proposals/collaborative_draft_access_request_event.rb +1 -1
  68. data/app/events/decidim/proposals/collaborative_draft_access_requested_event.rb +1 -1
  69. data/app/events/decidim/proposals/collaborative_draft_access_requester_accepted_event.rb +1 -1
  70. data/app/events/decidim/proposals/collaborative_draft_access_requester_rejected_event.rb +1 -1
  71. data/app/events/decidim/proposals/collaborative_draft_withdrawn_event.rb +1 -1
  72. data/app/events/decidim/proposals/evaluating_proposal_event.rb +1 -1
  73. data/app/events/decidim/proposals/proposal_endorsed_event.rb +1 -1
  74. data/app/events/decidim/proposals/proposal_mentioned_event.rb +1 -1
  75. data/app/events/decidim/proposals/publish_proposal_event.rb +1 -1
  76. data/app/events/decidim/proposals/rejected_proposal_event.rb +1 -1
  77. data/app/forms/decidim/proposals/admin/import_participatory_text_form.rb +1 -1
  78. data/app/forms/decidim/proposals/admin/proposal_base_form.rb +2 -2
  79. data/app/forms/decidim/proposals/admin/proposal_form.rb +1 -1
  80. data/app/forms/decidim/proposals/admin/proposals_fork_form.rb +1 -1
  81. data/app/forms/decidim/proposals/admin/valuation_assignment_form.rb +1 -1
  82. data/app/forms/decidim/proposals/proposal_form.rb +9 -27
  83. data/app/helpers/decidim/proposals/admin/proposal_bulk_actions_helper.rb +1 -1
  84. data/app/helpers/decidim/proposals/admin/proposals_helper.rb +13 -13
  85. data/app/helpers/decidim/proposals/application_helper.rb +79 -27
  86. data/app/helpers/decidim/proposals/collaborative_draft_helper.rb +44 -4
  87. data/app/helpers/decidim/proposals/map_helper.rb +3 -4
  88. data/app/helpers/decidim/proposals/participatory_texts_helper.rb +1 -9
  89. data/app/helpers/decidim/proposals/proposal_cells_helper.rb +1 -1
  90. data/app/helpers/decidim/proposals/proposal_votes_helper.rb +2 -24
  91. data/app/helpers/decidim/proposals/proposal_wizard_helper.rb +14 -81
  92. data/app/helpers/decidim/proposals/proposals_helper.rb +0 -12
  93. data/app/jobs/decidim/proposals/hide_all_created_by_author_job.rb +20 -0
  94. data/app/jobs/decidim/proposals/notify_proposals_mentioned_job.rb +1 -1
  95. data/app/jobs/decidim/proposals/settings_change_job.rb +2 -2
  96. data/app/models/decidim/proposals/collaborative_draft.rb +4 -16
  97. data/app/models/decidim/proposals/proposal.rb +19 -14
  98. data/app/models/decidim/proposals/proposal_vote.rb +3 -3
  99. data/app/packs/documents/decidim/proposals/participatory_texts/participatory_text.md +9 -4
  100. data/app/packs/entrypoints/decidim_proposals.js +4 -0
  101. data/app/packs/entrypoints/decidim_proposals_admin.js +0 -1
  102. data/app/packs/images/decidim/gamification/badges/decidim_gamification_badges_accepted_proposals.svg +68 -1
  103. data/app/packs/images/decidim/gamification/badges/decidim_gamification_badges_proposal_votes.svg +34 -1
  104. data/app/packs/images/decidim/gamification/badges/decidim_gamification_badges_proposals.svg +64 -1
  105. data/app/packs/src/decidim/proposals/add_proposal.js +25 -39
  106. data/app/packs/src/decidim/proposals/choose_proposals.js +20 -0
  107. data/app/packs/stylesheets/decidim/proposals/proposals.scss +97 -0
  108. data/app/permissions/decidim/proposals/admin/permissions.rb +3 -3
  109. data/app/permissions/decidim/proposals/permissions.rb +1 -1
  110. data/app/presenters/decidim/proposals/admin_log/proposal_note_presenter.rb +2 -2
  111. data/app/presenters/decidim/proposals/admin_log/proposal_presenter.rb +2 -2
  112. data/app/presenters/decidim/proposals/admin_log/valuation_assignment_presenter.rb +2 -2
  113. data/app/presenters/decidim/proposals/proposal_presenter.rb +6 -2
  114. data/app/services/decidim/proposals/diff_renderer.rb +3 -3
  115. data/app/services/decidim/proposals/proposal_builder.rb +6 -6
  116. data/app/views/decidim/proposals/admin/participatory_texts/_article-preview.html.erb +2 -4
  117. data/app/views/decidim/proposals/admin/participatory_texts/_bulk-actions.html.erb +2 -2
  118. data/app/views/decidim/proposals/admin/participatory_texts/index.html.erb +58 -46
  119. data/app/views/decidim/proposals/admin/participatory_texts/new_import.html.erb +31 -33
  120. data/app/views/decidim/proposals/admin/proposal_answers/_form.html.erb +17 -11
  121. data/app/views/decidim/proposals/admin/proposal_notes/_form.html.erb +5 -6
  122. data/app/views/decidim/proposals/admin/proposal_notes/_proposal_notes.html.erb +28 -36
  123. data/app/views/decidim/proposals/admin/proposals/_bulk-actions.html.erb +27 -30
  124. data/app/views/decidim/proposals/admin/proposals/_documents.html.erb +13 -0
  125. data/app/views/decidim/proposals/admin/proposals/_endorsers.html.erb +25 -0
  126. data/app/views/decidim/proposals/admin/proposals/_form.html.erb +70 -90
  127. data/app/views/decidim/proposals/admin/proposals/_meetings.html.erb +13 -0
  128. data/app/views/decidim/proposals/admin/proposals/_photos.html.erb +13 -0
  129. data/app/views/decidim/proposals/admin/proposals/_proposal-tr.html.erb +30 -24
  130. data/app/views/decidim/proposals/admin/proposals/bulk_actions/_assign_to_valuator.html.erb +3 -3
  131. data/app/views/decidim/proposals/admin/proposals/bulk_actions/_dropdown.html.erb +3 -2
  132. data/app/views/decidim/proposals/admin/proposals/bulk_actions/_merge.html.erb +4 -4
  133. data/app/views/decidim/proposals/admin/proposals/bulk_actions/_publish_answers.html.erb +3 -3
  134. data/app/views/decidim/proposals/admin/proposals/bulk_actions/_recategorize.html.erb +3 -3
  135. data/app/views/decidim/proposals/admin/proposals/bulk_actions/_scope-change.html.erb +4 -8
  136. data/app/views/decidim/proposals/admin/proposals/bulk_actions/_split.html.erb +3 -3
  137. data/app/views/decidim/proposals/admin/proposals/bulk_actions/_unassign_from_valuator.html.erb +3 -3
  138. data/app/views/decidim/proposals/admin/proposals/edit.html.erb +17 -7
  139. data/app/views/decidim/proposals/admin/proposals/index.html.erb +50 -63
  140. data/app/views/decidim/proposals/admin/proposals/new.html.erb +16 -6
  141. data/app/views/decidim/proposals/admin/proposals/publish_answers.js.erb +2 -2
  142. data/app/views/decidim/proposals/admin/proposals/show.html.erb +204 -162
  143. data/app/views/decidim/proposals/admin/proposals/update_attribute.js.erb +4 -4
  144. data/app/views/decidim/proposals/admin/proposals_imports/new.html.erb +48 -34
  145. data/app/views/decidim/proposals/collaborative_drafts/_accept_request_access_form.html.erb +1 -1
  146. data/app/views/decidim/proposals/collaborative_drafts/_actions.html.erb +7 -0
  147. data/app/views/decidim/proposals/collaborative_drafts/_collaborative_draft_aside.html.erb +53 -0
  148. data/app/views/decidim/proposals/collaborative_drafts/_collaborative_drafts.html.erb +12 -13
  149. data/app/views/decidim/proposals/collaborative_drafts/_collaborator_requests.html.erb +8 -12
  150. data/app/views/decidim/proposals/collaborative_drafts/_edit_form_fields.html.erb +26 -54
  151. data/app/views/decidim/proposals/collaborative_drafts/_reject_request_access_form.html.erb +1 -3
  152. data/app/views/decidim/proposals/collaborative_drafts/_request_access_form.html.erb +1 -1
  153. data/app/views/decidim/proposals/collaborative_drafts/edit.html.erb +23 -25
  154. data/app/views/decidim/proposals/collaborative_drafts/index.html.erb +30 -22
  155. data/app/views/decidim/proposals/collaborative_drafts/index.js.erb +0 -5
  156. data/app/views/decidim/proposals/collaborative_drafts/new.html.erb +22 -18
  157. data/app/views/decidim/proposals/collaborative_drafts/show.html.erb +39 -109
  158. data/app/views/decidim/proposals/proposal_votes/update_buttons_and_counters.js.erb +2 -2
  159. data/app/views/decidim/proposals/proposals/_actions.html.erb +13 -0
  160. data/app/views/decidim/proposals/proposals/_edit_form_fields.html.erb +31 -70
  161. data/app/views/decidim/proposals/proposals/_linked_proposals.html.erb +3 -35
  162. data/app/views/decidim/proposals/proposals/_proposal_aside.html.erb +40 -0
  163. data/app/views/decidim/proposals/proposals/_proposals.html.erb +18 -39
  164. data/app/views/decidim/proposals/proposals/_proposals_picker.html.erb +5 -0
  165. data/app/views/decidim/proposals/proposals/_remaining_votes_count.html.erb +3 -3
  166. data/app/views/decidim/proposals/proposals/_vote_button.html.erb +16 -17
  167. data/app/views/decidim/proposals/proposals/_votes_count.html.erb +3 -6
  168. data/app/views/decidim/proposals/proposals/_voting_rules.html.erb +28 -41
  169. data/app/views/decidim/proposals/proposals/_wizard_header.html.erb +19 -25
  170. data/app/views/decidim/proposals/proposals/compare.html.erb +17 -16
  171. data/app/views/decidim/proposals/proposals/complete.html.erb +26 -21
  172. data/app/views/decidim/proposals/proposals/edit.html.erb +32 -27
  173. data/app/views/decidim/proposals/proposals/edit_draft.html.erb +21 -19
  174. data/app/views/decidim/proposals/proposals/index.html.erb +56 -47
  175. data/app/views/decidim/proposals/proposals/index.js.erb +0 -5
  176. data/app/views/decidim/proposals/proposals/new.html.erb +30 -35
  177. data/app/views/decidim/proposals/proposals/participatory_texts/_proposal_vote_button.html.erb +5 -5
  178. data/app/views/decidim/proposals/proposals/participatory_texts/_view_index.html.erb +15 -8
  179. data/app/views/decidim/proposals/proposals/participatory_texts/participatory_text.html.erb +32 -15
  180. data/app/views/decidim/proposals/proposals/preview.html.erb +37 -34
  181. data/app/views/decidim/proposals/proposals/show.html.erb +90 -106
  182. data/app/views/decidim/proposals/versions/show.html.erb +13 -5
  183. data/config/assets.rb +0 -1
  184. data/config/brakeman.ignore +31 -56
  185. data/config/locales/ar.yml +17 -156
  186. data/config/locales/bg.yml +0 -28
  187. data/config/locales/ca.yml +62 -118
  188. data/config/locales/cs.yml +71 -129
  189. data/config/locales/de.yml +66 -122
  190. data/config/locales/el.yml +54 -121
  191. data/config/locales/en.yml +76 -132
  192. data/config/locales/es-MX.yml +70 -126
  193. data/config/locales/es-PY.yml +69 -125
  194. data/config/locales/es.yml +66 -122
  195. data/config/locales/eu.yml +71 -127
  196. data/config/locales/fi-plain.yml +63 -119
  197. data/config/locales/fi.yml +63 -119
  198. data/config/locales/fr-CA.yml +66 -123
  199. data/config/locales/fr.yml +70 -127
  200. data/config/locales/ga-IE.yml +0 -32
  201. data/config/locales/gl.yml +7 -129
  202. data/config/locales/hu.yml +35 -134
  203. data/config/locales/id-ID.yml +5 -113
  204. data/config/locales/is-IS.yml +0 -56
  205. data/config/locales/it.yml +7 -142
  206. data/config/locales/ja.yml +61 -122
  207. data/config/locales/lb.yml +0 -5
  208. data/config/locales/lt.yml +61 -126
  209. data/config/locales/lv.yml +9 -143
  210. data/config/locales/nl.yml +8 -143
  211. data/config/locales/no.yml +7 -133
  212. data/config/locales/pl.yml +11 -148
  213. data/config/locales/pt-BR.yml +10 -166
  214. data/config/locales/pt.yml +7 -141
  215. data/config/locales/ro-RO.yml +9 -145
  216. data/config/locales/ru.yml +1 -64
  217. data/config/locales/sk.yml +11 -140
  218. data/config/locales/sr-CS.yml +0 -23
  219. data/config/locales/sv.yml +19 -142
  220. data/config/locales/tr-TR.yml +8 -141
  221. data/config/locales/uk.yml +1 -64
  222. data/config/locales/zh-CN.yml +5 -134
  223. data/config/locales/zh-TW.yml +31 -107
  224. data/db/migrate/20170307085300_migrate_proposal_reports_data_to_reports.rb +1 -1
  225. data/db/migrate/20230427105700_change_states_on_collaborative_drafts.rb +34 -0
  226. data/db/migrate/20230427105700_change_states_on_proposals.rb +34 -0
  227. data/lib/decidim/api/proposals_type.rb +2 -2
  228. data/lib/decidim/proposals/component.rb +11 -289
  229. data/lib/decidim/proposals/doc_to_markdown.rb +0 -4
  230. data/lib/decidim/proposals/engine.rb +43 -7
  231. data/lib/decidim/proposals/import/proposal_answer_creator.rb +1 -1
  232. data/lib/decidim/proposals/import/proposal_creator.rb +10 -10
  233. data/lib/decidim/proposals/markdown_to_proposals.rb +8 -2
  234. data/lib/decidim/proposals/proposal_serializer.rb +4 -4
  235. data/lib/decidim/proposals/seeds.rb +278 -0
  236. data/lib/decidim/proposals/test/factories.rb +62 -22
  237. data/lib/decidim/proposals/version.rb +1 -1
  238. metadata +53 -63
  239. data/app/cells/decidim/proposals/collaborative_draft_m/footer.erb +0 -6
  240. data/app/cells/decidim/proposals/collaborative_draft_m/tags.erb +0 -1
  241. data/app/cells/decidim/proposals/collaborative_draft_m_cell.rb +0 -44
  242. data/app/cells/decidim/proposals/content_blocks/highlighted_proposals/elements.erb +0 -5
  243. data/app/cells/decidim/proposals/content_blocks/highlighted_proposals/heading.erb +0 -1
  244. data/app/cells/decidim/proposals/proposal_link_to_rejected_emendation/show.erb +0 -9
  245. data/app/cells/decidim/proposals/proposal_m/footer.erb +0 -26
  246. data/app/cells/decidim/proposals/proposal_m/tags.erb +0 -1
  247. data/app/cells/decidim/proposals/proposal_m_cell.rb +0 -151
  248. data/app/cells/decidim/proposals/proposal_tags/show.erb +0 -33
  249. data/app/cells/decidim/proposals/proposal_tags_cell.rb +0 -35
  250. data/app/cells/decidim/proposals/proposals_picker/proposals.erb +0 -12
  251. data/app/controllers/concerns/decidim/proposals/admin/picker.rb +0 -21
  252. data/app/controllers/decidim/proposals/widgets_controller.rb +0 -19
  253. data/app/helpers/decidim/proposals/admin/filterable_helper.rb +0 -17
  254. data/app/helpers/decidim/proposals/admin/proposals_picker_helper.rb +0 -30
  255. data/app/packs/src/decidim/proposals/admin/proposals_picker.js +0 -50
  256. data/app/packs/stylesheets/decidim/proposals/_proposals.scss +0 -1
  257. data/app/packs/stylesheets/decidim/proposals/proposals/_preview.scss +0 -3
  258. data/app/views/decidim/proposals/collaborative_drafts/_count.html.erb +0 -1
  259. data/app/views/decidim/proposals/collaborative_drafts/_filters.html.erb +0 -32
  260. data/app/views/decidim/proposals/collaborative_drafts/_filters_small_view.html.erb +0 -18
  261. data/app/views/decidim/proposals/collaborative_drafts/_new_collaborative_draft_button.html.erb +0 -11
  262. data/app/views/decidim/proposals/collaborative_drafts/_wizard_aside.html.erb +0 -13
  263. data/app/views/decidim/proposals/collaborative_drafts/_wizard_header.html.erb +0 -14
  264. data/app/views/decidim/proposals/proposals/_count.html.erb +0 -1
  265. data/app/views/decidim/proposals/proposals/_dynamic_map_instructions.html.erb +0 -4
  266. data/app/views/decidim/proposals/proposals/_filters.html.erb +0 -48
  267. data/app/views/decidim/proposals/proposals/_filters_small_view.html.erb +0 -18
  268. data/app/views/decidim/proposals/proposals/_proposal_similar.html.erb +0 -22
  269. data/app/views/decidim/proposals/proposals/_wizard_aside.html.erb +0 -20
  270. data/app/views/decidim/proposals/proposals/participatory_texts/_index.html.erb +0 -19
  271. data/app/views/decidim/proposals/versions/index.html.erb +0 -16
  272. data/config/environment.rb +0 -3
  273. data/lib/decidim/proposals/test/capybara_proposals_picker.rb +0 -59
@@ -0,0 +1,278 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "decidim/components/namer"
4
+ require "decidim/faker/localized"
5
+
6
+ module Decidim
7
+ module Proposals
8
+ class Seeds < Decidim::Seeds
9
+ attr_reader :participatory_space
10
+
11
+ def initialize(participatory_space:)
12
+ @participatory_space = participatory_space
13
+ end
14
+
15
+ def call
16
+ component = create_component!
17
+
18
+ 5.times do |n|
19
+ proposal = create_proposal!(component:)
20
+
21
+ emendation = create_emendation!(proposal:) if proposal.state.nil?
22
+
23
+ (n % 3).times do |_m|
24
+ create_proposal_votes!(proposal:, emendation:)
25
+ end
26
+
27
+ (n % 3).times do
28
+ create_proposal_notes!(proposal:)
29
+ end
30
+
31
+ Decidim::Comments::Seed.comments_for(proposal)
32
+
33
+ create_collaborative_draft!(component:)
34
+ end
35
+
36
+ update_traceability!(component:)
37
+ end
38
+
39
+ def organization
40
+ @organization ||= participatory_space.organization
41
+ end
42
+
43
+ def create_component!
44
+ step_settings = if participatory_space.allows_steps?
45
+ { participatory_space.active_step.id => { votes_enabled: true, votes_blocked: false, creation_enabled: true } }
46
+ else
47
+ {}
48
+ end
49
+
50
+ params = {
51
+ name: Decidim::Components::Namer.new(participatory_space.organization.available_locales, :proposals).i18n_name,
52
+ manifest_name: :proposals,
53
+ published_at: Time.current,
54
+ participatory_space:,
55
+ settings: {
56
+ vote_limit: 0,
57
+ collaborative_drafts_enabled: true
58
+ },
59
+ step_settings:
60
+ }
61
+
62
+ Decidim.traceability.perform_action!(
63
+ "publish",
64
+ Decidim::Component,
65
+ admin_user,
66
+ visibility: "all"
67
+ ) do
68
+ Decidim::Component.create!(params)
69
+ end
70
+ end
71
+
72
+ def create_proposal!(component:)
73
+ n = rand(5)
74
+ state, answer, state_published_at = if n > 3
75
+ ["accepted", Decidim::Faker::Localized.sentence(word_count: 10), Time.current]
76
+ elsif n > 2
77
+ ["rejected", nil, Time.current]
78
+ elsif n > 1
79
+ ["evaluating", nil, Time.current]
80
+ elsif n.positive?
81
+ ["accepted", Decidim::Faker::Localized.sentence(word_count: 10), nil]
82
+ else
83
+ ["not_answered", nil, nil]
84
+ end
85
+
86
+ params = {
87
+ component:,
88
+ category: participatory_space.categories.sample,
89
+ scope: random_scope(participatory_space:),
90
+ title: { en: ::Faker::Lorem.sentence(word_count: 2) },
91
+ body: { en: ::Faker::Lorem.paragraphs(number: 2).join("\n") },
92
+ state:,
93
+ answer:,
94
+ answered_at: state.present? ? Time.current : nil,
95
+ state_published_at:,
96
+ published_at: Time.current
97
+ }
98
+
99
+ proposal = Decidim.traceability.perform_action!(
100
+ "publish",
101
+ Decidim::Proposals::Proposal,
102
+ admin_user,
103
+ visibility: "all"
104
+ ) do
105
+ proposal = Decidim::Proposals::Proposal.new(params)
106
+ meeting_component = participatory_space.components.find_by(manifest_name: "meetings")
107
+
108
+ coauthor = case n
109
+ when 0
110
+ Decidim::User.where(organization:).sample
111
+ when 1
112
+ Decidim::UserGroup.where(organization:).sample
113
+ when 2
114
+ Decidim::Meetings::Meeting.where(component: meeting_component).sample
115
+ else
116
+ organization
117
+ end
118
+ proposal.add_coauthor(coauthor)
119
+ proposal.save!
120
+ proposal
121
+ end
122
+ end
123
+
124
+ def random_nickname
125
+ "#{::Faker::Twitter.unique.screen_name}-#{SecureRandom.hex(4)}"[0, 20]
126
+ end
127
+
128
+ def random_email(suffix:)
129
+ r = SecureRandom.hex(4)
130
+
131
+ "#{suffix}-author-#{participatory_space.underscored_name}-#{participatory_space.id}-#{r}@example.org"
132
+ end
133
+
134
+ def create_emendation!(proposal:)
135
+ author = Decidim::User.find_or_initialize_by(email: random_email(suffix: "amendment"))
136
+ author.update!(
137
+ password: "decidim123456789",
138
+ name: "#{::Faker::Name.name} #{participatory_space.id}",
139
+ nickname: random_nickname,
140
+ organization:,
141
+ tos_agreement: "1",
142
+ confirmed_at: Time.current
143
+ )
144
+
145
+ group = Decidim::UserGroup.create!(
146
+ name: ::Faker::Name.name,
147
+ nickname: random_nickname,
148
+ email: ::Faker::Internet.email,
149
+ extended_data: {
150
+ document_number: ::Faker::Code.isbn,
151
+ phone: ::Faker::PhoneNumber.phone_number,
152
+ verified_at: Time.current
153
+ },
154
+ organization:,
155
+ confirmed_at: Time.current
156
+ )
157
+
158
+ Decidim::UserGroupMembership.create!(
159
+ user: author,
160
+ role: "creator",
161
+ user_group: group
162
+ )
163
+
164
+ params = {
165
+ component: proposal.component,
166
+ category: participatory_space.categories.sample,
167
+ scope: random_scope(participatory_space:),
168
+ title: { en: "#{proposal.title["en"]} #{::Faker::Lorem.sentence(word_count: 1)}" },
169
+ body: { en: "#{proposal.body["en"]} #{::Faker::Lorem.sentence(word_count: 3)}" },
170
+ state: "evaluating",
171
+ answer: nil,
172
+ answered_at: Time.current,
173
+ published_at: Time.current
174
+ }
175
+
176
+ emendation = Decidim.traceability.perform_action!(
177
+ "create",
178
+ Decidim::Proposals::Proposal,
179
+ author,
180
+ visibility: "public-only"
181
+ ) do
182
+ emendation = Decidim::Proposals::Proposal.new(params)
183
+ emendation.add_coauthor(author, user_group: author.user_groups.first)
184
+ emendation.save!
185
+ emendation
186
+ end
187
+
188
+ Decidim::Amendment.create!(
189
+ amender: author,
190
+ amendable: proposal,
191
+ emendation:,
192
+ state: "evaluating"
193
+ )
194
+
195
+ emendation
196
+ end
197
+
198
+ def create_proposal_votes!(proposal:, emendation: nil)
199
+ author = Decidim::User.find_or_initialize_by(email: random_email(suffix: "vote"))
200
+ author.update!(
201
+ password: "decidim123456789",
202
+ name: "#{::Faker::Name.name} #{participatory_space.id}",
203
+ nickname: random_nickname,
204
+ organization:,
205
+ tos_agreement: "1",
206
+ confirmed_at: Time.current,
207
+ personal_url: ::Faker::Internet.url,
208
+ about: ::Faker::Lorem.paragraph(sentence_count: 2)
209
+ )
210
+
211
+ Decidim::Proposals::ProposalVote.create!(proposal:, author:) unless proposal.published_state? && proposal.rejected?
212
+ Decidim::Proposals::ProposalVote.create!(proposal: emendation, author:) if emendation
213
+ end
214
+
215
+ def create_proposal_notes!(proposal:)
216
+ author_admin = Decidim::User.where(organization:, admin: true).all.sample
217
+
218
+ Decidim::Proposals::ProposalNote.create!(
219
+ proposal:,
220
+ author: author_admin,
221
+ body: ::Faker::Lorem.paragraphs(number: 2).join("\n")
222
+ )
223
+ end
224
+
225
+ def create_collaborative_draft!(component:)
226
+ n = rand(5)
227
+ state = if n > 3
228
+ "published"
229
+ elsif n > 2
230
+ "withdrawn"
231
+ else
232
+ "open"
233
+ end
234
+ author = Decidim::User.where(organization:).all.sample
235
+
236
+ draft = Decidim.traceability.perform_action!("create", Decidim::Proposals::CollaborativeDraft, author) do
237
+ draft = Decidim::Proposals::CollaborativeDraft.new(
238
+ component:,
239
+ category: participatory_space.categories.sample,
240
+ scope: random_scope(participatory_space:),
241
+ title: ::Faker::Lorem.sentence(word_count: 2),
242
+ body: ::Faker::Lorem.paragraphs(number: 2).join("\n"),
243
+ state:,
244
+ published_at: Time.current
245
+ )
246
+ draft.coauthorships.build(author: participatory_space.organization)
247
+ draft.save!
248
+ draft
249
+ end
250
+
251
+ case n
252
+ when 2
253
+ authors = Decidim::User.where(organization:).all.sample(5)
254
+ authors.each do |local_author|
255
+ Decidim::Coauthorship.create(coauthorable: draft, author: local_author)
256
+ end
257
+ when 3
258
+ author2 = Decidim::User.where(organization:).all.sample
259
+ Decidim::Coauthorship.create(coauthorable: draft, author: author2)
260
+ end
261
+
262
+ Decidim::Comments::Seed.comments_for(draft)
263
+ end
264
+
265
+ def update_traceability!(component:)
266
+ Decidim.traceability.update!(
267
+ Decidim::Proposals::CollaborativeDraft.all.sample,
268
+ Decidim::User.where(organization:).all.sample,
269
+ component:,
270
+ category: participatory_space.categories.sample,
271
+ scope: random_scope(participatory_space:),
272
+ title: ::Faker::Lorem.sentence(word_count: 2),
273
+ body: ::Faker::Lorem.paragraphs(number: 2).join("\n")
274
+ )
275
+ end
276
+ end
277
+ end
278
+ end
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "decidim/components/namer"
3
4
  require "decidim/core/test/factories"
4
5
  require "decidim/participatory_processes/test/factories"
5
6
  require "decidim/meetings/test/factories"
@@ -8,7 +9,7 @@ FactoryBot.define do
8
9
  factory :proposal_component, parent: :component do
9
10
  name { Decidim::Components::Namer.new(participatory_space.organization.available_locales, :proposals).i18n_name }
10
11
  manifest_name { :proposals }
11
- participatory_space { create(:participatory_process, :with_steps, organization: organization) }
12
+ participatory_space { create(:participatory_process, :with_steps, organization:) }
12
13
 
13
14
  trait :with_endorsements_enabled do
14
15
  step_settings do
@@ -57,7 +58,7 @@ FactoryBot.define do
57
58
 
58
59
  settings do
59
60
  {
60
- vote_limit: vote_limit
61
+ vote_limit:
61
62
  }
62
63
  end
63
64
  end
@@ -69,7 +70,7 @@ FactoryBot.define do
69
70
 
70
71
  settings do
71
72
  {
72
- proposal_limit: proposal_limit
73
+ proposal_limit:
73
74
  }
74
75
  end
75
76
  end
@@ -81,7 +82,7 @@ FactoryBot.define do
81
82
 
82
83
  settings do
83
84
  {
84
- proposal_length: proposal_length
85
+ proposal_length:
85
86
  }
86
87
  end
87
88
  end
@@ -139,7 +140,7 @@ FactoryBot.define do
139
140
 
140
141
  settings do
141
142
  {
142
- threshold_per_proposal: threshold_per_proposal
143
+ threshold_per_proposal:
143
144
  }
144
145
  end
145
146
  end
@@ -176,7 +177,7 @@ FactoryBot.define do
176
177
 
177
178
  settings do
178
179
  {
179
- minimum_votes_per_user: minimum_votes_per_user
180
+ minimum_votes_per_user:
180
181
  }
181
182
  end
182
183
  end
@@ -223,8 +224,8 @@ FactoryBot.define do
223
224
  step_settings do
224
225
  {
225
226
  participatory_space.active_step.id => {
226
- automatic_hashtags: automatic_hashtags,
227
- suggested_hashtags: suggested_hashtags,
227
+ automatic_hashtags:,
228
+ suggested_hashtags:,
228
229
  creation_enabled: true
229
230
  }
230
231
  }
@@ -254,14 +255,14 @@ FactoryBot.define do
254
255
  if skip_injection
255
256
  Decidim::Faker::Localized.localized { generate(:title) }
256
257
  else
257
- Decidim::Faker::Localized.localized { "<script>alert(\"TITLE\");</script> #{generate(:title)}" }
258
+ Decidim::Faker::Localized.localized { "<script>alert(\"Proposal TITLE\");</script> #{generate(:title)}" }
258
259
  end
259
260
  end
260
261
  body do
261
262
  if skip_injection
262
263
  Decidim::Faker::Localized.localized { Faker::Lorem.sentences(number: 3).join("\n") }
263
264
  else
264
- Decidim::Faker::Localized.localized { "<script>alert(\"TITLE\");</script> #{Faker::Lorem.sentences(number: 3).join("\n")}" }
265
+ Decidim::Faker::Localized.localized { "<script>alert(\"Proposal BODY\");</script> #{Faker::Lorem.sentences(number: 3).join("\n")}" }
265
266
  end
266
267
  end
267
268
  component { create(:proposal_component) }
@@ -270,8 +271,20 @@ FactoryBot.define do
270
271
  latitude { Faker::Address.latitude }
271
272
  longitude { Faker::Address.longitude }
272
273
  cost { 20_000 }
273
- cost_report { { en: "My cost report" } }
274
- execution_period { { en: "My execution period" } }
274
+ cost_report do
275
+ if skip_injection
276
+ Decidim::Faker::Localized.localized { generate(:title) }
277
+ else
278
+ Decidim::Faker::Localized.localized { "<script>alert(\"Proposal cost report\")</script> #{generate(:title)}" }
279
+ end
280
+ end
281
+ execution_period do
282
+ if skip_injection
283
+ Decidim::Faker::Localized.localized { generate(:title) }
284
+ else
285
+ Decidim::Faker::Localized.localized { "<script>alert(\"Proposal execution period\")</script> #{generate(:title)}" }
286
+ end
287
+ end
275
288
 
276
289
  after(:build) do |proposal, evaluator|
277
290
  proposal.title = if evaluator.title.is_a?(String)
@@ -292,7 +305,7 @@ FactoryBot.define do
292
305
  users = evaluator.users || [create(:user, :confirmed, organization: proposal.component.participatory_space.organization)]
293
306
  users.each_with_index do |user, idx|
294
307
  user_group = evaluator.user_groups[idx]
295
- proposal.coauthorships.build(author: user, user_group: user_group)
308
+ proposal.coauthorships.build(author: user, user_group:)
296
309
  end
297
310
  end
298
311
  end
@@ -318,7 +331,7 @@ FactoryBot.define do
318
331
  proposal.coauthorships.clear
319
332
  user = create(:user, organization: proposal.component.participatory_space.organization)
320
333
  user_group = create(:user_group, :verified, organization: user.organization, users: [user])
321
- proposal.coauthorships.build(author: user, user_group: user_group)
334
+ proposal.coauthorships.build(author: user, user_group:)
322
335
  end
323
336
  end
324
337
 
@@ -333,7 +346,7 @@ FactoryBot.define do
333
346
  after :build do |proposal|
334
347
  proposal.coauthorships.clear
335
348
  component = build(:meeting_component, participatory_space: proposal.component.participatory_space)
336
- proposal.coauthorships.build(author: build(:meeting, component: component))
349
+ proposal.coauthorships.build(author: build(:meeting, component:))
337
350
  end
338
351
  end
339
352
 
@@ -374,7 +387,7 @@ FactoryBot.define do
374
387
  end
375
388
 
376
389
  trait :not_answered do
377
- state { nil }
390
+ state { :not_answered }
378
391
  end
379
392
 
380
393
  trait :draft do
@@ -389,7 +402,7 @@ FactoryBot.define do
389
402
 
390
403
  trait :with_votes do
391
404
  after :create do |proposal|
392
- create_list(:proposal_vote, 5, proposal: proposal)
405
+ create_list(:proposal_vote, 5, proposal:)
393
406
  end
394
407
  end
395
408
 
@@ -429,7 +442,7 @@ FactoryBot.define do
429
442
  amendable { build(:proposal) }
430
443
  emendation { build(:proposal, component: amendable.component) }
431
444
  amender { build(:user, organization: amendable.component.participatory_space.organization) }
432
- state { Decidim::Amendment::STATES.sample }
445
+ state { Decidim::Amendment::STATES.keys.sample }
433
446
  end
434
447
 
435
448
  factory :proposal_note, class: "Decidim::Proposals::ProposalNote" do
@@ -456,11 +469,19 @@ FactoryBot.define do
456
469
  users = evaluator.users || [create(:user, organization: collaborative_draft.component.participatory_space.organization)]
457
470
  users.each_with_index do |user, idx|
458
471
  user_group = evaluator.user_groups[idx]
459
- collaborative_draft.coauthorships.build(author: user, user_group: user_group)
472
+ collaborative_draft.coauthorships.build(author: user, user_group:)
460
473
  end
461
474
  end
462
475
  end
463
476
 
477
+ trait :participant_author do
478
+ after :build do |draft|
479
+ draft.coauthorships.clear
480
+ user = build(:user, organization: draft.component.participatory_space.organization)
481
+ draft.coauthorships.build(author: user)
482
+ end
483
+ end
484
+
464
485
  trait :published do
465
486
  state { "published" }
466
487
  published_at { Time.current }
@@ -476,8 +497,27 @@ FactoryBot.define do
476
497
  end
477
498
 
478
499
  factory :participatory_text, class: "Decidim::Proposals::ParticipatoryText" do
479
- title { { en: "<script>alert(\"TITLE\");</script> #{generate(:title)}" } }
480
- description { { en: "<script>alert(\"DESCRIPTION\");</script>\n#{Faker::Lorem.sentences(number: 3).join("\n")}" } }
500
+ transient do
501
+ skip_injection { false }
502
+ end
503
+
504
+ title do
505
+ if skip_injection
506
+ Decidim::Faker::Localized.localized { generate(:title) }
507
+ else
508
+ Decidim::Faker::Localized.localized { "<script>alert(\"Meetings TITLE\")</script> #{generate(:title)}" }
509
+ end
510
+ end
511
+
512
+ description do
513
+ Decidim::Faker::Localized.wrapped("<p>", "</p>") do
514
+ if skip_injection
515
+ Decidim::Faker::Localized.localized { Faker::Lorem.sentences(number: 3).join("\n") }
516
+ else
517
+ Decidim::Faker::Localized.localized { "<script>alert(\"Meetings description\");</script> #{Faker::Lorem.sentences(number: 3).join("\n")}" }
518
+ end
519
+ end
520
+ end
481
521
  component { create(:proposal_component) }
482
522
  end
483
523
 
@@ -486,7 +526,7 @@ FactoryBot.define do
486
526
  valuator_role do
487
527
  space = proposal.component.participatory_space
488
528
  organization = space.organization
489
- build :participatory_process_user_role, role: :valuator, user: build(:user, organization: organization)
529
+ build :participatory_process_user_role, role: :valuator, user: build(:user, organization:)
490
530
  end
491
531
  end
492
532
  end
@@ -4,7 +4,7 @@ module Decidim
4
4
  # This holds decidim-proposals version.
5
5
  module Proposals
6
6
  def self.version
7
- "0.27.5"
7
+ "0.28.0.rc4"
8
8
  end
9
9
  end
10
10
  end