decidim-budgets 0.22.0 → 0.23.3
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 +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
|