decidim-budgets 0.22.0 → 0.23.0

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.
Files changed (171) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +38 -3
  3. data/app/assets/stylesheets/decidim/budgets/budget/_budget-list.scss +5 -0
  4. data/app/cells/decidim/budgets/base_cell.rb +22 -0
  5. data/app/cells/decidim/budgets/budget_cell.rb +21 -0
  6. data/app/cells/decidim/budgets/budget_information_modal/show.erb +28 -0
  7. data/app/cells/decidim/budgets/budget_information_modal_cell.rb +22 -0
  8. data/app/cells/decidim/budgets/budget_list_item/show.erb +22 -0
  9. data/app/cells/decidim/budgets/budget_list_item_cell.rb +40 -0
  10. data/app/cells/decidim/budgets/budget_m/data.erb +12 -0
  11. data/app/cells/decidim/budgets/budget_m/footer.erb +5 -0
  12. data/app/cells/decidim/budgets/budget_m_cell.rb +16 -0
  13. data/app/cells/decidim/budgets/budgets_header/show.erb +7 -0
  14. data/app/cells/decidim/budgets/budgets_header_cell.rb +14 -0
  15. data/app/cells/decidim/budgets/budgets_list/card_list.erb +7 -0
  16. data/app/cells/decidim/budgets/budgets_list/highlighted.erb +11 -0
  17. data/app/cells/decidim/budgets/budgets_list/show.erb +20 -0
  18. data/app/cells/decidim/budgets/budgets_list/voted.erb +43 -0
  19. data/app/cells/decidim/budgets/budgets_list_cell.rb +39 -0
  20. data/app/cells/decidim/budgets/limit_announcement_cell.rb +52 -0
  21. data/app/cells/decidim/budgets/project_list_item/project_data.erb +17 -3
  22. data/app/cells/decidim/budgets/project_list_item/project_data_vote_button.erb +2 -2
  23. data/app/cells/decidim/budgets/project_list_item/project_text.erb +11 -5
  24. data/app/cells/decidim/budgets/project_list_item/show.erb +3 -3
  25. data/app/cells/decidim/budgets/project_list_item_cell.rb +8 -28
  26. data/app/cells/decidim/budgets/project_m/data.erb +1 -1
  27. data/app/cells/decidim/budgets/project_m_cell.rb +4 -0
  28. data/app/cells/decidim/budgets/project_selected_status_cell.rb +28 -0
  29. data/app/cells/decidim/budgets/project_tags/show.erb +5 -0
  30. data/app/cells/decidim/budgets/project_tags_cell.rb +18 -0
  31. data/app/cells/decidim/budgets/project_voted_hint_cell.rb +33 -0
  32. data/app/cells/decidim/budgets/project_votes_count_cell.rb +44 -0
  33. data/app/commands/decidim/budgets/add_line_item.rb +7 -10
  34. data/app/commands/decidim/budgets/admin/create_budget.rb +48 -0
  35. data/app/commands/decidim/budgets/admin/create_project.rb +12 -7
  36. data/app/commands/decidim/budgets/admin/destroy_budget.rb +42 -0
  37. data/app/commands/decidim/budgets/admin/import_proposals_to_budgets.rb +26 -25
  38. data/app/commands/decidim/budgets/admin/update_budget.rb +48 -0
  39. data/app/commands/decidim/budgets/admin/update_project.rb +8 -1
  40. data/app/commands/decidim/budgets/checkout.rb +6 -6
  41. data/app/commands/decidim/budgets/remove_line_item.rb +3 -2
  42. data/app/controllers/concerns/decidim/budgets/needs_current_order.rb +14 -2
  43. data/app/controllers/concerns/decidim/budgets/orderable.rb +3 -7
  44. data/app/controllers/decidim/budgets/admin/application_controller.rb +10 -2
  45. data/app/controllers/decidim/budgets/admin/attachment_collections_controller.rb +1 -1
  46. data/app/controllers/decidim/budgets/admin/attachments_controller.rb +2 -2
  47. data/app/controllers/decidim/budgets/admin/budgets_controller.rb +82 -0
  48. data/app/controllers/decidim/budgets/admin/projects_controller.rb +7 -7
  49. data/app/controllers/decidim/budgets/admin/proposals_imports_controller.rb +10 -2
  50. data/app/controllers/decidim/budgets/application_controller.rb +23 -0
  51. data/app/controllers/decidim/budgets/budgets_controller.rb +24 -0
  52. data/app/controllers/decidim/budgets/line_items_controller.rb +9 -5
  53. data/app/controllers/decidim/budgets/orders_controller.rb +20 -6
  54. data/app/controllers/decidim/budgets/projects_controller.rb +19 -18
  55. data/app/forms/decidim/budgets/admin/budget_form.rb +39 -0
  56. data/app/forms/decidim/budgets/admin/project_form.rb +14 -10
  57. data/app/forms/decidim/budgets/admin/project_import_proposals_form.rb +4 -0
  58. data/app/helpers/decidim/budgets/admin/application_helper.rb +13 -0
  59. data/app/helpers/decidim/budgets/application_helper.rb +10 -0
  60. data/app/helpers/decidim/budgets/projects_helper.rb +0 -4
  61. data/app/mailers/decidim/budgets/order_summary_mailer.rb +5 -3
  62. data/app/models/decidim/budgets/budget.rb +34 -0
  63. data/app/models/decidim/budgets/line_item.rb +4 -4
  64. data/app/models/decidim/budgets/order.rb +22 -19
  65. data/app/models/decidim/budgets/project.rb +34 -5
  66. data/app/permissions/decidim/budgets/admin/permissions.rb +23 -10
  67. data/app/permissions/decidim/budgets/permissions.rb +28 -6
  68. data/app/presenters/decidim/budgets/admin_log/budget_presenter.rb +42 -0
  69. data/app/queries/decidim/budgets/filtered_projects.rb +9 -1
  70. data/app/queries/decidim/budgets/metrics/budget_followers_metric_measure.rb +3 -2
  71. data/app/queries/decidim/budgets/metrics/budget_participants_metric_measure.rb +6 -5
  72. data/app/serializers/decidim/budgets/data_portability_budgets_order_serializer.rb +3 -2
  73. data/app/services/decidim/budgets/project_search.rb +12 -24
  74. data/app/types/decidim/budgets/budget_type.rb +24 -0
  75. data/app/types/decidim/budgets/budgets_type.rb +6 -6
  76. data/app/types/decidim/budgets/project_type.rb +2 -1
  77. data/app/views/decidim/budgets/admin/budgets/_form.html.erb +23 -0
  78. data/app/views/decidim/budgets/admin/budgets/edit.html.erb +7 -0
  79. data/app/views/decidim/budgets/admin/budgets/index.html.erb +58 -0
  80. data/app/views/decidim/budgets/admin/budgets/new.html.erb +7 -0
  81. data/app/views/decidim/budgets/admin/projects/_form.html.erb +12 -4
  82. data/app/views/decidim/budgets/admin/projects/edit.html.erb +2 -2
  83. data/app/views/decidim/budgets/admin/projects/index.html.erb +20 -7
  84. data/app/views/decidim/budgets/admin/projects/new.html.erb +2 -2
  85. data/app/views/decidim/budgets/admin/proposals_imports/new.html.erb +1 -1
  86. data/app/views/decidim/budgets/budgets/index.html.erb +5 -0
  87. data/app/views/decidim/budgets/order_summary_mailer/order_summary.html.erb +1 -0
  88. data/app/views/decidim/budgets/projects/_budget_confirm.html.erb +3 -3
  89. data/app/views/decidim/budgets/projects/_budget_summary.html.erb +19 -6
  90. data/app/views/decidim/budgets/projects/_filters.html.erb +6 -2
  91. data/app/views/decidim/budgets/projects/_linked_projects.html.erb +1 -1
  92. data/app/views/decidim/budgets/projects/_order_progress.html.erb +10 -6
  93. data/app/views/decidim/budgets/projects/_order_selected_projects.html.erb +3 -3
  94. data/app/views/decidim/budgets/projects/_project_budget_button.html.erb +36 -7
  95. data/app/views/decidim/budgets/projects/index.html.erb +12 -4
  96. data/app/views/decidim/budgets/projects/show.html.erb +17 -10
  97. data/config/locales/am-ET.yml +1 -0
  98. data/config/locales/ar.yml +2 -11
  99. data/config/locales/bg.yml +6 -0
  100. data/config/locales/ca.yml +102 -10
  101. data/config/locales/cs.yml +105 -13
  102. data/config/locales/da.yml +1 -0
  103. data/config/locales/de.yml +90 -9
  104. data/config/locales/el.yml +3 -9
  105. data/config/locales/en.yml +101 -9
  106. data/config/locales/eo.yml +1 -0
  107. data/config/locales/es-MX.yml +101 -9
  108. data/config/locales/es-PY.yml +101 -9
  109. data/config/locales/es.yml +102 -10
  110. data/config/locales/et.yml +1 -0
  111. data/config/locales/eu.yml +3 -8
  112. data/config/locales/fi-plain.yml +102 -10
  113. data/config/locales/fi.yml +103 -11
  114. data/config/locales/fr-CA.yml +100 -9
  115. data/config/locales/fr.yml +100 -9
  116. data/config/locales/gl.yml +2 -7
  117. data/config/locales/hr.yml +1 -0
  118. data/config/locales/hu.yml +2 -7
  119. data/config/locales/id-ID.yml +2 -6
  120. data/config/locales/is-IS.yml +0 -6
  121. data/config/locales/is.yml +114 -0
  122. data/config/locales/it.yml +71 -9
  123. data/config/locales/ja-JP.yml +1 -0
  124. data/config/locales/ja.yml +262 -0
  125. data/config/locales/ko-KR.yml +1 -0
  126. data/config/locales/ko.yml +1 -0
  127. data/config/locales/lt.yml +1 -0
  128. data/config/locales/{lv-LV.yml → lv.yml} +2 -10
  129. data/config/locales/mt.yml +1 -0
  130. data/config/locales/nl.yml +88 -10
  131. data/config/locales/no.yml +22 -9
  132. data/config/locales/om-ET.yml +1 -0
  133. data/config/locales/pl.yml +113 -22
  134. data/config/locales/pt-BR.yml +2 -7
  135. data/config/locales/pt.yml +3 -9
  136. data/config/locales/ro-RO.yml +3 -10
  137. data/config/locales/ru.yml +2 -9
  138. data/config/locales/sk.yml +2 -11
  139. data/config/locales/sl.yml +0 -4
  140. data/config/locales/so-SO.yml +1 -0
  141. data/config/locales/sr-CS.yml +0 -2
  142. data/config/locales/sv.yml +80 -9
  143. data/config/locales/ti-ER.yml +1 -0
  144. data/config/locales/tr-TR.yml +2 -7
  145. data/config/locales/uk.yml +2 -9
  146. data/config/locales/vi-VN.yml +1 -0
  147. data/config/locales/vi.yml +1 -0
  148. data/config/locales/zh-CN.yml +260 -0
  149. data/config/locales/zh-TW.yml +1 -0
  150. data/db/migrate/20200617105120_create_decidim_budgets.rb +15 -0
  151. data/db/migrate/20200629072626_rename_budget_to_budget_ammount.rb +7 -0
  152. data/db/migrate/20200629134013_add_budget_reference_to_project.rb +7 -0
  153. data/db/migrate/20200706142609_add_budget_reference_to_order.rb +7 -0
  154. data/db/migrate/20200714103519_move_budgets_to_own_model.rb +109 -0
  155. data/db/migrate/20200717140012_add_scope_to_budgets.rb +7 -0
  156. data/db/migrate/20200728075039_add_selected_at_to_project.rb +7 -0
  157. data/db/migrate/20200804175222_votes_enabled_to_votes_choices.rb +35 -0
  158. data/db/migrate/20200827154129_add_commentable_counter_cache_to_projects.rb +9 -0
  159. data/lib/decidim/budgets.rb +1 -0
  160. data/lib/decidim/budgets/admin_engine.rb +10 -5
  161. data/lib/decidim/budgets/component.rb +83 -38
  162. data/lib/decidim/budgets/engine.rb +8 -6
  163. data/lib/decidim/budgets/test/factories.rb +42 -13
  164. data/lib/decidim/budgets/version.rb +1 -1
  165. data/lib/decidim/budgets/workflows.rb +17 -0
  166. data/lib/decidim/budgets/workflows/all.rb +20 -0
  167. data/lib/decidim/budgets/workflows/base.rb +132 -0
  168. data/lib/decidim/budgets/workflows/one.rb +33 -0
  169. metadata +84 -17
  170. data/app/cells/decidim/budgets/project_list_item/project_data_number.erb +0 -3
  171. 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 component.
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, target_component)
35
+ next if proposal_already_copied?(original_proposal)
36
36
 
37
- project = Decidim::Budgets::Project.new
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
- project.link_resources([original_proposal], "included_proposals")
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
- @form.origin_component
67
+ form.origin_component
57
68
  end
58
69
 
59
- def target_component
60
- @form.current_component
61
- end
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
- budget: form.budget
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
- # component - The current component.
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, @order) unless checkout!
21
+ return broadcast(:invalid, order) unless checkout!
24
22
 
25
- broadcast(:ok, @order)
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 @order && @order.valid?
31
+ return unless order && order.valid?
32
32
 
33
33
  @order.with_lock do
34
34
  SendOrderSummaryJob.perform_later(@order)
@@ -28,9 +28,10 @@ module Decidim
28
28
 
29
29
  private
30
30
 
31
+ attr_reader :project
32
+
31
33
  def remove_line_item
32
- @order.projects.destroy(@project)
33
- @order.save!
34
+ @order.projects.destroy(project)
34
35
  end
35
36
  end
36
37
  end
@@ -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, component: current_component)
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 voting_is_open? || !votes_are_visible?
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(budget: :desc)
38
+ projects.order(budget_amount: :desc)
43
39
  when "lowest_cost"
44
- projects.order(budget: :asc)
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
- @projects ||= Project.where(component: current_component)
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
@@ -17,7 +17,7 @@ module Decidim
17
17
  end
18
18
 
19
19
  def project
20
- @project ||= projects.find(params[:project_id])
20
+ @project ||= Decidim::Budgets::Project.find(params[:project_id])
21
21
  end
22
22
  end
23
23
  end
@@ -10,7 +10,7 @@ module Decidim
10
10
  include Decidim::Admin::Concerns::HasAttachments
11
11
 
12
12
  def after_destroy_path
13
- projects_path
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 ||= projects.find(params[:project_id])
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
@@ -20,12 +20,12 @@ module Decidim
20
20
  def create
21
21
  enforce_permission_to :create, :project
22
22
 
23
- @form = form(ProjectForm).from_params(params)
23
+ @form = form(ProjectForm).from_params(params, budget: budget)
24
24
 
25
25
  CreateProject.call(@form) do
26
26
  on(:ok) do
27
27
  flash[:notice] = I18n.t("projects.create.success", scope: "decidim.budgets.admin")
28
- redirect_to projects_path
28
+ redirect_to budget_projects_path(budget)
29
29
  end
30
30
 
31
31
  on(:invalid) do
@@ -43,12 +43,12 @@ module Decidim
43
43
 
44
44
  def update
45
45
  enforce_permission_to :update, :project, project: project
46
- @form = form(ProjectForm).from_params(params)
46
+ @form = form(ProjectForm).from_params(params, budget: budget)
47
47
 
48
48
  UpdateProject.call(@form, project) do
49
49
  on(:ok) do
50
50
  flash[:notice] = I18n.t("projects.update.success", scope: "decidim.budgets.admin")
51
- redirect_to projects_path
51
+ redirect_to budget_projects_path(budget)
52
52
  end
53
53
 
54
54
  on(:invalid) do
@@ -64,7 +64,7 @@ module Decidim
64
64
  DestroyProject.call(project, current_user) do
65
65
  on(:ok) do
66
66
  flash[:notice] = I18n.t("projects.destroy.success", scope: "decidim.budgets.admin")
67
- redirect_to projects_path
67
+ redirect_to budget_projects_path(budget)
68
68
  end
69
69
  end
70
70
  end
@@ -72,11 +72,11 @@ module Decidim
72
72
  private
73
73
 
74
74
  def projects
75
- @projects ||= Project.where(component: current_component).page(params[:page]).per(15)
75
+ @projects ||= budget.projects.page(params[:page]).per(15)
76
76
  end
77
77
 
78
78
  def orders
79
- @orders ||= Order.where(component: current_component)
79
+ @orders ||= Order.where(budget: budget)
80
80
  end
81
81
 
82
82
  def pending_orders