decidim-proposals 0.29.1 → 0.30.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (202) hide show
  1. checksums.yaml +4 -4
  2. data/app/cells/decidim/proposals/highlighted_proposals_for_component/show.erb +12 -12
  3. data/app/cells/decidim/proposals/highlighted_proposals_for_component_cell.rb +1 -1
  4. data/app/cells/decidim/proposals/participatory_text_proposal_cell.rb +1 -1
  5. data/app/cells/decidim/proposals/proposal_g/show.erb +13 -0
  6. data/app/cells/decidim/proposals/proposal_g_cell.rb +34 -0
  7. data/app/cells/decidim/proposals/proposal_history_cell.rb +107 -0
  8. data/app/cells/decidim/proposals/proposal_l/show.erb +37 -0
  9. data/app/cells/decidim/proposals/proposal_l_cell.rb +26 -18
  10. data/app/cells/decidim/proposals/proposal_metadata_cell.rb +2 -2
  11. data/app/cells/decidim/proposals/proposal_vote/show.erb +75 -0
  12. data/app/cells/decidim/proposals/proposal_vote_cell.rb +43 -0
  13. data/app/commands/decidim/proposals/accept_coauthorship.rb +62 -0
  14. data/app/commands/decidim/proposals/admin/assign_proposals_to_valuator.rb +14 -0
  15. data/app/commands/decidim/proposals/admin/create_proposal.rb +6 -14
  16. data/app/commands/decidim/proposals/admin/create_proposal_note.rb +20 -11
  17. data/app/commands/decidim/proposals/admin/import_proposals.rb +0 -5
  18. data/app/commands/decidim/proposals/admin/merge_proposals.rb +2 -2
  19. data/app/commands/decidim/proposals/admin/proposal_notes_methods.rb +48 -0
  20. data/app/commands/decidim/proposals/admin/reply_proposal_note.rb +92 -0
  21. data/app/commands/decidim/proposals/admin/split_proposals.rb +2 -2
  22. data/app/commands/decidim/proposals/admin/update_proposal.rb +10 -16
  23. data/app/commands/decidim/proposals/admin/update_proposal_taxonomies.rb +34 -0
  24. data/app/commands/decidim/proposals/cancel_coauthorship.rb +32 -0
  25. data/app/commands/decidim/proposals/create_collaborative_draft.rb +1 -2
  26. data/app/commands/decidim/proposals/create_proposal.rb +1 -2
  27. data/app/commands/decidim/proposals/invite_coauthor.rb +45 -0
  28. data/app/commands/decidim/proposals/publish_collaborative_draft.rb +1 -2
  29. data/app/commands/decidim/proposals/reject_coauthorship.rb +54 -0
  30. data/app/commands/decidim/proposals/update_collaborative_draft.rb +1 -2
  31. data/app/commands/decidim/proposals/update_proposal.rb +1 -2
  32. data/app/controllers/concerns/decidim/proposals/admin/filterable.rb +6 -2
  33. data/app/controllers/concerns/decidim/proposals/admin/needs_interpolations.rb +40 -0
  34. data/app/controllers/decidim/proposals/admin/proposal_answers_controller.rb +50 -2
  35. data/app/controllers/decidim/proposals/admin/proposal_notes_controller.rb +18 -0
  36. data/app/controllers/decidim/proposals/admin/proposals_controller.rb +41 -85
  37. data/app/controllers/decidim/proposals/collaborative_drafts_controller.rb +2 -4
  38. data/app/controllers/decidim/proposals/invite_coauthors_controller.rb +87 -0
  39. data/app/controllers/decidim/proposals/proposals_controller.rb +11 -40
  40. data/app/events/decidim/proposals/accepted_coauthorship_event.rb +8 -0
  41. data/app/events/decidim/proposals/admin/proposal_assigned_to_valuator_event.rb +27 -0
  42. data/app/events/decidim/proposals/admin/proposal_note_created_event.rb +5 -0
  43. data/app/events/decidim/proposals/coauthor_accepted_invite_event.rb +49 -0
  44. data/app/events/decidim/proposals/coauthor_invited_event.rb +45 -0
  45. data/app/events/decidim/proposals/coauthor_rejected_invite_event.rb +8 -0
  46. data/app/events/decidim/proposals/rejected_coauthorship_event.rb +8 -0
  47. data/app/events/decidim/proposals/update_proposal_taxonomies_event.rb +9 -0
  48. data/app/forms/decidim/proposals/admin/proposal_answer_form.rb +4 -3
  49. data/app/forms/decidim/proposals/admin/proposal_base_form.rb +3 -31
  50. data/app/forms/decidim/proposals/admin/proposal_form.rb +12 -7
  51. data/app/forms/decidim/proposals/admin/proposals_import_form.rb +6 -14
  52. data/app/forms/decidim/proposals/admin/valuation_assignment_form.rb +4 -1
  53. data/app/forms/decidim/proposals/collaborative_draft_form.rb +0 -8
  54. data/app/forms/decidim/proposals/proposal_form.rb +5 -32
  55. data/app/helpers/decidim/proposals/admin/proposal_bulk_actions_helper.rb +26 -1
  56. data/app/helpers/decidim/proposals/admin/proposals_helper.rb +0 -1
  57. data/app/helpers/decidim/proposals/application_helper.rb +23 -14
  58. data/app/helpers/decidim/proposals/collaborative_draft_helper.rb +7 -7
  59. data/app/helpers/decidim/proposals/map_helper.rb +0 -18
  60. data/app/helpers/decidim/proposals/proposal_votes_helper.rb +15 -2
  61. data/app/jobs/decidim/proposals/admin/proposal_answer_job.rb +20 -0
  62. data/app/models/decidim/proposals/collaborative_draft.rb +10 -1
  63. data/app/models/decidim/proposals/proposal.rb +67 -10
  64. data/app/models/decidim/proposals/proposal_note.rb +11 -0
  65. data/app/models/decidim/proposals/proposal_state.rb +1 -1
  66. data/app/packs/entrypoints/decidim_proposals.js +1 -0
  67. data/app/packs/entrypoints/decidim_proposals_geocoding.js +2 -0
  68. data/app/packs/src/decidim/proposals/admin/proposals.js +16 -1
  69. data/app/packs/src/decidim/proposals/exit_handler.js +73 -0
  70. data/app/packs/stylesheets/decidim/proposals/proposals.scss +246 -5
  71. data/app/permissions/decidim/proposals/admin/permissions.rb +2 -5
  72. data/app/permissions/decidim/proposals/permissions.rb +46 -3
  73. data/app/presenters/decidim/proposals/admin_log/proposal_presenter.rb +1 -1
  74. data/app/presenters/decidim/proposals/proposal_presenter.rb +1 -1
  75. data/app/queries/decidim/proposals/filtered_proposals.rb +2 -2
  76. data/app/queries/decidim/proposals/metrics/accepted_proposals_metric_manage.rb +2 -2
  77. data/app/queries/decidim/proposals/metrics/endorsements_metric_manage.rb +10 -10
  78. data/app/queries/decidim/proposals/metrics/proposal_followers_metric_measure.rb +4 -4
  79. data/app/queries/decidim/proposals/metrics/proposal_participants_metric_measure.rb +6 -6
  80. data/app/queries/decidim/proposals/metrics/proposals_metric_manage.rb +6 -6
  81. data/app/queries/decidim/proposals/metrics/votes_metric_manage.rb +6 -6
  82. data/app/services/decidim/proposals/collaborative_draft_diff_renderer.rb +22 -0
  83. data/app/services/decidim/proposals/diff_renderer.rb +2 -0
  84. data/app/services/decidim/proposals/proposal_builder.rb +2 -2
  85. data/app/views/decidim/proposals/admin/proposal_notes/_form.html.erb +3 -3
  86. data/app/views/decidim/proposals/admin/proposal_notes/_proposal_note.html.erb +28 -0
  87. data/app/views/decidim/proposals/admin/proposal_notes/_proposal_note_reply.html.erb +9 -0
  88. data/app/views/decidim/proposals/admin/proposal_notes/_proposal_notes.html.erb +4 -28
  89. data/app/views/decidim/proposals/admin/proposal_states/_form.html.erb +1 -1
  90. data/app/views/decidim/proposals/admin/proposals/_actions.html.erb +21 -0
  91. data/app/views/decidim/proposals/admin/proposals/_bulk-actions.html.erb +3 -2
  92. data/app/views/decidim/proposals/admin/proposals/_form.html.erb +16 -23
  93. data/app/views/decidim/proposals/admin/proposals/_proposal-tr.html.erb +12 -28
  94. data/app/views/decidim/proposals/admin/proposals/_proposals-thead.html.erb +45 -0
  95. data/app/views/decidim/proposals/admin/proposals/bulk_actions/_apply_answer_template.html.erb +22 -0
  96. data/app/views/decidim/proposals/admin/proposals/bulk_actions/_dropdown.html.erb +15 -11
  97. data/app/views/decidim/proposals/admin/proposals/bulk_actions/_taxonomy_change.html.erb +23 -0
  98. data/app/views/decidim/proposals/admin/proposals/index.html.erb +17 -48
  99. data/app/views/decidim/proposals/admin/proposals/manage_trash.html.erb +18 -0
  100. data/app/views/decidim/proposals/admin/proposals/publish_answers.js.erb +1 -1
  101. data/app/views/decidim/proposals/admin/proposals/show.html.erb +10 -22
  102. data/app/views/decidim/proposals/admin/proposals/update_attribute.js.erb +1 -1
  103. data/app/views/decidim/proposals/admin/proposals_imports/new.html.erb +2 -5
  104. data/app/views/decidim/proposals/collaborative_drafts/_collaborative_actions.html.erb +9 -0
  105. data/app/views/decidim/proposals/collaborative_drafts/_collaborative_draft_aside.html.erb +0 -15
  106. data/app/views/decidim/proposals/collaborative_drafts/_edit_form_fields.html.erb +4 -6
  107. data/app/views/decidim/proposals/collaborative_drafts/index.html.erb +6 -2
  108. data/app/views/decidim/proposals/collaborative_drafts/show.html.erb +27 -11
  109. data/app/views/decidim/proposals/proposal_votes/update_buttons_and_counters.js.erb +29 -9
  110. data/app/views/decidim/proposals/proposals/_actions.html.erb +4 -7
  111. data/app/views/decidim/proposals/proposals/_edit_form_fields.html.erb +17 -22
  112. data/app/views/decidim/proposals/proposals/_exit_modal.html.erb +17 -0
  113. data/app/views/decidim/proposals/proposals/_notification_alert_box.html.erb +1 -0
  114. data/app/views/decidim/proposals/proposals/_proposal_actions.html.erb +19 -0
  115. data/app/views/decidim/proposals/proposals/_proposal_aside.html.erb +9 -32
  116. data/app/views/decidim/proposals/proposals/_proposal_voting_rules.html.erb +33 -0
  117. data/app/views/decidim/proposals/proposals/_remaining_votes_count.html.erb +2 -2
  118. data/app/views/decidim/proposals/proposals/_remaining_votes_notification.html.erb +12 -0
  119. data/app/views/decidim/proposals/proposals/_update_proposal_voting_rules.html.erb +6 -0
  120. data/app/views/decidim/proposals/proposals/_vote_button.html.erb +12 -8
  121. data/app/views/decidim/proposals/proposals/_votes_count.html.erb +2 -1
  122. data/app/views/decidim/proposals/proposals/_voting_rules.html.erb +1 -7
  123. data/app/views/decidim/proposals/proposals/index.html.erb +10 -18
  124. data/app/views/decidim/proposals/proposals/index.js.erb +12 -0
  125. data/app/views/decidim/proposals/proposals/participatory_texts/_proposal_vote_button.html.erb +3 -1
  126. data/app/views/decidim/proposals/proposals/show.html.erb +36 -16
  127. data/config/locales/ar.yml +19 -75
  128. data/config/locales/bg.yml +7 -91
  129. data/config/locales/bn-BD.yml +1 -0
  130. data/config/locales/bs-BA.yml +87 -0
  131. data/config/locales/ca.yml +213 -73
  132. data/config/locales/cs.yml +229 -75
  133. data/config/locales/de.yml +217 -78
  134. data/config/locales/el.yml +9 -85
  135. data/config/locales/en.yml +209 -69
  136. data/config/locales/es-MX.yml +220 -80
  137. data/config/locales/es-PY.yml +215 -75
  138. data/config/locales/es.yml +222 -82
  139. data/config/locales/eu.yml +293 -147
  140. data/config/locales/fi-plain.yml +222 -81
  141. data/config/locales/fi.yml +239 -98
  142. data/config/locales/fr-CA.yml +119 -90
  143. data/config/locales/fr.yml +118 -89
  144. data/config/locales/ga-IE.yml +0 -19
  145. data/config/locales/gl.yml +9 -47
  146. data/config/locales/he-IL.yml +7 -0
  147. data/config/locales/hu.yml +7 -68
  148. data/config/locales/id-ID.yml +9 -36
  149. data/config/locales/is-IS.yml +0 -21
  150. data/config/locales/it.yml +10 -56
  151. data/config/locales/ja.yml +164 -91
  152. data/config/locales/lt.yml +9 -86
  153. data/config/locales/lv.yml +8 -47
  154. data/config/locales/nl.yml +7 -54
  155. data/config/locales/no.yml +9 -46
  156. data/config/locales/pl.yml +7 -91
  157. data/config/locales/pt-BR.yml +7 -77
  158. data/config/locales/pt.yml +9 -57
  159. data/config/locales/ro-RO.yml +17 -63
  160. data/config/locales/ru.yml +0 -25
  161. data/config/locales/sk.yml +9 -48
  162. data/config/locales/sl.yml +0 -4
  163. data/config/locales/sr-CS.yml +0 -14
  164. data/config/locales/sv.yml +132 -88
  165. data/config/locales/tr-TR.yml +9 -54
  166. data/config/locales/uk.yml +0 -25
  167. data/config/locales/zh-CN.yml +9 -54
  168. data/config/locales/zh-TW.yml +9 -87
  169. data/db/migrate/20171220084719_add_published_at_to_proposals.rb +1 -1
  170. data/db/migrate/20181016132225_add_organization_as_author.rb +1 -1
  171. data/db/migrate/20200120215928_move_proposal_endorsements_to_core_endorsements.rb +1 -1
  172. data/db/migrate/20200827154156_add_commentable_counter_cache_to_proposals.rb +3 -3
  173. data/db/migrate/20210310102839_add_followable_counter_cache_to_proposals.rb +1 -1
  174. data/db/migrate/20240110203504_create_default_proposal_states.rb +4 -3
  175. data/db/migrate/20240404202756_add_valuation_assignments_count_to_decidim_proposals_proposals.rb +1 -1
  176. data/db/migrate/20240617091140_add_email_on_assigned_proposals_to_users.rb +7 -0
  177. data/db/migrate/20240617170052_add_parent_relation_to_decidim_proposal_notes.rb +7 -0
  178. data/db/migrate/20240828103755_add_deleted_at_to_decidim_proposals_proposals.rb +8 -0
  179. data/decidim-proposals.gemspec +2 -2
  180. data/lib/decidim/api/functions/proposal_finder_helper.rb +12 -0
  181. data/lib/decidim/api/functions/proposal_list_helper.rb +12 -0
  182. data/lib/decidim/api/proposal_type.rb +30 -25
  183. data/lib/decidim/api/proposals_type.rb +5 -22
  184. data/lib/decidim/proposals/admin_engine.rb +12 -3
  185. data/lib/decidim/proposals/admin_filter.rb +3 -6
  186. data/lib/decidim/proposals/component.rb +4 -5
  187. data/lib/decidim/proposals/download_your_data_proposal_serializer.rb +15 -0
  188. data/lib/decidim/proposals/engine.rb +5 -0
  189. data/lib/decidim/proposals/import/proposal_creator.rb +4 -4
  190. data/lib/decidim/proposals/proposal_serializer.rb +15 -29
  191. data/lib/decidim/proposals/seeds.rb +21 -17
  192. data/lib/decidim/proposals/test/factories.rb +8 -6
  193. data/lib/decidim/proposals/version.rb +1 -1
  194. data/lib/decidim/proposals.rb +4 -0
  195. metadata +69 -30
  196. data/app/commands/decidim/proposals/admin/update_proposal_category.rb +0 -70
  197. data/app/commands/decidim/proposals/admin/update_proposal_scope.rb +0 -75
  198. data/app/events/decidim/proposals/admin/update_proposal_category_event.rb +0 -11
  199. data/app/events/decidim/proposals/admin/update_proposal_scope_event.rb +0 -11
  200. data/app/views/decidim/proposals/admin/proposals/bulk_actions/_recategorize.html.erb +0 -15
  201. data/app/views/decidim/proposals/admin/proposals/bulk_actions/_scope-change.html.erb +0 -21
  202. data/app/views/decidim/proposals/collaborative_drafts/_actions.html.erb +0 -7
@@ -29,14 +29,13 @@ Decidim.register_component(:proposals) do |component|
29
29
  POSSIBLE_SORT_ORDERS = %w(automatic random recent most_endorsed most_voted most_commented most_followed with_more_authors).freeze
30
30
 
31
31
  component.settings(:global) do |settings|
32
- settings.attribute :scopes_enabled, type: :boolean, default: false
33
- settings.attribute :scope_id, type: :scope
32
+ settings.attribute :taxonomy_filters, type: :taxonomy_filters
34
33
  settings.attribute :vote_limit, type: :integer, default: 0, required: true
35
34
  settings.attribute :minimum_votes_per_user, type: :integer, default: 0, required: true
36
35
  settings.attribute :proposal_limit, type: :integer, default: 0, required: true
37
36
  settings.attribute :proposal_length, type: :integer, default: 500
38
- settings.attribute :proposal_edit_time, type: :enum, default: "limited", choices: -> { %w(limited infinite) }
39
- settings.attribute :proposal_edit_before_minutes, type: :integer, default: 5, required: true
37
+ settings.attribute :proposal_edit_time, type: :enum, default: "limited", choices: -> { %w(infinite limited) }
38
+ settings.attribute :edit_time, type: :integer_with_units, default: [5, "minutes"], required: true, units: %w(minutes hours days)
40
39
  settings.attribute :threshold_per_proposal, type: :integer, default: 0, required: true
41
40
  settings.attribute :can_accumulate_votes_beyond_threshold, type: :boolean, default: false
42
41
  settings.attribute :proposal_answering_enabled, type: :boolean, default: true
@@ -137,7 +136,7 @@ Decidim.register_component(:proposals) do |component|
137
136
  .published
138
137
  .not_hidden
139
138
  .where(component: component_instance)
140
- .includes(:scope, :category, :component)
139
+ .includes(:taxonomies, :component)
141
140
 
142
141
  if space.user_roles(:valuator).where(user:).any?
143
142
  collection.with_valuation_assigned_to(user, space)
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Proposals
5
+ class DownloadYourDataProposalSerializer < Decidim::Proposals::ProposalSerializer
6
+ # Serializes a Proposal for download your data feature
7
+ #
8
+ # Remove the author information as it is the same of the user that
9
+ # requested the data
10
+ def serialize
11
+ super.except!(:author)
12
+ end
13
+ end
14
+ end
15
+ end
@@ -22,6 +22,11 @@ module Decidim
22
22
  end
23
23
  resource :proposal_vote, only: [:create, :destroy]
24
24
  resources :versions, only: [:show]
25
+ resources :invite_coauthors, only: [:index, :create, :update, :destroy] do
26
+ collection do
27
+ delete :cancel
28
+ end
29
+ end
25
30
  end
26
31
  resources :collaborative_drafts, except: [:destroy] do
27
32
  member do
@@ -45,7 +45,7 @@ module Decidim
45
45
 
46
46
  def resource
47
47
  @resource ||= Decidim::Proposals::Proposal.new(
48
- category:,
48
+ taxonomies:,
49
49
  scope:,
50
50
  title:,
51
51
  body:,
@@ -57,9 +57,9 @@ module Decidim
57
57
  )
58
58
  end
59
59
 
60
- def category
61
- id = data.has_key?(:category) ? data[:category]["id"] : data[:"category/id"].to_i
62
- Decidim::Category.find_by(id:)
60
+ def taxonomies
61
+ id = data.has_key?(:taxonomies) ? data[:taxonomies]["ids"] : data[:"taxonomies/ids"]&.split(",")&.map(&:to_i)
62
+ Decidim::Taxonomy.where(id:)
63
63
  end
64
64
 
65
65
  def scope
@@ -22,14 +22,7 @@ module Decidim
22
22
  author: {
23
23
  **author_fields
24
24
  },
25
- category: {
26
- id: proposal.category.try(:id),
27
- name: proposal.category.try(:name) || empty_translatable
28
- },
29
- scope: {
30
- id: proposal.scope.try(:id),
31
- name: proposal.scope.try(:name) || empty_translatable
32
- },
25
+ taxonomies:,
33
26
  participatory_space: {
34
27
  id: proposal.participatory_space.id,
35
28
  url: Decidim::ResourceLocatorPresenter.new(proposal.participatory_space).url
@@ -41,17 +34,19 @@ module Decidim
41
34
  latitude: proposal.latitude,
42
35
  longitude: proposal.longitude,
43
36
  state: proposal.state.to_s,
37
+ state_published_at: proposal.state_published_at,
44
38
  reference: proposal.reference,
45
39
  answer: ensure_translatable(proposal.answer),
46
40
  answered_at: proposal.answered_at,
47
- votes: proposal.proposal_votes_count,
41
+ votes: (proposal.proposal_votes_count unless
42
+ proposal.component.current_settings.votes_hidden?),
48
43
  endorsements: {
49
44
  total_count: proposal.endorsements.size,
50
45
  user_endorsements:
51
46
  },
52
47
  comments: proposal.comments_count,
53
48
  attachments: proposal.attachments.size,
54
- followers: proposal.follows.size,
49
+ follows_count: proposal.follows_count,
55
50
  published_at: proposal.published_at,
56
51
  url:,
57
52
  meeting_urls: meetings,
@@ -62,7 +57,14 @@ module Decidim
62
57
  url: original_proposal_url
63
58
  },
64
59
  withdrawn: proposal.withdrawn?,
65
- withdrawn_at: proposal.withdrawn_at
60
+ withdrawn_at: proposal.withdrawn_at,
61
+ created_at: proposal.created_at,
62
+ updated_at: proposal.updated_at,
63
+ created_in_meeting: proposal.created_in_meeting,
64
+ coauthorships_count: proposal.coauthorships_count,
65
+ cost: proposal.cost,
66
+ cost_report: proposal.cost_report,
67
+ execution_period: proposal.execution_period
66
68
  }
67
69
  end
68
70
 
@@ -71,10 +73,6 @@ module Decidim
71
73
  attr_reader :proposal
72
74
  alias resource proposal
73
75
 
74
- def component
75
- proposal.component
76
- end
77
-
78
76
  def meetings
79
77
  proposal.linked_resources(:meetings, "proposals_from_meeting").map do |meeting|
80
78
  Decidim::ResourceLocatorPresenter.new(meeting).url
@@ -82,7 +80,7 @@ module Decidim
82
80
  end
83
81
 
84
82
  def related_proposals
85
- proposal.linked_resources(:proposals, "copied_from_component").map do |proposal|
83
+ proposal.linked_resources(:proposals, %w(copied_from_component merged_from_component splitted_from_component)).map do |proposal|
86
84
  Decidim::ResourceLocatorPresenter.new(proposal).url
87
85
  end
88
86
  end
@@ -132,7 +130,7 @@ module Decidim
132
130
 
133
131
  def author_url(author)
134
132
  if author.respond_to?(:nickname)
135
- profile_url(author.nickname) # is a Decidim::User or Decidim::UserGroup
133
+ profile_url(author) # is a Decidim::User or Decidim::UserGroup
136
134
  elsif author.respond_to?(:title)
137
135
  meeting_url(author) # is a Decidim::Meetings::Meeting
138
136
  else
@@ -140,21 +138,9 @@ module Decidim
140
138
  end
141
139
  end
142
140
 
143
- def profile_url(nickname)
144
- Decidim::Core::Engine.routes.url_helpers.profile_url(nickname, host:)
145
- end
146
-
147
141
  def meeting_url(meeting)
148
142
  Decidim::EngineRouter.main_proxy(meeting.component).meeting_url(id: meeting.id, host:)
149
143
  end
150
-
151
- def root_url
152
- Decidim::Core::Engine.routes.url_helpers.root_url(host:)
153
- end
154
-
155
- def host
156
- resource.organization.host
157
- end
158
144
  end
159
145
  end
160
146
  end
@@ -20,10 +20,13 @@ module Decidim
20
20
  5.times do |n|
21
21
  proposal = create_proposal!(component:)
22
22
 
23
- emendation = create_emendation!(proposal:) if proposal.state.nil?
23
+ if proposal.state.nil? && component.settings.amendments_enabled?
24
+ emendation = create_emendation!(proposal:)
25
+ create_proposal_votes!(proposal: emendation)
26
+ end
24
27
 
25
28
  (n % 3).times do |_m|
26
- create_proposal_votes!(proposal:, emendation:)
29
+ create_proposal_votes!(proposal:)
27
30
  end
28
31
 
29
32
  (n % 3).times do
@@ -60,7 +63,9 @@ module Decidim
60
63
  settings: {
61
64
  vote_limit: 0,
62
65
  attachments_allowed: [true, false].sample,
63
- collaborative_drafts_enabled: true
66
+ amendments_enabled: participatory_space.id.odd?,
67
+ collaborative_drafts_enabled: true,
68
+ geocoding_enabled: [true, false].sample
64
69
  },
65
70
  step_settings:
66
71
  }
@@ -81,10 +86,8 @@ module Decidim
81
86
 
82
87
  params = {
83
88
  component:,
84
- category: participatory_space.categories.sample,
85
- scope: random_scope(participatory_space:),
86
- title: { en: ::Faker::Lorem.sentence(word_count: 2) },
87
- body: { en: ::Faker::Lorem.paragraphs(number: 2).join("\n") },
89
+ title: Decidim::Faker::Localized.sentence(word_count: 2),
90
+ body: Decidim::Faker::Localized.paragraph(sentence_count: 1),
88
91
  proposal_state:,
89
92
  answer:,
90
93
  answered_at: proposal_state.present? ? Time.current : nil,
@@ -92,6 +95,14 @@ module Decidim
92
95
  published_at: Time.current
93
96
  }
94
97
 
98
+ if component.settings.geocoding_enabled?
99
+ params = params.merge({
100
+ address: "#{::Faker::Address.street_address} #{::Faker::Address.zip} #{::Faker::Address.city}",
101
+ latitude: ::Faker::Address.latitude,
102
+ longitude: ::Faker::Address.longitude
103
+ })
104
+ end
105
+
95
106
  proposal = Decidim.traceability.perform_action!(
96
107
  "publish",
97
108
  Decidim::Proposals::Proposal,
@@ -186,10 +197,8 @@ module Decidim
186
197
 
187
198
  params = {
188
199
  component: proposal.component,
189
- category: participatory_space.categories.sample,
190
- scope: random_scope(participatory_space:),
191
- title: { en: "#{proposal.title["en"]} #{::Faker::Lorem.sentence(word_count: 1)}" },
192
- body: { en: "#{proposal.body["en"]} #{::Faker::Lorem.sentence(word_count: 3)}" },
200
+ title: Decidim::Faker::Localized.literal(proposal.title[I18n.locale]),
201
+ body: Decidim::Faker::Localized.paragraph(sentence_count: 3),
193
202
  proposal_state: Decidim::Proposals::ProposalState.where(component: proposal.component, token: :evaluating).first,
194
203
  answer: nil,
195
204
  answered_at: Time.current,
@@ -218,11 +227,10 @@ module Decidim
218
227
  emendation
219
228
  end
220
229
 
221
- def create_proposal_votes!(proposal:, emendation: nil)
230
+ def create_proposal_votes!(proposal:)
222
231
  author = find_or_initialize_user_by(email: random_email(suffix: "vote"))
223
232
 
224
233
  Decidim::Proposals::ProposalVote.create!(proposal:, author:) unless proposal.published_state? && proposal.rejected?
225
- Decidim::Proposals::ProposalVote.create!(proposal: emendation, author:) if emendation
226
234
  end
227
235
 
228
236
  def create_proposal_notes!(proposal:)
@@ -249,8 +257,6 @@ module Decidim
249
257
  draft = Decidim.traceability.perform_action!("create", Decidim::Proposals::CollaborativeDraft, author) do
250
258
  draft = Decidim::Proposals::CollaborativeDraft.new(
251
259
  component:,
252
- category: participatory_space.categories.sample,
253
- scope: random_scope(participatory_space:),
254
260
  title: ::Faker::Lorem.sentence(word_count: 2),
255
261
  body: ::Faker::Lorem.paragraphs(number: 2).join("\n"),
256
262
  state:,
@@ -280,8 +286,6 @@ module Decidim
280
286
  Decidim::Proposals::CollaborativeDraft.all.sample,
281
287
  Decidim::User.where(organization:).all.sample,
282
288
  component:,
283
- category: participatory_space.categories.sample,
284
- scope: random_scope(participatory_space:),
285
289
  title: ::Faker::Lorem.sentence(word_count: 2),
286
290
  body: ::Faker::Lorem.paragraphs(number: 2).join("\n")
287
291
  )
@@ -306,6 +306,7 @@ FactoryBot.define do
306
306
  body { generate_localized_description(:proposal_body, skip_injection:) }
307
307
  component { create(:proposal_component, skip_injection:) }
308
308
  published_at { Time.current }
309
+ deleted_at { nil }
309
310
  address { "#{Faker::Address.street_name}, #{Faker::Address.city}" }
310
311
  latitude { Faker::Address.latitude }
311
312
  longitude { Faker::Address.longitude }
@@ -356,7 +357,7 @@ FactoryBot.define do
356
357
  trait :participant_author do
357
358
  after :build do |proposal, evaluator|
358
359
  proposal.coauthorships.clear
359
- user = build(:user, organization: proposal.component.participatory_space.organization, skip_injection: evaluator.skip_injection)
360
+ user = build(:user, :confirmed, organization: proposal.component.participatory_space.organization, skip_injection: evaluator.skip_injection)
360
361
  proposal.coauthorships.build(author: user)
361
362
  end
362
363
  end
@@ -380,8 +381,8 @@ FactoryBot.define do
380
381
  trait :official_meeting do
381
382
  after :build do |proposal, evaluator|
382
383
  proposal.coauthorships.clear
383
- component = build(:meeting_component, participatory_space: proposal.component.participatory_space, skip_injection: evaluator.skip_injection)
384
- proposal.coauthorships.build(author: build(:meeting, component:, skip_injection: evaluator.skip_injection))
384
+ component = build(:meeting_component, :published, participatory_space: proposal.component.participatory_space, skip_injection: evaluator.skip_injection)
385
+ proposal.coauthorships.build(author: build(:meeting, :published, component:, skip_injection: evaluator.skip_injection))
385
386
  end
386
387
  end
387
388
 
@@ -444,7 +445,8 @@ FactoryBot.define do
444
445
  trait :with_endorsements do
445
446
  after :create do |proposal, evaluator|
446
447
  5.times.collect do
447
- create(:endorsement, resource: proposal, author: build(:user, organization: proposal.participatory_space.organization, skip_injection: evaluator.skip_injection),
448
+ create(:endorsement, resource: proposal,
449
+ author: build(:user, :confirmed, organization: proposal.participatory_space.organization, skip_injection: evaluator.skip_injection),
448
450
  skip_injection: evaluator.skip_injection)
449
451
  end
450
452
  end
@@ -489,7 +491,7 @@ FactoryBot.define do
489
491
  end
490
492
  amendable { build(:proposal, skip_injection:) }
491
493
  emendation { build(:proposal, component: amendable.component, skip_injection:) }
492
- amender { build(:user, organization: amendable.component.participatory_space.organization, skip_injection:) }
494
+ amender { build(:user, :confirmed, organization: amendable.component.participatory_space.organization, skip_injection:) }
493
495
  state { Decidim::Amendment::STATES.keys.sample }
494
496
  end
495
497
 
@@ -572,7 +574,7 @@ FactoryBot.define do
572
574
  valuator_role do
573
575
  space = proposal.component.participatory_space
574
576
  organization = space.organization
575
- build :participatory_process_user_role, role: :valuator, skip_injection:, user: build(:user, organization:, skip_injection:)
577
+ build(:participatory_process_user_role, role: :valuator, skip_injection:, user: build(:user, organization:, skip_injection:))
576
578
  end
577
579
  end
578
580
  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.29.1"
7
+ "0.30.0.rc1"
8
8
  end
9
9
  end
10
10
  end
@@ -11,7 +11,11 @@ module Decidim
11
11
  # This namespace holds the logic of the `Proposals` component. This component
12
12
  # allows users to create proposals in a participatory process.
13
13
  module Proposals
14
+ autoload :ProposalListHelper, "decidim/api/functions/proposal_list_helper"
15
+ autoload :ProposalFinderHelper, "decidim/api/functions/proposal_finder_helper"
16
+
14
17
  autoload :ProposalSerializer, "decidim/proposals/proposal_serializer"
18
+ autoload :DownloadYourDataProposalSerializer, "decidim/proposals/download_your_data_proposal_serializer"
15
19
  autoload :CommentableProposal, "decidim/proposals/commentable_proposal"
16
20
  autoload :CommentableCollaborativeDraft, "decidim/proposals/commentable_collaborative_draft"
17
21
  autoload :MarkdownToProposals, "decidim/proposals/markdown_to_proposals"