decidim-budgets 0.22.0 → 0.23.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +38 -3
- data/app/assets/stylesheets/decidim/budgets/budget/_budget-list.scss +5 -0
- data/app/cells/decidim/budgets/base_cell.rb +22 -0
- data/app/cells/decidim/budgets/budget_cell.rb +21 -0
- data/app/cells/decidim/budgets/budget_information_modal/show.erb +28 -0
- data/app/cells/decidim/budgets/budget_information_modal_cell.rb +22 -0
- data/app/cells/decidim/budgets/budget_list_item/show.erb +22 -0
- data/app/cells/decidim/budgets/budget_list_item_cell.rb +40 -0
- data/app/cells/decidim/budgets/budget_m/data.erb +12 -0
- data/app/cells/decidim/budgets/budget_m/footer.erb +5 -0
- data/app/cells/decidim/budgets/budget_m_cell.rb +16 -0
- data/app/cells/decidim/budgets/budgets_header/show.erb +7 -0
- data/app/cells/decidim/budgets/budgets_header_cell.rb +14 -0
- data/app/cells/decidim/budgets/budgets_list/card_list.erb +7 -0
- data/app/cells/decidim/budgets/budgets_list/highlighted.erb +11 -0
- data/app/cells/decidim/budgets/budgets_list/show.erb +20 -0
- data/app/cells/decidim/budgets/budgets_list/voted.erb +43 -0
- data/app/cells/decidim/budgets/budgets_list_cell.rb +39 -0
- data/app/cells/decidim/budgets/limit_announcement_cell.rb +52 -0
- data/app/cells/decidim/budgets/project_list_item/project_data.erb +17 -3
- data/app/cells/decidim/budgets/project_list_item/project_data_vote_button.erb +2 -2
- data/app/cells/decidim/budgets/project_list_item/project_text.erb +11 -5
- data/app/cells/decidim/budgets/project_list_item/show.erb +3 -3
- data/app/cells/decidim/budgets/project_list_item_cell.rb +8 -28
- data/app/cells/decidim/budgets/project_m/data.erb +1 -1
- data/app/cells/decidim/budgets/project_m_cell.rb +4 -0
- data/app/cells/decidim/budgets/project_selected_status_cell.rb +28 -0
- data/app/cells/decidim/budgets/project_tags/show.erb +5 -0
- data/app/cells/decidim/budgets/project_tags_cell.rb +18 -0
- data/app/cells/decidim/budgets/project_voted_hint_cell.rb +33 -0
- data/app/cells/decidim/budgets/project_votes_count_cell.rb +44 -0
- data/app/commands/decidim/budgets/add_line_item.rb +7 -10
- data/app/commands/decidim/budgets/admin/create_budget.rb +48 -0
- data/app/commands/decidim/budgets/admin/create_project.rb +12 -7
- data/app/commands/decidim/budgets/admin/destroy_budget.rb +42 -0
- data/app/commands/decidim/budgets/admin/import_proposals_to_budgets.rb +26 -25
- data/app/commands/decidim/budgets/admin/update_budget.rb +48 -0
- data/app/commands/decidim/budgets/admin/update_project.rb +8 -1
- data/app/commands/decidim/budgets/checkout.rb +6 -6
- data/app/commands/decidim/budgets/remove_line_item.rb +3 -2
- data/app/controllers/concerns/decidim/budgets/needs_current_order.rb +14 -2
- data/app/controllers/concerns/decidim/budgets/orderable.rb +3 -7
- data/app/controllers/decidim/budgets/admin/application_controller.rb +10 -2
- data/app/controllers/decidim/budgets/admin/attachment_collections_controller.rb +1 -1
- data/app/controllers/decidim/budgets/admin/attachments_controller.rb +2 -2
- data/app/controllers/decidim/budgets/admin/budgets_controller.rb +82 -0
- data/app/controllers/decidim/budgets/admin/projects_controller.rb +7 -7
- data/app/controllers/decidim/budgets/admin/proposals_imports_controller.rb +10 -2
- data/app/controllers/decidim/budgets/application_controller.rb +23 -0
- data/app/controllers/decidim/budgets/budgets_controller.rb +24 -0
- data/app/controllers/decidim/budgets/line_items_controller.rb +9 -5
- data/app/controllers/decidim/budgets/orders_controller.rb +20 -6
- data/app/controllers/decidim/budgets/projects_controller.rb +19 -18
- data/app/forms/decidim/budgets/admin/budget_form.rb +39 -0
- data/app/forms/decidim/budgets/admin/project_form.rb +14 -10
- data/app/forms/decidim/budgets/admin/project_import_proposals_form.rb +4 -0
- data/app/helpers/decidim/budgets/admin/application_helper.rb +13 -0
- data/app/helpers/decidim/budgets/application_helper.rb +10 -0
- data/app/helpers/decidim/budgets/projects_helper.rb +0 -4
- data/app/mailers/decidim/budgets/order_summary_mailer.rb +5 -3
- data/app/models/decidim/budgets/budget.rb +34 -0
- data/app/models/decidim/budgets/line_item.rb +4 -4
- data/app/models/decidim/budgets/order.rb +23 -19
- data/app/models/decidim/budgets/project.rb +34 -5
- data/app/permissions/decidim/budgets/admin/permissions.rb +23 -10
- data/app/permissions/decidim/budgets/permissions.rb +28 -6
- data/app/presenters/decidim/budgets/admin_log/budget_presenter.rb +42 -0
- data/app/queries/decidim/budgets/filtered_projects.rb +9 -1
- data/app/queries/decidim/budgets/metrics/budget_followers_metric_measure.rb +3 -2
- data/app/queries/decidim/budgets/metrics/budget_participants_metric_measure.rb +6 -5
- data/app/serializers/decidim/budgets/data_portability_budgets_order_serializer.rb +3 -2
- data/app/services/decidim/budgets/project_search.rb +12 -24
- data/app/types/decidim/budgets/budget_type.rb +24 -0
- data/app/types/decidim/budgets/budgets_type.rb +6 -6
- data/app/types/decidim/budgets/project_type.rb +2 -1
- data/app/views/decidim/budgets/admin/budgets/_form.html.erb +23 -0
- data/app/views/decidim/budgets/admin/budgets/edit.html.erb +7 -0
- data/app/views/decidim/budgets/admin/budgets/index.html.erb +58 -0
- data/app/views/decidim/budgets/admin/budgets/new.html.erb +7 -0
- data/app/views/decidim/budgets/admin/projects/_form.html.erb +12 -4
- data/app/views/decidim/budgets/admin/projects/edit.html.erb +2 -2
- data/app/views/decidim/budgets/admin/projects/index.html.erb +20 -7
- data/app/views/decidim/budgets/admin/projects/new.html.erb +2 -2
- data/app/views/decidim/budgets/admin/proposals_imports/new.html.erb +1 -1
- data/app/views/decidim/budgets/budgets/index.html.erb +5 -0
- data/app/views/decidim/budgets/order_summary_mailer/order_summary.html.erb +1 -0
- data/app/views/decidim/budgets/projects/_budget_confirm.html.erb +3 -3
- data/app/views/decidim/budgets/projects/_budget_summary.html.erb +19 -6
- data/app/views/decidim/budgets/projects/_filters.html.erb +6 -2
- data/app/views/decidim/budgets/projects/_linked_projects.html.erb +1 -1
- data/app/views/decidim/budgets/projects/_order_progress.html.erb +10 -6
- data/app/views/decidim/budgets/projects/_order_selected_projects.html.erb +3 -3
- data/app/views/decidim/budgets/projects/_project_budget_button.html.erb +36 -7
- data/app/views/decidim/budgets/projects/index.html.erb +12 -4
- data/app/views/decidim/budgets/projects/show.html.erb +22 -13
- data/config/locales/am-ET.yml +1 -0
- data/config/locales/ar.yml +2 -11
- data/config/locales/bg.yml +6 -0
- data/config/locales/ca.yml +102 -10
- data/config/locales/cs.yml +108 -16
- data/config/locales/da.yml +1 -0
- data/config/locales/de.yml +120 -28
- data/config/locales/el.yml +3 -9
- data/config/locales/en.yml +101 -9
- data/config/locales/eo.yml +1 -0
- data/config/locales/es-MX.yml +101 -9
- data/config/locales/es-PY.yml +101 -9
- data/config/locales/es.yml +102 -10
- data/config/locales/et.yml +1 -0
- data/config/locales/eu.yml +5 -8
- data/config/locales/fi-plain.yml +102 -10
- data/config/locales/fi.yml +103 -11
- data/config/locales/fr-CA.yml +101 -9
- data/config/locales/fr.yml +101 -9
- data/config/locales/gl.yml +70 -10
- data/config/locales/hr.yml +1 -0
- data/config/locales/hu.yml +2 -7
- data/config/locales/id-ID.yml +2 -6
- data/config/locales/is-IS.yml +0 -6
- data/config/locales/is.yml +114 -0
- data/config/locales/it.yml +71 -9
- data/config/locales/ja-JP.yml +1 -0
- data/config/locales/ja.yml +262 -0
- data/config/locales/ko-KR.yml +1 -0
- data/config/locales/ko.yml +1 -0
- data/config/locales/lt.yml +1 -0
- data/config/locales/{lv-LV.yml → lv.yml} +2 -10
- data/config/locales/mt.yml +1 -0
- data/config/locales/nl.yml +88 -10
- data/config/locales/no.yml +25 -9
- data/config/locales/om-ET.yml +1 -0
- data/config/locales/pl.yml +114 -22
- data/config/locales/pt-BR.yml +2 -7
- data/config/locales/pt.yml +3 -9
- data/config/locales/ro-RO.yml +3 -10
- data/config/locales/ru.yml +2 -9
- data/config/locales/si-LK.yml +1 -0
- data/config/locales/sk.yml +2 -11
- data/config/locales/sl.yml +0 -4
- data/config/locales/so-SO.yml +1 -0
- data/config/locales/sr-CS.yml +0 -2
- data/config/locales/sv.yml +101 -9
- data/config/locales/sw-KE.yml +1 -0
- data/config/locales/ti-ER.yml +1 -0
- data/config/locales/tr-TR.yml +153 -34
- data/config/locales/uk.yml +2 -9
- data/config/locales/vi-VN.yml +1 -0
- data/config/locales/vi.yml +1 -0
- data/config/locales/zh-CN.yml +260 -0
- data/config/locales/zh-TW.yml +1 -0
- data/db/migrate/20200617105120_create_decidim_budgets.rb +15 -0
- data/db/migrate/20200629072626_rename_budget_to_budget_ammount.rb +7 -0
- data/db/migrate/20200629134013_add_budget_reference_to_project.rb +7 -0
- data/db/migrate/20200706142609_add_budget_reference_to_order.rb +7 -0
- data/db/migrate/20200714103519_move_budgets_to_own_model.rb +109 -0
- data/db/migrate/20200717140012_add_scope_to_budgets.rb +7 -0
- data/db/migrate/20200728075039_add_selected_at_to_project.rb +7 -0
- data/db/migrate/20200804175222_votes_enabled_to_votes_choices.rb +35 -0
- data/db/migrate/20200827154129_add_commentable_counter_cache_to_projects.rb +9 -0
- data/lib/decidim/budgets.rb +1 -0
- data/lib/decidim/budgets/admin_engine.rb +10 -5
- data/lib/decidim/budgets/component.rb +83 -38
- data/lib/decidim/budgets/engine.rb +8 -6
- data/lib/decidim/budgets/test/factories.rb +42 -13
- data/lib/decidim/budgets/version.rb +1 -1
- data/lib/decidim/budgets/workflows.rb +17 -0
- data/lib/decidim/budgets/workflows/all.rb +20 -0
- data/lib/decidim/budgets/workflows/base.rb +132 -0
- data/lib/decidim/budgets/workflows/one.rb +33 -0
- metadata +89 -20
- data/app/cells/decidim/budgets/project_list_item/project_data_number.erb +0 -3
- data/app/cells/decidim/budgets/project_list_item/project_data_votes.erb +0 -7
@@ -0,0 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module Budgets
|
5
|
+
module Admin
|
6
|
+
# This command is executed when the user destroys a Budget
|
7
|
+
# from the admin panel.
|
8
|
+
class DestroyBudget < Rectify::Command
|
9
|
+
def initialize(budget, current_user)
|
10
|
+
@budget = budget
|
11
|
+
@current_user = current_user
|
12
|
+
end
|
13
|
+
|
14
|
+
# Destroys the budget if valid.
|
15
|
+
#
|
16
|
+
# Broadcasts :ok if successful, :invalid otherwise.
|
17
|
+
def call
|
18
|
+
return broadcast(:invalid) if budget.projects.present?
|
19
|
+
|
20
|
+
destroy_budget!
|
21
|
+
|
22
|
+
broadcast(:ok, budget)
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
attr_reader :budget, :current_user
|
28
|
+
|
29
|
+
def destroy_budget!
|
30
|
+
Decidim.traceability.perform_action!(
|
31
|
+
:delete,
|
32
|
+
budget,
|
33
|
+
current_user,
|
34
|
+
visibility: "all"
|
35
|
+
) do
|
36
|
+
budget.destroy!
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -4,7 +4,7 @@ module Decidim
|
|
4
4
|
module Budgets
|
5
5
|
module Admin
|
6
6
|
# A command with all the business logic when an admin imports proposals from
|
7
|
-
# one component to budget
|
7
|
+
# one component to projects of a budget.
|
8
8
|
class ImportProposalsToBudgets < Rectify::Command
|
9
9
|
# Public: Initializes the command.
|
10
10
|
#
|
@@ -32,45 +32,46 @@ module Decidim
|
|
32
32
|
def create_projects_from_accepted_proposals
|
33
33
|
transaction do
|
34
34
|
proposals.map do |original_proposal|
|
35
|
-
next if proposal_already_copied?(original_proposal
|
35
|
+
next if proposal_already_copied?(original_proposal)
|
36
36
|
|
37
|
-
|
38
|
-
project.title = project_localized(original_proposal.title)
|
39
|
-
project.description = project_localized(original_proposal.body)
|
40
|
-
project.budget = form.default_budget
|
41
|
-
project.category = original_proposal.category
|
42
|
-
project.scope = original_proposal.scope
|
43
|
-
project.component = target_component
|
44
|
-
project.save!
|
37
|
+
new_project = create_project_from_proposal!(original_proposal)
|
45
38
|
|
46
|
-
|
39
|
+
new_project.link_resources([original_proposal], "included_proposals")
|
47
40
|
end.compact
|
48
41
|
end
|
49
42
|
end
|
50
43
|
|
44
|
+
def create_project_from_proposal!(original_proposal)
|
45
|
+
params = {
|
46
|
+
budget: form.budget,
|
47
|
+
title: original_proposal.title,
|
48
|
+
description: original_proposal.body,
|
49
|
+
budget_amount: form.default_budget,
|
50
|
+
category: original_proposal.category,
|
51
|
+
scope: original_proposal.scope
|
52
|
+
}
|
53
|
+
|
54
|
+
@project = Decidim.traceability.create!(
|
55
|
+
Project,
|
56
|
+
form.current_user,
|
57
|
+
params,
|
58
|
+
visibility: "all"
|
59
|
+
)
|
60
|
+
end
|
61
|
+
|
51
62
|
def proposals
|
52
63
|
Decidim::Proposals::Proposal.where(component: origin_component).where(state: "accepted")
|
53
64
|
end
|
54
65
|
|
55
66
|
def origin_component
|
56
|
-
|
67
|
+
form.origin_component
|
57
68
|
end
|
58
69
|
|
59
|
-
def
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
def proposal_already_copied?(original_proposal, target_component)
|
64
|
-
original_proposal.linked_resources(:projects, "included_proposals").any? do |proposal|
|
65
|
-
proposal.component == target_component
|
70
|
+
def proposal_already_copied?(original_proposal)
|
71
|
+
original_proposal.linked_resources(:projects, "included_proposals").any? do |project|
|
72
|
+
project.budget == form.budget
|
66
73
|
end
|
67
74
|
end
|
68
|
-
|
69
|
-
def project_localized(text)
|
70
|
-
Decidim.available_locales.inject({}) do |result, locale|
|
71
|
-
result.update(locale => text)
|
72
|
-
end.with_indifferent_access
|
73
|
-
end
|
74
75
|
end
|
75
76
|
end
|
76
77
|
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module Budgets
|
5
|
+
module Admin
|
6
|
+
# This command is executed when the user updates a Budget
|
7
|
+
# from the admin panel.
|
8
|
+
class UpdateBudget < Rectify::Command
|
9
|
+
def initialize(form, budget)
|
10
|
+
@form = form
|
11
|
+
@budget = budget
|
12
|
+
end
|
13
|
+
|
14
|
+
# Updates the budget if valid.
|
15
|
+
#
|
16
|
+
# Broadcasts :ok if successful, :invalid otherwise.
|
17
|
+
def call
|
18
|
+
return broadcast(:invalid) if form.invalid?
|
19
|
+
|
20
|
+
update_budget!
|
21
|
+
|
22
|
+
broadcast(:ok, budget)
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
attr_reader :form, :budget
|
28
|
+
|
29
|
+
def update_budget!
|
30
|
+
attributes = {
|
31
|
+
scope: form.scope,
|
32
|
+
title: form.title,
|
33
|
+
weight: form.weight,
|
34
|
+
description: form.description,
|
35
|
+
total_budget: form.total_budget
|
36
|
+
}
|
37
|
+
|
38
|
+
Decidim.traceability.update!(
|
39
|
+
budget,
|
40
|
+
form.current_user,
|
41
|
+
attributes,
|
42
|
+
visibility: "all"
|
43
|
+
)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -52,7 +52,8 @@ module Decidim
|
|
52
52
|
category: form.category,
|
53
53
|
title: form.title,
|
54
54
|
description: form.description,
|
55
|
-
|
55
|
+
budget_amount: form.budget_amount,
|
56
|
+
selected_at: selected_at
|
56
57
|
)
|
57
58
|
end
|
58
59
|
|
@@ -63,6 +64,12 @@ module Decidim
|
|
63
64
|
def link_proposals
|
64
65
|
project.link_resources(proposals, "included_proposals")
|
65
66
|
end
|
67
|
+
|
68
|
+
def selected_at
|
69
|
+
return unless form.selected
|
70
|
+
|
71
|
+
Time.current
|
72
|
+
end
|
66
73
|
end
|
67
74
|
end
|
68
75
|
end
|
@@ -7,10 +7,8 @@ module Decidim
|
|
7
7
|
# Public: Initializes the command.
|
8
8
|
#
|
9
9
|
# order - The current order for the user.
|
10
|
-
|
11
|
-
def initialize(order, component)
|
10
|
+
def initialize(order)
|
12
11
|
@order = order
|
13
|
-
@component = component
|
14
12
|
end
|
15
13
|
|
16
14
|
# Executes the command. Broadcasts these events:
|
@@ -20,15 +18,17 @@ module Decidim
|
|
20
18
|
#
|
21
19
|
# Returns nothing.
|
22
20
|
def call
|
23
|
-
return broadcast(:invalid,
|
21
|
+
return broadcast(:invalid, order) unless checkout!
|
24
22
|
|
25
|
-
broadcast(:ok,
|
23
|
+
broadcast(:ok, order)
|
26
24
|
end
|
27
25
|
|
28
26
|
private
|
29
27
|
|
28
|
+
attr_reader :order
|
29
|
+
|
30
30
|
def checkout!
|
31
|
-
return unless
|
31
|
+
return unless order && order.valid?
|
32
32
|
|
33
33
|
@order.with_lock do
|
34
34
|
SendOrderSummaryJob.perform_later(@order)
|
@@ -9,13 +9,13 @@ module Decidim
|
|
9
9
|
extend ActiveSupport::Concern
|
10
10
|
|
11
11
|
included do
|
12
|
-
helper_method :current_order
|
12
|
+
helper_method :current_order, :can_have_order?, :voted_for?
|
13
13
|
|
14
14
|
# The current order created by the user.
|
15
15
|
#
|
16
16
|
# Returns an Order.
|
17
17
|
def current_order
|
18
|
-
@current_order ||= Order.includes(:projects).find_or_initialize_by(user: current_user,
|
18
|
+
@current_order ||= Order.includes(:projects).find_or_initialize_by(user: current_user, budget: budget)
|
19
19
|
end
|
20
20
|
|
21
21
|
def current_order=(order)
|
@@ -25,6 +25,18 @@ module Decidim
|
|
25
25
|
def persisted_current_order
|
26
26
|
current_order if current_order&.persisted?
|
27
27
|
end
|
28
|
+
|
29
|
+
def can_have_order?
|
30
|
+
current_user.present? &&
|
31
|
+
voting_open? &&
|
32
|
+
current_participatory_space.can_participate?(current_user) &&
|
33
|
+
allowed_to?(:create, :order, budget: budget, workflow: current_workflow)
|
34
|
+
end
|
35
|
+
|
36
|
+
# Return true if the user has voted the project
|
37
|
+
def voted_for?(project)
|
38
|
+
current_order && current_order.projects.include?(project)
|
39
|
+
end
|
28
40
|
end
|
29
41
|
end
|
30
42
|
end
|
@@ -17,7 +17,7 @@ module Decidim
|
|
17
17
|
def available_orders
|
18
18
|
@available_orders ||= begin
|
19
19
|
available_orders = []
|
20
|
-
available_orders << "random" if
|
20
|
+
available_orders << "random" if voting_open? || !votes_are_visible?
|
21
21
|
available_orders << "most_voted" if votes_are_visible?
|
22
22
|
available_orders += %w(highest_cost lowest_cost)
|
23
23
|
available_orders
|
@@ -28,10 +28,6 @@ module Decidim
|
|
28
28
|
available_orders.first
|
29
29
|
end
|
30
30
|
|
31
|
-
def voting_is_open?
|
32
|
-
current_settings.votes_enabled?
|
33
|
-
end
|
34
|
-
|
35
31
|
def votes_are_visible?
|
36
32
|
current_settings.show_votes?
|
37
33
|
end
|
@@ -39,9 +35,9 @@ module Decidim
|
|
39
35
|
def reorder(projects)
|
40
36
|
case order
|
41
37
|
when "highest_cost"
|
42
|
-
projects.order(
|
38
|
+
projects.order(budget_amount: :desc)
|
43
39
|
when "lowest_cost"
|
44
|
-
projects.order(
|
40
|
+
projects.order(budget_amount: :asc)
|
45
41
|
when "most_voted"
|
46
42
|
if votes_are_visible?
|
47
43
|
ids = projects.sort_by(&:confirmed_orders_count).map(&:id).reverse
|
@@ -9,13 +9,21 @@ module Decidim
|
|
9
9
|
# Note that it inherits from `Decidim::Components::BaseController`, which
|
10
10
|
# override its layout and provide all kinds of useful methods.
|
11
11
|
class ApplicationController < Decidim::Admin::Components::BaseController
|
12
|
-
helper_method :projects, :project
|
12
|
+
helper_method :budget, :projects, :project
|
13
|
+
|
14
|
+
def budget
|
15
|
+
@budget ||= Budget.where(component: current_component).includes(:projects).find_by(id: params[:budget_id])
|
16
|
+
end
|
13
17
|
|
14
18
|
def projects
|
15
|
-
|
19
|
+
return unless budget
|
20
|
+
|
21
|
+
@projects ||= budget.projects
|
16
22
|
end
|
17
23
|
|
18
24
|
def project
|
25
|
+
return unless projects
|
26
|
+
|
19
27
|
@project ||= projects.find(params[:id])
|
20
28
|
end
|
21
29
|
end
|
@@ -10,7 +10,7 @@ module Decidim
|
|
10
10
|
include Decidim::Admin::Concerns::HasAttachments
|
11
11
|
|
12
12
|
def after_destroy_path
|
13
|
-
|
13
|
+
budget_projects_path(project.budget)
|
14
14
|
end
|
15
15
|
|
16
16
|
def attached_to
|
@@ -18,7 +18,7 @@ module Decidim
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def project
|
21
|
-
@project ||=
|
21
|
+
@project ||= Decidim::Budgets::Project.find(params[:project_id])
|
22
22
|
end
|
23
23
|
end
|
24
24
|
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module Budgets
|
5
|
+
module Admin
|
6
|
+
# This controller allows the create or update a budget.
|
7
|
+
class BudgetsController < Admin::ApplicationController
|
8
|
+
helper_method :budgets, :budget
|
9
|
+
|
10
|
+
def new
|
11
|
+
enforce_permission_to :create, :budget
|
12
|
+
@form = form(BudgetForm).instance
|
13
|
+
end
|
14
|
+
|
15
|
+
def create
|
16
|
+
enforce_permission_to :create, :budget
|
17
|
+
@form = form(BudgetForm).from_params(params, current_component: current_component)
|
18
|
+
|
19
|
+
CreateBudget.call(@form) do
|
20
|
+
on(:ok) do
|
21
|
+
flash[:notice] = I18n.t("budgets.create.success", scope: "decidim.budgets.admin")
|
22
|
+
redirect_to budgets_path
|
23
|
+
end
|
24
|
+
|
25
|
+
on(:invalid) do
|
26
|
+
flash.now[:alert] = I18n.t("budgets.create.invalid", scope: "decidim.budgets.admin")
|
27
|
+
render action: "new"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def edit
|
33
|
+
enforce_permission_to :update, :budget, budget: budget
|
34
|
+
@form = form(BudgetForm).from_model(budget)
|
35
|
+
end
|
36
|
+
|
37
|
+
def update
|
38
|
+
enforce_permission_to :update, :budget, budget: budget
|
39
|
+
@form = form(BudgetForm).from_params(params, current_component: current_component)
|
40
|
+
|
41
|
+
UpdateBudget.call(@form, budget) do
|
42
|
+
on(:ok) do
|
43
|
+
flash[:notice] = I18n.t("budgets.update.success", scope: "decidim.budgets.admin")
|
44
|
+
redirect_to budgets_path
|
45
|
+
end
|
46
|
+
|
47
|
+
on(:invalid) do
|
48
|
+
flash.now[:alert] = I18n.t("budgets.update.invalid", scope: "decidim.budgets.admin")
|
49
|
+
render action: "edit"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def destroy
|
55
|
+
enforce_permission_to :delete, :budget, budget: budget
|
56
|
+
|
57
|
+
DestroyBudget.call(budget, current_user) do
|
58
|
+
on(:ok) do
|
59
|
+
flash[:notice] = I18n.t("budgets.destroy.success", scope: "decidim.budgets.admin")
|
60
|
+
end
|
61
|
+
|
62
|
+
on(:invalid) do
|
63
|
+
flash.now[:alert] = I18n.t("budgets.destroy.invalid", scope: "decidim.budgets.admin")
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
redirect_to budgets_path
|
68
|
+
end
|
69
|
+
|
70
|
+
private
|
71
|
+
|
72
|
+
def budgets
|
73
|
+
@budgets ||= Budget.where(component: current_component).order(weight: :asc)
|
74
|
+
end
|
75
|
+
|
76
|
+
def budget
|
77
|
+
@budget ||= budgets.find_by(id: params[:id])
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|