decidim-budgets 0.32.0 → 0.32.2

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f520d8d7c40ec672a9ec5a891aa9dc77557b51e136414c5971b46933d3682ba7
4
- data.tar.gz: cb50f451f7a4815bb447cf5a023aca5d9a09d0f33e0725b15377ae35a055a95c
3
+ metadata.gz: d5c1ed4bb5c02da481f1465b87c601a55e938cc6a5df63db791bd426fd1e5043
4
+ data.tar.gz: 7154214766c8618df4ec228911218147f9f9e00def187aec3a89d048e389a3bb
5
5
  SHA512:
6
- metadata.gz: b9fa084355a7679cbdc24491c6f405c661428e61ce6cfcfa34fe49be20340a2ccb0d9885cece8ff4576a6bb6421e1d376f0bde1dac50b229226bd467a37a1fb8
7
- data.tar.gz: 0d9dcb05f8501a224548fb72e9443e15ca827b5bc15a72af2a36836d8e9ee555f6162129eac5ee8ad547b16727954226214b362ca64ceca92c949c78d2e24613
6
+ metadata.gz: 6eeeafe850e71e9dc78513267837becc86bbfa88c39e935763f0bc7768014deccb71d65e5274808e143372280642eed14f8b85f4aec464d04427e026485a9723
7
+ data.tar.gz: 49c2818831eae88eee5f6648d59699fcca88b0eb766c0ae29a551a5677739961bc23840d38bf4737b30ad8d3ca7cfa6e94724e8e41cfaa328def3aa305e4cd0e
@@ -18,14 +18,6 @@ module Decidim
18
18
  @current_order ||= Order.includes(:projects).find_or_initialize_by(user: current_user, budget:)
19
19
  end
20
20
 
21
- def current_order=(order)
22
- @current_order = order
23
- end
24
-
25
- def persisted_current_order
26
- current_order if current_order&.persisted?
27
- end
28
-
29
21
  def can_have_order?
30
22
  current_user.present? &&
31
23
  voting_open? &&
@@ -37,6 +29,16 @@ module Decidim
37
29
  def voted_for?(project)
38
30
  current_order && current_order.projects.include?(project)
39
31
  end
32
+
33
+ private
34
+
35
+ def current_order=(order)
36
+ @current_order = order
37
+ end
38
+
39
+ def persisted_current_order
40
+ current_order if current_order&.persisted?
41
+ end
40
42
  end
41
43
  end
42
44
  end
@@ -8,6 +8,8 @@ module Decidim
8
8
  class AttachmentCollectionsController < Admin::ApplicationController
9
9
  include Decidim::Admin::Concerns::HasAttachmentCollections
10
10
 
11
+ protected
12
+
11
13
  def after_destroy_path
12
14
  project_attachment_collections_path(project, project.component, current_participatory_space)
13
15
  end
@@ -9,6 +9,8 @@ module Decidim
9
9
  class AttachmentsController < Admin::ApplicationController
10
10
  include Decidim::Admin::Concerns::HasAttachments
11
11
 
12
+ protected
13
+
12
14
  def after_destroy_path
13
15
  budget_projects_path(project.budget)
14
16
  end
@@ -77,7 +77,7 @@ module Decidim
77
77
  end
78
78
 
79
79
  def orders
80
- @orders ||= Order.where(budget: budgets)
80
+ @orders ||= Order.where(budget: budgets) # rubocop:disable Decidim/OrganizationScopedFinder -- budgets are scoped to current_component above
81
81
  end
82
82
 
83
83
  def pending_orders
@@ -15,10 +15,6 @@ module Decidim
15
15
 
16
16
  helper_method :projects, :finished_orders, :pending_orders, :present, :project_ids
17
17
 
18
- def collection
19
- @collection ||= budget.projects.page(params[:page]).per(15)
20
- end
21
-
22
18
  def new
23
19
  enforce_permission_to :create, :project
24
20
  @form = form(ProjectForm).from_params(
@@ -71,7 +67,7 @@ module Decidim
71
67
  def update_taxonomies
72
68
  enforce_permission_to :update, :project_taxonomy
73
69
 
74
- UpdateResourcesTaxonomies.call(params[:taxonomies], Decidim::Budgets::Project.where(id: project_ids), current_organization) do
70
+ UpdateResourcesTaxonomies.call(params[:taxonomies], budget.projects.where(id: project_ids), current_organization) do
75
71
  on(:invalid_taxonomies) do
76
72
  flash[:error] = I18n.t(
77
73
  "projects.update_taxonomies.select_a_taxonomy",
@@ -163,6 +159,10 @@ module Decidim
163
159
 
164
160
  private
165
161
 
162
+ def collection
163
+ @collection ||= budget.projects.page(params[:page]).per(15)
164
+ end
165
+
166
166
  def trashable_deleted_resource_type
167
167
  :project
168
168
  end
@@ -180,7 +180,7 @@ module Decidim
180
180
  end
181
181
 
182
182
  def orders
183
- @orders ||= Order.where(budget:)
183
+ @orders ||= Order.where(budget:) # rubocop:disable Decidim/OrganizationScopedFinder -- budget is scoped to current_component in ApplicationController
184
184
  end
185
185
 
186
186
  def project_ids
@@ -190,7 +190,9 @@ module Decidim
190
190
  def reference_budget
191
191
  return unless params[:reference_id]
192
192
 
193
- Budget.find(params[:reference_id])
193
+ Budget.joins(:component)
194
+ .where(component: { participatory_space: current_participatory_space })
195
+ .find(params.expect(:reference_id))
194
196
  end
195
197
 
196
198
  def pending_orders
@@ -204,7 +206,7 @@ module Decidim
204
206
  def sample_project
205
207
  return if project_ids.empty?
206
208
 
207
- Decidim::Budgets::Project.find(project_ids.first)
209
+ budget.projects.find(project_ids.first)
208
210
  end
209
211
 
210
212
  def project
@@ -34,7 +34,7 @@ module Decidim
34
34
  component = current_participatory_space.components.find_by(id: params[:origin_id])
35
35
 
36
36
  if component
37
- states = Decidim::Proposals::ProposalState
37
+ states = Decidim::Proposals::ProposalState # rubocop:disable Decidim/OrganizationScopedFinder -- component is scoped above via current_participatory_space
38
38
  .where(component:)
39
39
  .map { |s| { token: s.token, title: translated_attribute(s.title) } }
40
40
  states << { token: "not_answered", title: I18n.t("decidim.proposals.answers.not_answered") }
@@ -8,7 +8,7 @@ module Decidim
8
8
  # Note that it inherits from `Decidim::Components::BaseController`, which
9
9
  # override its layout and provide all kinds of useful methods.
10
10
  class ApplicationController < Decidim::Components::BaseController
11
- helper_method :current_workflow, :voting_finished?, :voting_open?, :show_votes_count?
11
+ helper_method :current_workflow, :voting_finished?, :voting_open?, :show_votes_count?, :resource_added?
12
12
 
13
13
  def current_workflow
14
14
  @current_workflow ||= Decidim::Budgets.workflows[workflow_name].new(current_component, current_user)
@@ -9,9 +9,13 @@ module Decidim
9
9
  include Decidim::Budgets::Orderable
10
10
  include Decidim::TranslatableAttributes
11
11
 
12
- def index; end
12
+ def index
13
+ enforce_permission_to :read, :budget
14
+ end
13
15
 
14
16
  def show
17
+ enforce_permission_to(:read, :budget, budget:)
18
+
15
19
  raise ActionController::RoutingError, "Not Found" unless budget
16
20
 
17
21
  redirect_to budget_projects_path(budget)
@@ -35,6 +35,8 @@ module Decidim
35
35
  end
36
36
 
37
37
  def destroy
38
+ enforce_permission_to :vote, :project, project:, budget:, workflow: current_workflow
39
+
38
40
  respond_to do |format|
39
41
  RemoveLineItem.call(current_order, project) do
40
42
  on(:ok) do |_order|
@@ -26,6 +26,8 @@ module Decidim
26
26
  end
27
27
 
28
28
  def destroy
29
+ enforce_permission_to :destroy, :order, order: current_order
30
+
29
31
  CancelOrder.call(current_order) do
30
32
  on(:ok) do
31
33
  flash[:notice] = I18n.t("orders.destroy.success", scope: "decidim")
@@ -40,6 +42,8 @@ module Decidim
40
42
  end
41
43
 
42
44
  def status
45
+ enforce_permission_to :read, :order, order: current_order
46
+
43
47
  redirect_to redirect_path unless current_order.persisted?
44
48
  end
45
49
 
@@ -15,12 +15,16 @@ module Decidim
15
15
  before_action :set_focus_mode_if_voting_open
16
16
 
17
17
  def index
18
+ enforce_permission_to :read, :project
19
+
18
20
  raise ActionController::RoutingError, "Not Found" unless budget
19
21
  end
20
22
 
21
23
  def show
22
24
  raise ActionController::RoutingError, "Not Found" unless budget
23
25
  raise ActionController::RoutingError, "Not Found" unless project
26
+
27
+ enforce_permission_to :read, :project, project:
24
28
  end
25
29
 
26
30
  private
@@ -1,6 +1,6 @@
1
1
  .budget {
2
2
  &-list__map {
3
- @apply lg:-ml-16 -mt-6 lg:-mt-12 mb-6 aspect-square lg:aspect-[21/9] [&>*]:h-full [&+*]:mt-6 lg:[&+*]:mt-12;
3
+ @apply lg:-ml-16 -mt-6 lg:-mt-8 mb-0 lg:mb-4 aspect-square lg:aspect-[21/9] [&>*]:h-full [&+*]:mt-6 lg:[&+*]:mt-12;
4
4
  }
5
5
 
6
6
  &-summary {
@@ -20,6 +20,10 @@ module Decidim
20
20
  can_vote?(true)
21
21
  when [:export_pdf, :order]
22
22
  can_export_pdf?
23
+ when [:destroy, :order]
24
+ can_destroy_order?
25
+ when [:read, :order]
26
+ can_read_order?
23
27
  end
24
28
 
25
29
  permission_action
@@ -44,9 +48,14 @@ module Decidim
44
48
  end
45
49
 
46
50
  def public_action_allowed?
47
- return unless permission_action.subject == :project && permission_action.action == :read
51
+ return unless permission_action.action == :read
48
52
 
49
- toggle_allow(project&.visible? && !project.deleted? && !project.budget.deleted?)
53
+ case permission_action.subject
54
+ when :project
55
+ toggle_allow(project.nil? || (project.visible? && !project.deleted? && !project.budget.deleted?))
56
+ when :budget
57
+ toggle_allow(budget.nil? || !budget.deleted?)
58
+ end
50
59
  end
51
60
 
52
61
  def can_vote?(active_allow)
@@ -70,6 +79,18 @@ module Decidim
70
79
 
71
80
  toggle_allow(is_allowed)
72
81
  end
82
+
83
+ def can_destroy_order?
84
+ is_allowed = user.present? &&
85
+ order&.user == user &&
86
+ current_settings&.votes == "enabled"
87
+
88
+ toggle_allow(is_allowed)
89
+ end
90
+
91
+ def can_read_order?
92
+ toggle_allow(user.present? && order&.user == user)
93
+ end
73
94
  end
74
95
  end
75
96
  end
@@ -36,6 +36,7 @@ bg:
36
36
  budgets:
37
37
  actions:
38
38
  edit: Редактирай
39
+ edit_projects: Добави проекти
39
40
  import: Импортиране на предложения в проекти
40
41
  new_budget: Нов бюджет
41
42
  new_project: Нов проект
@@ -135,6 +136,7 @@ bg:
135
136
  cancel_order:
136
137
  more_than_one: да изтриете гласа си за %{name} и да започнете отначало
137
138
  only_one: изтрийте гласа си и започнете отначало.
139
+ completed: Приключен
138
140
  count:
139
141
  one: "%{count} бюджет"
140
142
  other: "%{count} бюджети"
@@ -179,6 +181,7 @@ bg:
179
181
  subject: Гласувахте в пространството за участие %{space_name}
180
182
  voted_on_space: Гласувахте за бюджета %{budget_name} за пространството за участие %{space_name}.
181
183
  projects:
184
+ back_to_budgets: Обратно към проектите
182
185
  budget_confirm:
183
186
  are_you_sure: Ако размислите, може да промените гласа си по-късно.
184
187
  cancel: Отказ
@@ -247,6 +250,7 @@ bg:
247
250
  added: Добавено
248
251
  all: Всички
249
252
  projects_for: Проекти за %{name}
253
+ select_projects: Добави проекти
250
254
  show:
251
255
  budget: Бюджет
252
256
  prompt: Изберете бюджет
@@ -114,7 +114,7 @@ ca:
114
114
  title: Projectes eliminats
115
115
  new:
116
116
  create: Crear
117
- title: Nova projecte a "%{budget}"
117
+ title: Nou projecte a %{budget}
118
118
  update:
119
119
  invalid: S'ha produït un error en actualitzar aquest projecte.
120
120
  success: Projecte actualitzat correctament.
@@ -368,7 +368,7 @@ ca:
368
368
  vote_rule_selected_projects_enabled: 'Activar regla: número mínim i màxim de projectes a votar'
369
369
  vote_rule_threshold_percent_enabled: 'Activar norma: percentatge mínim del pressupost'
370
370
  vote_selected_projects_maximum: Número màxim de projectes a seleccionar
371
- vote_selected_projects_minimum: Número màxim de projectes a seleccionar
371
+ vote_selected_projects_minimum: Número mínim de projectes a seleccionar
372
372
  vote_threshold_percent: Percentatge del pressupost mínim per fer el vot
373
373
  voting_rule: Normes per a la votació
374
374
  voting_rule_choices:
@@ -367,6 +367,7 @@ cs:
367
367
  announcement: Oznámení
368
368
  clear_all: Vymazat vše
369
369
  comments_enabled: Komentáře povoleny
370
+ comments_max_length: Maximální počet znaků na komentář (ponechte 0 pro výchozí hodnotu)
370
371
  define_taxonomy_filters: Před použitím tohoto nastavení prosím definujte některé filtry pro tento participační prostor.
371
372
  form:
372
373
  errors:
@@ -91,6 +91,7 @@ de:
91
91
  invalid: Beim Erstellen dieses Projekts ist ein Problem aufgetreten.
92
92
  success: Projekt erfolgreich erstellt.
93
93
  edit:
94
+ title: Projekt bei %{budget} bearbeiten
94
95
  update: Aktualisieren
95
96
  index:
96
97
  actions: Aktionen
@@ -113,6 +114,7 @@ de:
113
114
  title: Gelöschte Projekte
114
115
  new:
115
116
  create: Erstellen
117
+ title: Neues Projekt bei %{budget}
116
118
  update:
117
119
  invalid: Beim Aktualisieren dieses Projekts ist ein Problem aufgetreten.
118
120
  success: Projekt erfolgreich aktualisiert.
@@ -143,6 +145,8 @@ de:
143
145
  default_budget: Standardbudget
144
146
  no_components: Es gibt keine weiteren Vorschlagskomponenten in diesem partizipativen Raum, um die Vorschläge in Projekte zu importieren.
145
147
  origin_component_id: Ursprungskomponente
148
+ proposal_states: Vorschlagsstatus
149
+ proposal_states_help: Wählen Sie einen oder mehrere Vorschlagsstatus aus, die in Projekte importiert werden sollen. Wenn Sie keinen auswählen, werden alle veröffentlichten Vorschläge importiert, die noch nicht in andere Budgets dieser Komponente importiert wurden.
146
150
  select_component: Bitte wählen Sie eine Komponente aus
147
151
  title: Vorschläge bei Projekten importieren
148
152
  reminders:
@@ -343,6 +347,7 @@ de:
343
347
  announcement: Ankündigung
344
348
  clear_all: Alles löschen
345
349
  comments_enabled: Kommentare aktiviert
350
+ comments_max_length: Maximale Zeichenanzahl pro Kommentar (0 für Standardwert)
346
351
  define_taxonomy_filters: Bitte definieren Sie einige Filter für diesen partizipativen Bereich, bevor Sie diese Einstellung verwenden.
347
352
  form:
348
353
  errors:
@@ -415,7 +420,7 @@ de:
415
420
  id: Die eindeutige Bezeichnung des Projekts
416
421
  latitude: Der Breitengrad des Projekts, falls es einen verortet wurde
417
422
  longitude: Der Längengrad des Projekts, falls es verortet wurde
418
- participatory_space: Zu welchem Bereich dieses Projekt gehört (z.B. Partizipationsprozesse oder Gremien)
423
+ participatory_space: Zu welchem Bereich dieses Projekt gehört (z.B. Partizipationsprozesse oder Versammlungen)
419
424
  reference: Die eindeutige Referenz des Projekts
420
425
  related_proposal_titles: Titel der verknüpften Vorschläge
421
426
  related_proposal_urls: URLs der verknüpften Vorschläge