decidim-budgets 0.31.7 → 0.31.8

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: 85cb8b21564209c733beeaf7aa54fa34c8319bb2137d41b4113fbfe407da83ac
4
- data.tar.gz: b01ede74db68557f4935b7cd7701079647cb959148b94347664db55ba2fd82cd
3
+ metadata.gz: 14f59147f08856c838f48d096f69fba830f7e16271b333c844bf3149943074e4
4
+ data.tar.gz: 32580fdfe06bf959b07e2f15dfea7778cdc9c32863d1bb99d7a433dccabd3cf6
5
5
  SHA512:
6
- metadata.gz: 31376ff04ffe9ad3daa9993280cfe74df5ad0557e6074754fde3617a0ccef4b5dc78dd48bb32d731ef7ced68911c6147cfbebb92227c20712ef3250ae7a7cb1d
7
- data.tar.gz: 1349be9492ae96a4984474d21b6088ea23060a8988173e82d44c2833f64ab39d9969c401d7083bd6b9d242503f93a03493a23e18c06d1479a98dde113a28e3cf
6
+ metadata.gz: 3064538c7524d637e23291e13846fab908829bdb783660e3ebfb76bc217ba9395900f264152822f387f76e9da7e677cf2eadec0c9560bef5a28834651655f76c
7
+ data.tar.gz: 23499f8574368f6bca328249804c9dd41aacb0d68409d2b9729e8110a999cd3de23e6542a104b5f8712f47e9f26804d1b233e215b59f5743e94add7cfb2dcbc4
@@ -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
@@ -76,7 +76,7 @@ module Decidim
76
76
  end
77
77
 
78
78
  def orders
79
- @orders ||= Order.where(budget: budgets)
79
+ @orders ||= Order.where(budget: budgets) # rubocop:disable Decidim/OrganizationScopedFinder -- budgets are scoped to current_component above
80
80
  end
81
81
 
82
82
  def pending_orders
@@ -14,10 +14,6 @@ module Decidim
14
14
 
15
15
  helper_method :projects, :finished_orders, :pending_orders, :present, :project_ids
16
16
 
17
- def collection
18
- @collection ||= budget.projects.page(params[:page]).per(15)
19
- end
20
-
21
17
  def new
22
18
  enforce_permission_to :create, :project
23
19
  @form = form(ProjectForm).from_params(
@@ -70,7 +66,7 @@ module Decidim
70
66
  def update_taxonomies
71
67
  enforce_permission_to :update, :project_taxonomy
72
68
 
73
- UpdateResourcesTaxonomies.call(params[:taxonomies], Decidim::Budgets::Project.where(id: project_ids), current_organization) do
69
+ UpdateResourcesTaxonomies.call(params[:taxonomies], budget.projects.where(id: project_ids), current_organization) do
74
70
  on(:invalid_taxonomies) do
75
71
  flash[:error] = I18n.t(
76
72
  "projects.update_taxonomies.select_a_taxonomy",
@@ -162,6 +158,10 @@ module Decidim
162
158
 
163
159
  private
164
160
 
161
+ def collection
162
+ @collection ||= budget.projects.page(params[:page]).per(15)
163
+ end
164
+
165
165
  def trashable_deleted_resource_type
166
166
  :project
167
167
  end
@@ -179,7 +179,7 @@ module Decidim
179
179
  end
180
180
 
181
181
  def orders
182
- @orders ||= Order.where(budget:)
182
+ @orders ||= Order.where(budget:) # rubocop:disable Decidim/OrganizationScopedFinder -- budget is scoped to current_component in ApplicationController
183
183
  end
184
184
 
185
185
  def project_ids
@@ -189,7 +189,7 @@ module Decidim
189
189
  def reference_budget
190
190
  return unless params[:reference_id]
191
191
 
192
- Budget.find(params[:reference_id])
192
+ Budget.where(component: current_component).find(params.require(:reference_id))
193
193
  end
194
194
 
195
195
  def pending_orders
@@ -203,7 +203,7 @@ module Decidim
203
203
  def sample_project
204
204
  return if project_ids.empty?
205
205
 
206
- Decidim::Budgets::Project.find(project_ids.first)
206
+ budget.projects.find(project_ids.first)
207
207
  end
208
208
 
209
209
  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
 
@@ -14,12 +14,16 @@ module Decidim
14
14
  before_action :set_focus_mode_if_voting_open
15
15
 
16
16
  def index
17
+ enforce_permission_to :read, :project
18
+
17
19
  raise ActionController::RoutingError, "Not Found" unless budget
18
20
  end
19
21
 
20
22
  def show
21
23
  raise ActionController::RoutingError, "Not Found" unless budget
22
24
  raise ActionController::RoutingError, "Not Found" unless project
25
+
26
+ enforce_permission_to :read, :project, project:
23
27
  end
24
28
 
25
29
  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 {
@@ -4,6 +4,7 @@ module Decidim
4
4
  module Budgets
5
5
  class Permissions < Decidim::DefaultPermissions
6
6
  def permissions
7
+ return permission_action if permission_action.scope == :public && public_action_allowed?
7
8
  return permission_action unless user
8
9
 
9
10
  # Delegate the admin permission checks to the admin permissions class
@@ -15,12 +16,14 @@ module Decidim
15
16
  can_vote?(false) if can_vote_project?(project || order&.projects&.first)
16
17
  when [:report, :project]
17
18
  permission_action.allow!
18
- when [:read, :project]
19
- toggle_allow(project.visible?)
20
19
  when [:create, :order]
21
20
  can_vote?(true)
22
21
  when [:export_pdf, :order]
23
22
  can_export_pdf?
23
+ when [:destroy, :order]
24
+ can_destroy_order?
25
+ when [:read, :order]
26
+ can_read_order?
24
27
  end
25
28
 
26
29
  permission_action
@@ -44,6 +47,17 @@ module Decidim
44
47
  @workflow ||= context.fetch(:workflow, nil)
45
48
  end
46
49
 
50
+ def public_action_allowed?
51
+ return unless permission_action.action == :read
52
+
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
59
+ end
60
+
47
61
  def can_vote?(active_allow)
48
62
  is_allowed = workflow.vote_allowed?(budget)
49
63
 
@@ -65,6 +79,18 @@ module Decidim
65
79
 
66
80
  toggle_allow(is_allowed)
67
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
68
94
  end
69
95
  end
70
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: Нов проект
@@ -137,6 +138,7 @@ bg:
137
138
  cancel_order:
138
139
  more_than_one: да изтриете гласа си за %{name} и да започнете отначало
139
140
  only_one: изтрийте гласа си и започнете отначало.
141
+ completed: Приключен
140
142
  count:
141
143
  one: "%{count} бюджет"
142
144
  other: "%{count} бюджети"
@@ -182,6 +184,7 @@ bg:
182
184
  subject: Гласувахте в пространството за участие %{space_name}
183
185
  voted_on_space: Гласувахте за бюджета %{budget_name} за пространството за участие %{space_name}.
184
186
  projects:
187
+ back_to_budgets: Обратно към проектите
185
188
  budget_confirm:
186
189
  are_you_sure: Ако размислите, може да промените гласа си по-късно.
187
190
  cancel: Отказ
@@ -250,6 +253,7 @@ bg:
250
253
  added: Добавено
251
254
  all: Всички
252
255
  projects_for: Проекти за %{name}
256
+ select_projects: Добави проекти
253
257
  show:
254
258
  budget: Бюджет
255
259
  prompt: Изберете бюджет
@@ -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:
@@ -145,6 +145,8 @@ de:
145
145
  default_budget: Standardbudget
146
146
  no_components: Es gibt keine weiteren Vorschlagskomponenten in diesem partizipativen Raum, um die Vorschläge in Projekte zu importieren.
147
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.
148
150
  select_component: Bitte wählen Sie eine Komponente aus
149
151
  title: Vorschläge bei Projekten importieren
150
152
  reminders:
@@ -345,6 +347,7 @@ de:
345
347
  announcement: Ankündigung
346
348
  clear_all: Alles löschen
347
349
  comments_enabled: Kommentare aktiviert
350
+ comments_max_length: Maximale Zeichenanzahl pro Kommentar (0 für Standardwert)
348
351
  define_taxonomy_filters: Bitte definieren Sie einige Filter für diesen partizipativen Bereich, bevor Sie diese Einstellung verwenden.
349
352
  form:
350
353
  errors:
@@ -424,7 +427,7 @@ de:
424
427
  id: Die eindeutige Bezeichnung des Projekts
425
428
  latitude: Der Breitengrad des Projekts, falls es einen verortet wurde
426
429
  longitude: Der Längengrad des Projekts, falls es verortet wurde
427
- participatory_space: Zu welchem Bereich dieses Projekt gehört (z.B. Partizipationsprozesse oder Gremien)
430
+ participatory_space: Zu welchem Bereich dieses Projekt gehört (z.B. Partizipationsprozesse oder Versammlungen)
428
431
  reference: Die eindeutige Referenz des Projekts
429
432
  related_proposal_titles: Titel der verknüpften Vorschläge
430
433
  related_proposal_urls: URLs der verknüpften Vorschläge