decidim-budgets 0.20.1 → 0.23.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (188) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +38 -3
  3. data/app/assets/images/decidim/budgets/icon.svg +1 -11
  4. data/app/assets/javascripts/decidim/budgets/projects.js.es6 +26 -4
  5. data/app/assets/stylesheets/decidim/budgets/budget/_budget-list.scss +152 -24
  6. data/app/cells/decidim/budgets/base_cell.rb +22 -0
  7. data/app/cells/decidim/budgets/budget_cell.rb +21 -0
  8. data/app/cells/decidim/budgets/budget_information_modal/show.erb +28 -0
  9. data/app/cells/decidim/budgets/budget_information_modal_cell.rb +22 -0
  10. data/app/cells/decidim/budgets/budget_list_item/show.erb +22 -0
  11. data/app/cells/decidim/budgets/budget_list_item_cell.rb +40 -0
  12. data/app/cells/decidim/budgets/budget_m/data.erb +12 -0
  13. data/app/cells/decidim/budgets/budget_m/footer.erb +5 -0
  14. data/app/cells/decidim/budgets/budget_m_cell.rb +16 -0
  15. data/app/cells/decidim/budgets/budgets_header/show.erb +7 -0
  16. data/app/cells/decidim/budgets/budgets_header_cell.rb +14 -0
  17. data/app/cells/decidim/budgets/budgets_list/card_list.erb +7 -0
  18. data/app/cells/decidim/budgets/budgets_list/highlighted.erb +11 -0
  19. data/app/cells/decidim/budgets/budgets_list/show.erb +20 -0
  20. data/app/cells/decidim/budgets/budgets_list/voted.erb +43 -0
  21. data/app/cells/decidim/budgets/budgets_list_cell.rb +39 -0
  22. data/app/cells/decidim/budgets/limit_announcement_cell.rb +52 -0
  23. data/app/cells/decidim/budgets/project_list_item/project_data.erb +19 -0
  24. data/app/cells/decidim/budgets/project_list_item/project_data_vote_button.erb +15 -0
  25. data/app/cells/decidim/budgets/project_list_item/project_image.erb +5 -0
  26. data/app/cells/decidim/budgets/project_list_item/project_text.erb +23 -0
  27. data/app/cells/decidim/budgets/project_list_item/show.erb +5 -0
  28. data/app/cells/decidim/budgets/project_list_item_cell.rb +66 -0
  29. data/app/cells/decidim/budgets/project_m/data.erb +3 -3
  30. data/app/cells/decidim/budgets/project_m/footer.erb +1 -1
  31. data/app/cells/decidim/budgets/project_m_cell.rb +4 -0
  32. data/app/cells/decidim/budgets/project_selected_status_cell.rb +28 -0
  33. data/app/cells/decidim/budgets/project_tags/show.erb +5 -0
  34. data/app/cells/decidim/budgets/project_tags_cell.rb +18 -0
  35. data/app/cells/decidim/budgets/project_voted_hint_cell.rb +33 -0
  36. data/app/cells/decidim/budgets/project_votes_count_cell.rb +44 -0
  37. data/app/commands/decidim/budgets/add_line_item.rb +7 -10
  38. data/app/commands/decidim/budgets/admin/create_budget.rb +48 -0
  39. data/app/commands/decidim/budgets/admin/create_project.rb +26 -11
  40. data/app/commands/decidim/budgets/admin/destroy_budget.rb +42 -0
  41. data/app/commands/decidim/budgets/admin/import_proposals_to_budgets.rb +26 -25
  42. data/app/commands/decidim/budgets/admin/update_budget.rb +48 -0
  43. data/app/commands/decidim/budgets/admin/update_project.rb +20 -2
  44. data/app/commands/decidim/budgets/checkout.rb +7 -6
  45. data/app/commands/decidim/budgets/remove_line_item.rb +3 -2
  46. data/app/controllers/concerns/decidim/budgets/needs_current_order.rb +18 -2
  47. data/app/controllers/concerns/decidim/budgets/orderable.rb +57 -0
  48. data/app/controllers/decidim/budgets/admin/application_controller.rb +10 -2
  49. data/app/controllers/decidim/budgets/admin/attachment_collections_controller.rb +1 -1
  50. data/app/controllers/decidim/budgets/admin/attachments_controller.rb +2 -2
  51. data/app/controllers/decidim/budgets/admin/budgets_controller.rb +82 -0
  52. data/app/controllers/decidim/budgets/admin/projects_controller.rb +15 -12
  53. data/app/controllers/decidim/budgets/admin/proposals_imports_controller.rb +10 -2
  54. data/app/controllers/decidim/budgets/application_controller.rb +23 -0
  55. data/app/controllers/decidim/budgets/budgets_controller.rb +24 -0
  56. data/app/controllers/decidim/budgets/line_items_controller.rb +10 -6
  57. data/app/controllers/decidim/budgets/orders_controller.rb +20 -6
  58. data/app/controllers/decidim/budgets/projects_controller.rb +28 -7
  59. data/app/forms/decidim/budgets/admin/budget_form.rb +39 -0
  60. data/app/forms/decidim/budgets/admin/component_form.rb +44 -0
  61. data/app/forms/decidim/budgets/admin/project_form.rb +25 -9
  62. data/app/forms/decidim/budgets/admin/project_import_proposals_form.rb +4 -0
  63. data/app/helpers/decidim/budgets/admin/application_helper.rb +13 -0
  64. data/app/helpers/decidim/budgets/application_helper.rb +11 -0
  65. data/app/helpers/decidim/budgets/projects_helper.rb +13 -0
  66. data/app/jobs/decidim/budgets/send_order_summary_job.rb +15 -0
  67. data/app/mailers/decidim/budgets/order_summary_mailer.rb +36 -0
  68. data/app/models/decidim/budgets/budget.rb +34 -0
  69. data/app/models/decidim/budgets/line_item.rb +4 -4
  70. data/app/models/decidim/budgets/order.rb +46 -16
  71. data/app/models/decidim/budgets/project.rb +37 -4
  72. data/app/permissions/decidim/budgets/admin/permissions.rb +23 -10
  73. data/app/permissions/decidim/budgets/permissions.rb +28 -6
  74. data/app/presenters/decidim/budgets/admin_log/budget_presenter.rb +42 -0
  75. data/app/queries/decidim/budgets/filtered_projects.rb +9 -1
  76. data/app/queries/decidim/budgets/metrics/budget_followers_metric_measure.rb +3 -2
  77. data/app/queries/decidim/budgets/metrics/budget_participants_metric_measure.rb +6 -5
  78. data/app/serializers/decidim/budgets/data_portability_budgets_order_serializer.rb +3 -2
  79. data/app/services/decidim/budgets/project_search.rb +13 -17
  80. data/app/types/decidim/budgets/budget_type.rb +24 -0
  81. data/app/types/decidim/budgets/budgets_type.rb +32 -0
  82. data/app/types/decidim/budgets/project_type.rb +26 -0
  83. data/app/views/decidim/budgets/admin/budgets/_form.html.erb +23 -0
  84. data/app/views/decidim/budgets/admin/budgets/edit.html.erb +7 -0
  85. data/app/views/decidim/budgets/admin/budgets/index.html.erb +58 -0
  86. data/app/views/decidim/budgets/admin/budgets/new.html.erb +7 -0
  87. data/app/views/decidim/budgets/admin/projects/_form.html.erb +15 -10
  88. data/app/views/decidim/budgets/admin/projects/edit.html.erb +2 -2
  89. data/app/views/decidim/budgets/admin/projects/index.html.erb +20 -7
  90. data/app/views/decidim/budgets/admin/projects/new.html.erb +2 -2
  91. data/app/views/decidim/budgets/admin/projects/proposals_picker.html.erb +1 -0
  92. data/app/views/decidim/budgets/admin/proposals_imports/new.html.erb +1 -1
  93. data/app/views/decidim/budgets/budgets/index.html.erb +5 -0
  94. data/app/views/decidim/budgets/order_summary_mailer/order_summary.html.erb +22 -0
  95. data/app/views/decidim/budgets/projects/_budget_confirm.html.erb +3 -3
  96. data/app/views/decidim/budgets/projects/_budget_summary.html.erb +26 -7
  97. data/app/views/decidim/budgets/projects/_filters.html.erb +15 -7
  98. data/app/views/decidim/budgets/projects/_linked_projects.html.erb +2 -2
  99. data/app/views/decidim/budgets/projects/_order_progress.html.erb +14 -18
  100. data/app/views/decidim/budgets/projects/_order_selected_projects.html.erb +3 -3
  101. data/app/views/decidim/budgets/projects/_project.html.erb +1 -57
  102. data/app/views/decidim/budgets/projects/_project_budget_button.html.erb +36 -7
  103. data/app/views/decidim/budgets/projects/_projects.html.erb +8 -1
  104. data/app/views/decidim/budgets/projects/index.html.erb +15 -7
  105. data/app/views/decidim/budgets/projects/index.js.erb +8 -0
  106. data/app/views/decidim/budgets/projects/show.html.erb +18 -11
  107. data/config/locales/am-ET.yml +1 -0
  108. data/config/locales/ar.yml +3 -17
  109. data/config/locales/bg-BG.yml +7 -0
  110. data/config/locales/bg.yml +6 -0
  111. data/config/locales/ca.yml +126 -12
  112. data/config/locales/cs.yml +145 -31
  113. data/config/locales/da-DK.yml +1 -0
  114. data/config/locales/da.yml +1 -0
  115. data/config/locales/de.yml +115 -12
  116. data/config/locales/el.yml +169 -0
  117. data/config/locales/en.yml +126 -12
  118. data/config/locales/eo.yml +1 -0
  119. data/config/locales/es-MX.yml +126 -12
  120. data/config/locales/es-PY.yml +126 -12
  121. data/config/locales/es.yml +126 -12
  122. data/config/locales/et-EE.yml +1 -0
  123. data/config/locales/et.yml +1 -0
  124. data/config/locales/eu.yml +4 -14
  125. data/config/locales/fi-plain.yml +127 -13
  126. data/config/locales/fi.yml +137 -23
  127. data/config/locales/fr-CA.yml +266 -0
  128. data/config/locales/fr.yml +125 -12
  129. data/config/locales/ga-IE.yml +1 -0
  130. data/config/locales/gl.yml +3 -13
  131. data/config/locales/hr-HR.yml +1 -0
  132. data/config/locales/hr.yml +1 -0
  133. data/config/locales/hu.yml +19 -13
  134. data/config/locales/id-ID.yml +3 -12
  135. data/config/locales/is-IS.yml +1 -12
  136. data/config/locales/is.yml +114 -0
  137. data/config/locales/it.yml +97 -13
  138. data/config/locales/ja-JP.yml +172 -0
  139. data/config/locales/ja.yml +262 -0
  140. data/config/locales/ko-KR.yml +1 -0
  141. data/config/locales/ko.yml +1 -0
  142. data/config/locales/lt-LT.yml +1 -0
  143. data/config/locales/lt.yml +1 -0
  144. data/config/locales/lv.yml +164 -0
  145. data/config/locales/mt-MT.yml +1 -0
  146. data/config/locales/mt.yml +1 -0
  147. data/config/locales/nl.yml +113 -13
  148. data/config/locales/no.yml +39 -13
  149. data/config/locales/om-ET.yml +1 -0
  150. data/config/locales/pl.yml +175 -62
  151. data/config/locales/pt-BR.yml +4 -14
  152. data/config/locales/pt.yml +63 -47
  153. data/config/locales/ro-RO.yml +172 -0
  154. data/config/locales/ru.yml +3 -15
  155. data/config/locales/sk-SK.yml +180 -0
  156. data/config/locales/sk.yml +166 -0
  157. data/config/locales/sl.yml +1 -0
  158. data/config/locales/so-SO.yml +1 -0
  159. data/config/locales/sr-CS.yml +27 -0
  160. data/config/locales/sv.yml +126 -12
  161. data/config/locales/ti-ER.yml +1 -0
  162. data/config/locales/tr-TR.yml +3 -13
  163. data/config/locales/uk.yml +3 -15
  164. data/config/locales/vi-VN.yml +1 -0
  165. data/config/locales/vi.yml +1 -0
  166. data/config/locales/zh-CN.yml +260 -0
  167. data/config/locales/zh-TW.yml +1 -0
  168. data/db/migrate/20200617105120_create_decidim_budgets.rb +15 -0
  169. data/db/migrate/20200629072626_rename_budget_to_budget_ammount.rb +7 -0
  170. data/db/migrate/20200629134013_add_budget_reference_to_project.rb +7 -0
  171. data/db/migrate/20200706142609_add_budget_reference_to_order.rb +7 -0
  172. data/db/migrate/20200714103519_move_budgets_to_own_model.rb +109 -0
  173. data/db/migrate/20200717140012_add_scope_to_budgets.rb +7 -0
  174. data/db/migrate/20200728075039_add_selected_at_to_project.rb +7 -0
  175. data/db/migrate/20200804175222_votes_enabled_to_votes_choices.rb +35 -0
  176. data/db/migrate/20200827154129_add_commentable_counter_cache_to_projects.rb +9 -0
  177. data/lib/decidim/budgets.rb +1 -0
  178. data/lib/decidim/budgets/admin_engine.rb +12 -5
  179. data/lib/decidim/budgets/component.rb +94 -38
  180. data/lib/decidim/budgets/engine.rb +8 -6
  181. data/lib/decidim/budgets/seeds/city.jpeg +0 -0
  182. data/lib/decidim/budgets/test/factories.rb +71 -9
  183. data/lib/decidim/budgets/version.rb +1 -1
  184. data/lib/decidim/budgets/workflows.rb +17 -0
  185. data/lib/decidim/budgets/workflows/all.rb +20 -0
  186. data/lib/decidim/budgets/workflows/base.rb +132 -0
  187. data/lib/decidim/budgets/workflows/one.rb +33 -0
  188. metadata +121 -16
@@ -6,6 +6,9 @@ module Decidim
6
6
  # This command is executed when the user changes a Project from the admin
7
7
  # panel.
8
8
  class UpdateProject < Rectify::Command
9
+ include ::Decidim::AttachmentMethods
10
+ include ::Decidim::GalleryMethods
11
+
9
12
  # Initializes an UpdateProject Command.
10
13
  #
11
14
  # form - The form from which to get the data.
@@ -13,6 +16,7 @@ module Decidim
13
16
  def initialize(form, project)
14
17
  @form = form
15
18
  @project = project
19
+ @attached_to = project
16
20
  end
17
21
 
18
22
  # Updates the project if valid.
@@ -21,9 +25,16 @@ module Decidim
21
25
  def call
22
26
  return broadcast(:invalid) if form.invalid?
23
27
 
28
+ if process_gallery?
29
+ build_gallery
30
+ return broadcast(:invalid) if gallery_invalid?
31
+ end
32
+
24
33
  transaction do
25
34
  update_project
26
35
  link_proposals
36
+ create_gallery if process_gallery?
37
+ photo_cleanup!
27
38
  end
28
39
 
29
40
  broadcast(:ok)
@@ -31,7 +42,7 @@ module Decidim
31
42
 
32
43
  private
33
44
 
34
- attr_reader :project, :form
45
+ attr_reader :project, :form, :gallery
35
46
 
36
47
  def update_project
37
48
  Decidim.traceability.update!(
@@ -41,7 +52,8 @@ module Decidim
41
52
  category: form.category,
42
53
  title: form.title,
43
54
  description: form.description,
44
- budget: form.budget
55
+ budget_amount: form.budget_amount,
56
+ selected_at: selected_at
45
57
  )
46
58
  end
47
59
 
@@ -52,6 +64,12 @@ module Decidim
52
64
  def link_proposals
53
65
  project.link_resources(proposals, "included_proposals")
54
66
  end
67
+
68
+ def selected_at
69
+ return unless form.selected
70
+
71
+ Time.current
72
+ end
55
73
  end
56
74
  end
57
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,17 +18,20 @@ 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
31
+ return unless order && order.valid?
32
32
 
33
33
  @order.with_lock do
34
+ SendOrderSummaryJob.perform_later(@order)
34
35
  @order.checked_out_at = Time.current
35
36
  @order.save
36
37
  end
@@ -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,18 +9,34 @@ 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_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)
22
22
  @current_order = order
23
23
  end
24
+
25
+ def persisted_current_order
26
+ current_order if current_order&.persisted?
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
24
40
  end
25
41
  end
26
42
  end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/concern"
4
+
5
+ module Decidim
6
+ module Budgets
7
+ # Common logic to sorting resources
8
+ module Orderable
9
+ extend ActiveSupport::Concern
10
+
11
+ included do
12
+ include Decidim::Orderable
13
+
14
+ private
15
+
16
+ # Available orders based on enabled settings
17
+ def available_orders
18
+ @available_orders ||= begin
19
+ available_orders = []
20
+ available_orders << "random" if voting_open? || !votes_are_visible?
21
+ available_orders << "most_voted" if votes_are_visible?
22
+ available_orders += %w(highest_cost lowest_cost)
23
+ available_orders
24
+ end
25
+ end
26
+
27
+ def default_order
28
+ available_orders.first
29
+ end
30
+
31
+ def votes_are_visible?
32
+ current_settings.show_votes?
33
+ end
34
+
35
+ def reorder(projects)
36
+ case order
37
+ when "highest_cost"
38
+ projects.order(budget_amount: :desc)
39
+ when "lowest_cost"
40
+ projects.order(budget_amount: :asc)
41
+ when "most_voted"
42
+ if votes_are_visible?
43
+ ids = projects.sort_by(&:confirmed_orders_count).map(&:id).reverse
44
+ projects.ordered_ids(ids)
45
+ else
46
+ projects
47
+ end
48
+ when "random"
49
+ projects.order_randomly(random_seed)
50
+ else
51
+ projects
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -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
@@ -5,23 +5,27 @@ module Decidim
5
5
  module Admin
6
6
  # This controller allows an admin to manage projects from a Participatory Process
7
7
  class ProjectsController < Admin::ApplicationController
8
- helper_method :projects, :finished_orders, :pending_orders
8
+ include Decidim::ApplicationHelper
9
+ include Decidim::Proposals::Admin::Picker
10
+
11
+ helper_method :projects, :finished_orders, :pending_orders, :present
9
12
 
10
13
  def new
11
14
  enforce_permission_to :create, :project
12
-
13
- @form = form(ProjectForm).instance
15
+ @form = form(ProjectForm).from_params(
16
+ attachment: form(AttachmentForm).instance
17
+ )
14
18
  end
15
19
 
16
20
  def create
17
21
  enforce_permission_to :create, :project
18
22
 
19
- @form = form(ProjectForm).from_params(params)
23
+ @form = form(ProjectForm).from_params(params, budget: budget)
20
24
 
21
25
  CreateProject.call(@form) do
22
26
  on(:ok) do
23
27
  flash[:notice] = I18n.t("projects.create.success", scope: "decidim.budgets.admin")
24
- redirect_to projects_path
28
+ redirect_to budget_projects_path(budget)
25
29
  end
26
30
 
27
31
  on(:invalid) do
@@ -33,19 +37,18 @@ module Decidim
33
37
 
34
38
  def edit
35
39
  enforce_permission_to :update, :project, project: project
36
-
37
40
  @form = form(ProjectForm).from_model(project)
41
+ @form.attachment = form(AttachmentForm).instance
38
42
  end
39
43
 
40
44
  def update
41
45
  enforce_permission_to :update, :project, project: project
42
-
43
- @form = form(ProjectForm).from_params(params)
46
+ @form = form(ProjectForm).from_params(params, budget: budget)
44
47
 
45
48
  UpdateProject.call(@form, project) do
46
49
  on(:ok) do
47
50
  flash[:notice] = I18n.t("projects.update.success", scope: "decidim.budgets.admin")
48
- redirect_to projects_path
51
+ redirect_to budget_projects_path(budget)
49
52
  end
50
53
 
51
54
  on(:invalid) do
@@ -61,7 +64,7 @@ module Decidim
61
64
  DestroyProject.call(project, current_user) do
62
65
  on(:ok) do
63
66
  flash[:notice] = I18n.t("projects.destroy.success", scope: "decidim.budgets.admin")
64
- redirect_to projects_path
67
+ redirect_to budget_projects_path(budget)
65
68
  end
66
69
  end
67
70
  end
@@ -69,11 +72,11 @@ module Decidim
69
72
  private
70
73
 
71
74
  def projects
72
- @projects ||= Project.where(component: current_component).page(params[:page]).per(15)
75
+ @projects ||= budget.projects.page(params[:page]).per(15)
73
76
  end
74
77
 
75
78
  def orders
76
- @orders ||= Order.where(component: current_component)
79
+ @orders ||= Order.where(budget: budget)
77
80
  end
78
81
 
79
82
  def pending_orders
@@ -4,6 +4,8 @@ module Decidim
4
4
  module Budgets
5
5
  module Admin
6
6
  class ProposalsImportsController < Admin::ApplicationController
7
+ helper_method :budget
8
+
7
9
  def new
8
10
  enforce_permission_to :import_proposals, :projects
9
11
 
@@ -13,11 +15,11 @@ module Decidim
13
15
  def create
14
16
  enforce_permission_to :import_proposals, :projects
15
17
 
16
- @form = form(Admin::ProjectImportProposalsForm).from_params(params)
18
+ @form = form(Admin::ProjectImportProposalsForm).from_params(params, budget: budget)
17
19
  Admin::ImportProposalsToBudgets.call(@form) do
18
20
  on(:ok) do |projects|
19
21
  flash[:notice] = I18n.t("proposals_imports.create.success", scope: "decidim.budgets.admin", number: projects.length)
20
- redirect_to EngineRouter.admin_proxy(current_component).root_path
22
+ redirect_to budget_projects_path(budget)
21
23
  end
22
24
 
23
25
  on(:invalid) do
@@ -26,6 +28,12 @@ module Decidim
26
28
  end
27
29
  end
28
30
  end
31
+
32
+ private
33
+
34
+ def budget
35
+ @budget ||= Budget.where(component: current_component).find_by(id: params[:budget_id])
36
+ end
29
37
  end
30
38
  end
31
39
  end