decidim-participatory_processes 0.26.9 → 0.27.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (176) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +0 -4
  3. data/app/cells/decidim/participatory_process_groups/content_blocks/highlighted_participatory_processes/filters.erb +3 -3
  4. data/app/cells/decidim/participatory_process_groups/content_blocks/highlighted_participatory_processes/show.erb +1 -0
  5. data/app/cells/decidim/participatory_process_groups/content_blocks/highlighted_participatory_processes_cell.rb +6 -11
  6. data/app/cells/decidim/participatory_process_groups/content_blocks/title/show.erb +1 -1
  7. data/app/cells/decidim/participatory_process_groups/content_blocks/title_cell.rb +1 -8
  8. data/app/cells/decidim/participatory_process_groups/process_filters_cell.rb +15 -18
  9. data/app/cells/decidim/participatory_processes/content_blocks/highlighted_processes/show.erb +1 -1
  10. data/app/cells/decidim/participatory_processes/content_blocks/highlighted_processes/single_process.erb +1 -1
  11. data/app/cells/decidim/participatory_processes/content_blocks/highlighted_processes_cell.rb +1 -1
  12. data/app/cells/decidim/participatory_processes/filtered_participatory_processes_cell.rb +11 -7
  13. data/app/cells/decidim/participatory_processes/process_filters/show.erb +13 -9
  14. data/app/cells/decidim/participatory_processes/process_filters/type_filter.erb +17 -0
  15. data/app/cells/decidim/participatory_processes/process_filters_cell.rb +49 -21
  16. data/app/cells/decidim/participatory_processes/process_group_s/image.erb +1 -1
  17. data/app/cells/decidim/participatory_processes/process_s/image.erb +1 -1
  18. data/app/commands/decidim/participatory_processes/admin/activate_participatory_process_step.rb +1 -1
  19. data/app/commands/decidim/participatory_processes/admin/copy_participatory_process.rb +11 -8
  20. data/app/commands/decidim/participatory_processes/admin/create_participatory_process.rb +2 -1
  21. data/app/commands/decidim/participatory_processes/admin/create_participatory_process_group.rb +1 -1
  22. data/app/commands/decidim/participatory_processes/admin/create_participatory_process_step.rb +1 -1
  23. data/app/commands/decidim/participatory_processes/admin/create_participatory_process_type.rb +47 -0
  24. data/app/commands/decidim/participatory_processes/admin/destroy_participatory_process_admin.rb +1 -6
  25. data/app/commands/decidim/participatory_processes/admin/destroy_participatory_process_group.rb +1 -1
  26. data/app/commands/decidim/participatory_processes/admin/destroy_participatory_process_step.rb +1 -1
  27. data/app/commands/decidim/participatory_processes/admin/destroy_participatory_process_type.rb +49 -0
  28. data/app/commands/decidim/participatory_processes/admin/import_participatory_process.rb +9 -6
  29. data/app/commands/decidim/participatory_processes/admin/notify_role_assigned_to_participatory_process.rb +1 -1
  30. data/app/commands/decidim/participatory_processes/admin/publish_participatory_process.rb +1 -1
  31. data/app/commands/decidim/participatory_processes/admin/reorder_participatory_process_steps.rb +1 -1
  32. data/app/commands/decidim/participatory_processes/admin/unpublish_participatory_process.rb +1 -1
  33. data/app/commands/decidim/participatory_processes/admin/update_participatory_process.rb +2 -1
  34. data/app/commands/decidim/participatory_processes/admin/update_participatory_process_group.rb +1 -1
  35. data/app/commands/decidim/participatory_processes/admin/update_participatory_process_step.rb +1 -1
  36. data/app/commands/decidim/participatory_processes/admin/update_participatory_process_type.rb +49 -0
  37. data/app/controllers/decidim/participatory_processes/admin/participatory_process_copies_controller.rb +1 -1
  38. data/app/controllers/decidim/participatory_processes/admin/participatory_process_groups_controller.rb +3 -2
  39. data/app/controllers/decidim/participatory_processes/admin/participatory_process_types_controller.rb +98 -0
  40. data/app/controllers/decidim/participatory_processes/admin/participatory_processes_controller.rb +1 -1
  41. data/app/controllers/decidim/participatory_processes/admin/reminders_controller.rb +14 -0
  42. data/app/controllers/decidim/participatory_processes/participatory_processes_controller.rb +8 -7
  43. data/app/events/decidim/participatory_process_role_assigned_event.rb +1 -1
  44. data/app/forms/decidim/participatory_processes/admin/participatory_process_form.rb +16 -0
  45. data/app/forms/decidim/participatory_processes/admin/participatory_process_import_form.rb +5 -7
  46. data/app/forms/decidim/participatory_processes/admin/participatory_process_type_form.rb +20 -0
  47. data/app/helpers/decidim/participatory_processes/participatory_process_helper.rb +2 -2
  48. data/app/models/decidim/participatory_process.rb +35 -6
  49. data/app/models/decidim/participatory_process_type.rb +27 -0
  50. data/app/permissions/decidim/participatory_processes/permissions.rb +14 -0
  51. data/app/presenters/decidim/log/value_types/participatory_process_type_presenter.rb +27 -0
  52. data/app/presenters/decidim/participatory_processes/admin_log/participatory_process_presenter.rb +3 -2
  53. data/app/presenters/decidim/participatory_processes/admin_log/participatory_process_type_presenter.rb +38 -0
  54. data/app/presenters/decidim/participatory_processes/participatory_process_group_stats_presenter.rb +4 -1
  55. data/app/presenters/decidim/participatory_processes/participatory_process_metric_charts_presenter.rb +5 -1
  56. data/app/presenters/decidim/participatory_processes/participatory_process_stats_presenter.rb +4 -1
  57. data/app/queries/decidim/participatory_processes/admin/admin_users.rb +1 -1
  58. data/app/queries/decidim/participatory_processes/admin/moderators.rb +1 -1
  59. data/app/queries/decidim/participatory_processes/filtered_participatory_process_groups.rb +3 -5
  60. data/app/queries/decidim/participatory_processes/filtered_participatory_processes.rb +1 -1
  61. data/app/queries/decidim/participatory_processes/group_participatory_processes.rb +1 -1
  62. data/app/queries/decidim/participatory_processes/group_published_participatory_processes.rb +2 -2
  63. data/app/queries/decidim/participatory_processes/highlighted_participatory_processes.rb +1 -1
  64. data/app/queries/decidim/participatory_processes/organization_participatory_process_groups.rb +1 -1
  65. data/app/queries/decidim/participatory_processes/organization_participatory_processes.rb +1 -1
  66. data/app/queries/decidim/participatory_processes/organization_prioritized_participatory_process_groups.rb +2 -2
  67. data/app/queries/decidim/participatory_processes/organization_prioritized_participatory_processes.rb +2 -2
  68. data/app/queries/decidim/participatory_processes/organization_promoted_participatory_process_groups.rb +1 -1
  69. data/app/queries/decidim/participatory_processes/organization_published_participatory_processes.rb +2 -2
  70. data/app/queries/decidim/participatory_processes/participatory_processes_by_group.rb +1 -1
  71. data/app/queries/decidim/participatory_processes/prioritized_participatory_processes.rb +1 -1
  72. data/app/queries/decidim/participatory_processes/promoted_participatory_process_groups.rb +1 -1
  73. data/app/queries/decidim/participatory_processes/promoted_participatory_processes.rb +1 -1
  74. data/app/queries/decidim/participatory_processes/published_participatory_processes.rb +1 -1
  75. data/app/queries/decidim/participatory_processes/stats_followers_count.rb +2 -2
  76. data/app/queries/decidim/participatory_processes/stats_participants_count.rb +2 -14
  77. data/app/queries/decidim/participatory_processes/visible_participatory_process_groups.rb +1 -1
  78. data/app/queries/decidim/participatory_processes/visible_participatory_processes.rb +1 -1
  79. data/app/serializers/decidim/participatory_processes/participatory_process_importer.rb +4 -15
  80. data/app/views/decidim/participatory_process_steps/_participatory_process_step.html.erb +1 -1
  81. data/app/views/decidim/participatory_processes/admin/participatory_process_copies/new.html.erb +2 -1
  82. data/app/views/decidim/participatory_processes/admin/participatory_process_groups/_form.html.erb +1 -1
  83. data/app/views/decidim/participatory_processes/admin/participatory_process_groups/edit.html.erb +0 -1
  84. data/app/views/decidim/participatory_processes/admin/participatory_process_groups/index.html.erb +0 -1
  85. data/app/views/decidim/participatory_processes/admin/participatory_process_groups/new.html.erb +0 -1
  86. data/app/views/decidim/participatory_processes/admin/participatory_process_steps/_form.html.erb +1 -1
  87. data/app/views/decidim/participatory_processes/admin/participatory_process_types/_form.html.erb +11 -0
  88. data/app/views/decidim/participatory_processes/admin/participatory_process_types/edit.html.erb +9 -0
  89. data/app/views/decidim/participatory_processes/admin/participatory_process_types/index.html.erb +60 -0
  90. data/app/views/decidim/participatory_processes/admin/participatory_process_types/new.html.erb +9 -0
  91. data/app/views/decidim/participatory_processes/admin/participatory_processes/_form.html.erb +11 -1
  92. data/app/views/decidim/participatory_processes/admin/participatory_processes/index.html.erb +1 -0
  93. data/app/views/decidim/participatory_processes/admin/participatory_processes/new.html.erb +1 -0
  94. data/app/views/decidim/participatory_processes/participatory_process_groups/show.html.erb +3 -1
  95. data/app/views/decidim/participatory_processes/participatory_process_groups/show.js.erb +9 -6
  96. data/app/views/decidim/participatory_processes/participatory_process_steps/index.html.erb +1 -0
  97. data/app/views/decidim/participatory_processes/participatory_processes/_promoted_process.html.erb +1 -1
  98. data/app/views/decidim/participatory_processes/participatory_processes/_promoted_process_group.html.erb +1 -1
  99. data/app/views/decidim/participatory_processes/participatory_processes/index.html.erb +3 -1
  100. data/app/views/decidim/participatory_processes/participatory_processes/index.js.erb +3 -1
  101. data/app/views/decidim/participatory_processes/participatory_processes/show.html.erb +2 -2
  102. data/app/views/layouts/decidim/_process_header.html.erb +1 -1
  103. data/app/views/layouts/decidim/admin/participatory_process_type.html.erb +15 -0
  104. data/config/locales/am-ET.yml +1 -0
  105. data/config/locales/ar.yml +10 -13
  106. data/config/locales/bg.yml +1 -6
  107. data/config/locales/ca.yml +51 -16
  108. data/config/locales/cs.yml +62 -27
  109. data/config/locales/da.yml +1 -0
  110. data/config/locales/de.yml +20 -32
  111. data/config/locales/el.yml +9 -69
  112. data/config/locales/en.yml +42 -8
  113. data/config/locales/eo.yml +1 -0
  114. data/config/locales/es-MX.yml +46 -11
  115. data/config/locales/es-PY.yml +46 -11
  116. data/config/locales/es.yml +47 -12
  117. data/config/locales/et.yml +1 -0
  118. data/config/locales/eu.yml +121 -136
  119. data/config/locales/fi-plain.yml +48 -13
  120. data/config/locales/fi.yml +49 -14
  121. data/config/locales/fr-CA.yml +49 -14
  122. data/config/locales/fr.yml +51 -16
  123. data/config/locales/ga-IE.yml +1 -2
  124. data/config/locales/gl.yml +14 -10
  125. data/config/locales/hr.yml +1 -0
  126. data/config/locales/hu.yml +60 -136
  127. data/config/locales/id-ID.yml +10 -13
  128. data/config/locales/is-IS.yml +16 -6
  129. data/config/locales/it.yml +20 -15
  130. data/config/locales/ja.yml +53 -18
  131. data/config/locales/ko.yml +1 -0
  132. data/config/locales/lb.yml +8 -10
  133. data/config/locales/lt.yml +1 -505
  134. data/config/locales/lv.yml +10 -19
  135. data/config/locales/mt.yml +1 -0
  136. data/config/locales/nl.yml +16 -11
  137. data/config/locales/no.yml +36 -15
  138. data/config/locales/om-ET.yml +1 -0
  139. data/config/locales/pl.yml +19 -8
  140. data/config/locales/pt-BR.yml +14 -11
  141. data/config/locales/pt.yml +15 -10
  142. data/config/locales/ro-RO.yml +11 -15
  143. data/config/locales/ru.yml +10 -10
  144. data/config/locales/si-LK.yml +1 -0
  145. data/config/locales/sk.yml +11 -19
  146. data/config/locales/sl.yml +1 -3
  147. data/config/locales/so-SO.yml +1 -0
  148. data/config/locales/sr-CS.yml +1 -0
  149. data/config/locales/sv.yml +29 -13
  150. data/config/locales/sw-KE.yml +1 -0
  151. data/config/locales/ti-ER.yml +1 -0
  152. data/config/locales/tr-TR.yml +15 -10
  153. data/config/locales/uk.yml +10 -10
  154. data/config/locales/val-ES.yml +1 -0
  155. data/config/locales/vi.yml +1 -0
  156. data/config/locales/zh-CN.yml +10 -18
  157. data/config/locales/zh-TW.yml +1 -477
  158. data/db/migrate/20211125202008_create_decidim_participatory_process_types.rb +22 -0
  159. data/lib/decidim/api/participatory_process_type_type.rb +17 -0
  160. data/lib/decidim/participatory_processes/admin_engine.rb +12 -1
  161. data/lib/decidim/participatory_processes/api.rb +1 -0
  162. data/lib/decidim/participatory_processes/participatory_space.rb +17 -8
  163. data/lib/decidim/participatory_processes/query_extensions.rb +22 -0
  164. data/lib/decidim/participatory_processes/test/factories.rb +17 -4
  165. data/lib/decidim/participatory_processes/version.rb +1 -1
  166. metadata +31 -24
  167. data/app/services/decidim/participatory_processes/participatory_process_search.rb +0 -27
  168. data/config/environment.rb +0 -3
  169. data/config/locales/fa-IR.yml +0 -1
  170. data/config/locales/gn-PY.yml +0 -1
  171. data/config/locales/ka-GE.yml +0 -1
  172. data/config/locales/kaa.yml +0 -6
  173. data/config/locales/lo-LA.yml +0 -1
  174. data/config/locales/oc-FR.yml +0 -1
  175. data/config/locales/sq-AL.yml +0 -1
  176. data/config/locales/th-TH.yml +0 -1
@@ -5,7 +5,7 @@ module Decidim
5
5
  module Admin
6
6
  # A command with all the business logic when copying a new participatory
7
7
  # process in the system.
8
- class ImportParticipatoryProcess < Rectify::Command
8
+ class ImportParticipatoryProcess < Decidim::Command
9
9
  # Public: Initializes the command.
10
10
  #
11
11
  # form - A form object with the params.
@@ -38,11 +38,14 @@ module Decidim
38
38
  def import_participatory_process
39
39
  importer = Decidim::ParticipatoryProcesses::ParticipatoryProcessImporter.new(form.current_organization, form.current_user)
40
40
  participatory_processes.each do |original_process|
41
- @imported_process = importer.import(original_process, form.current_user, title: form.title, slug: form.slug)
42
- importer.import_participatory_process_steps(original_process["participatory_process_steps"]) if form.import_steps?
43
- importer.import_categories(original_process["participatory_process_categories"]) if form.import_categories?
44
- importer.import_folders_and_attachments(original_process["attachments"]) if form.import_attachments?
45
- importer.import_components(original_process["components"]) if form.import_components?
41
+ Decidim.traceability.perform_action!("import", Decidim::ParticipatoryProcess, form.current_user) do
42
+ @imported_process = importer.import(original_process, form.current_user, title: form.title, slug: form.slug)
43
+ importer.import_participatory_process_steps(original_process["participatory_process_steps"]) if form.import_steps?
44
+ importer.import_categories(original_process["participatory_process_categories"]) if form.import_categories?
45
+ importer.import_folders_and_attachments(original_process["attachments"]) if form.import_attachments?
46
+ importer.import_components(original_process["components"]) if form.import_components?
47
+ @imported_process
48
+ end
46
49
  end
47
50
  end
48
51
 
@@ -4,7 +4,7 @@ module Decidim
4
4
  module ParticipatoryProcesses
5
5
  module Admin
6
6
  # A command to notify users when a role is assigned for a participatory process
7
- class NotifyRoleAssignedToParticipatoryProcess < Rectify::Command
7
+ class NotifyRoleAssignedToParticipatoryProcess < Decidim::Command
8
8
  def send_notification(user)
9
9
  Decidim::EventsManager.publish(
10
10
  event: "decidim.events.participatory_process.role_assigned",
@@ -4,7 +4,7 @@ module Decidim
4
4
  module ParticipatoryProcesses
5
5
  module Admin
6
6
  # A command that sets a participatory process as published.
7
- class PublishParticipatoryProcess < Rectify::Command
7
+ class PublishParticipatoryProcess < Decidim::Command
8
8
  # Public: Initializes the command.
9
9
  #
10
10
  # process - A ParticipatoryProcess that will be published
@@ -4,7 +4,7 @@ module Decidim
4
4
  module ParticipatoryProcesses
5
5
  module Admin
6
6
  # A command that reorders the steps in a participatory process.
7
- class ReorderParticipatoryProcessSteps < Rectify::Command
7
+ class ReorderParticipatoryProcessSteps < Decidim::Command
8
8
  # Public: Initializes the command.
9
9
  #
10
10
  # collection - an ActiveRecord::Relation of steps
@@ -4,7 +4,7 @@ module Decidim
4
4
  module ParticipatoryProcesses
5
5
  module Admin
6
6
  # A command that sets a participatory process as unpublished.
7
- class UnpublishParticipatoryProcess < Rectify::Command
7
+ class UnpublishParticipatoryProcess < Decidim::Command
8
8
  # Public: Initializes the command.
9
9
  #
10
10
  # process - A ParticipatoryProcess that will be unpublished
@@ -5,7 +5,7 @@ module Decidim
5
5
  module Admin
6
6
  # A command with all the business logic when creating a new participatory
7
7
  # process in the system.
8
- class UpdateParticipatoryProcess < Rectify::Command
8
+ class UpdateParticipatoryProcess < Decidim::Command
9
9
  include ::Decidim::AttachmentAttributesMethods
10
10
 
11
11
  # Public: Initializes the command.
@@ -77,6 +77,7 @@ module Decidim
77
77
  start_date: form.start_date,
78
78
  end_date: form.end_date,
79
79
  participatory_process_group: form.participatory_process_group,
80
+ participatory_process_type: form.participatory_process_type,
80
81
  show_metrics: form.show_metrics,
81
82
  show_statistics: form.show_statistics,
82
83
  announcement: form.announcement
@@ -5,7 +5,7 @@ module Decidim
5
5
  module Admin
6
6
  # A command with all the business logic when creating a new participatory
7
7
  # process group in the system.
8
- class UpdateParticipatoryProcessGroup < Rectify::Command
8
+ class UpdateParticipatoryProcessGroup < Decidim::Command
9
9
  include ::Decidim::AttachmentAttributesMethods
10
10
 
11
11
  # Public: Initializes the command.
@@ -5,7 +5,7 @@ module Decidim
5
5
  module Admin
6
6
  # A command with all the business logic when creating a new participatory
7
7
  # process in the system.
8
- class UpdateParticipatoryProcessStep < Rectify::Command
8
+ class UpdateParticipatoryProcessStep < Decidim::Command
9
9
  attr_reader :step
10
10
 
11
11
  # Public: Initializes the command.
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module ParticipatoryProcesses
5
+ module Admin
6
+ # A command with all the business logic when updating a participatory
7
+ # process type in the system.
8
+ class UpdateParticipatoryProcessType < Decidim::Command
9
+ # Public: Initializes the command.
10
+ #
11
+ # participatory_process_type - A participatory_process_type object to
12
+ # update
13
+ # form - A form object with the params.
14
+ def initialize(participatory_process_type, form)
15
+ @participatory_process_type = participatory_process_type
16
+ @form = form
17
+ end
18
+
19
+ # Executes the command. Broadcasts these events:
20
+ #
21
+ # - :ok when everything is valid.
22
+ # - :invalid if the form wasn't valid and we couldn't proceed.
23
+ #
24
+ # Returns nothing.
25
+ def call
26
+ return broadcast(:invalid) if form.invalid?
27
+
28
+ update_participatory_process_type!
29
+
30
+ broadcast(:ok)
31
+ end
32
+
33
+ private
34
+
35
+ attr_reader :form, :participatory_process_type
36
+
37
+ def update_participatory_process_type!
38
+ transaction do
39
+ Decidim.traceability.update!(
40
+ participatory_process_type,
41
+ form.current_user,
42
+ title: form.title
43
+ )
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -17,7 +17,7 @@ module Decidim
17
17
  enforce_permission_to :create, :process
18
18
  @form = form(ParticipatoryProcessCopyForm).from_params(params)
19
19
 
20
- CopyParticipatoryProcess.call(@form, current_participatory_process) do
20
+ CopyParticipatoryProcess.call(@form, current_participatory_process, current_user) do
21
21
  on(:ok) do
22
22
  flash[:notice] = I18n.t("participatory_processes_copies.create.success", scope: "decidim.admin")
23
23
  redirect_to participatory_processes_path
@@ -81,11 +81,12 @@ module Decidim
81
81
  private
82
82
 
83
83
  def participatory_process_group
84
- @participatory_process_group ||= collection.find(params[:id])
84
+ @participatory_process_group ||= Decidim::ParticipatoryProcessGroup.find(params[:id])
85
85
  end
86
86
 
87
87
  def collection
88
- @collection ||= OrganizationParticipatoryProcessGroups.new(current_user.organization).query
88
+ @collection ||=
89
+ OrganizationParticipatoryProcessGroups.new(current_user.organization).query
89
90
  end
90
91
  end
91
92
  end
@@ -0,0 +1,98 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module ParticipatoryProcesses
5
+ module Admin
6
+ # Controller used to manage participatory process types for the current
7
+ # organization
8
+ class ParticipatoryProcessTypesController < Decidim::ParticipatoryProcesses::Admin::ApplicationController
9
+ helper_method :collection, :current_participatory_process_type
10
+ layout "decidim/admin/participatory_process_type"
11
+
12
+ # GET /admin/participatory_process_types
13
+ def index
14
+ enforce_permission_to :index, :participatory_process_type
15
+ end
16
+
17
+ # GET /admin/participatory_process_types/new
18
+ def new
19
+ enforce_permission_to :create, :participatory_process_type
20
+ @form = participatory_process_type_form.instance
21
+ end
22
+
23
+ # POST /admin/participatory_process_types
24
+ def create
25
+ enforce_permission_to :create, :participatory_process_type
26
+ @form = participatory_process_type_form.from_params(params)
27
+
28
+ CreateParticipatoryProcessType.call(@form) do
29
+ on(:ok) do |_process_type|
30
+ flash[:notice] = I18n.t("participatory_process_types.create.success", scope: "decidim.admin")
31
+ redirect_to participatory_process_types_path
32
+ end
33
+
34
+ on(:invalid) do
35
+ flash.now[:alert] = I18n.t("participatory_process_types.create.error", scope: "decidim.admin")
36
+ render :new
37
+ end
38
+ end
39
+ end
40
+
41
+ # GET /admin/participatory_process_types/:id/edit
42
+ def edit
43
+ enforce_permission_to :edit, :participatory_process_type, participatory_process_type: current_participatory_process_type
44
+ @form = participatory_process_type_form.from_model(
45
+ current_participatory_process_type,
46
+ participatory_process_type: current_participatory_process_type
47
+ )
48
+ end
49
+
50
+ # PUT /admin/participatory_process_types/:id
51
+ def update
52
+ enforce_permission_to :update, :participatory_process_type, participatory_process_type: current_participatory_process_type
53
+
54
+ @form = participatory_process_type_form
55
+ .from_params(params, participatory_process_type: current_participatory_process_type)
56
+
57
+ UpdateParticipatoryProcessType.call(current_participatory_process_type, @form) do
58
+ on(:ok) do
59
+ flash[:notice] = I18n.t("participatory_process_types.update.success", scope: "decidim.admin")
60
+ redirect_to participatory_process_types_path
61
+ end
62
+
63
+ on(:invalid) do
64
+ flash.now[:alert] = I18n.t("participatory_process_types.update.error", scope: "decidim.admin")
65
+ render :edit
66
+ end
67
+ end
68
+ end
69
+
70
+ # DELETE /admin/participatory_process_types/:id
71
+ def destroy
72
+ enforce_permission_to :destroy, :participatory_process_type, participatory_process_type: current_participatory_process_type
73
+
74
+ DestroyParticipatoryProcessType.call(current_participatory_process_type, current_user) do
75
+ on(:ok) do
76
+ flash[:notice] = I18n.t("participatory_process_types.destroy.success", scope: "decidim.admin")
77
+ redirect_to participatory_process_types_path
78
+ end
79
+ end
80
+ end
81
+
82
+ private
83
+
84
+ def participatory_process_type_form
85
+ form(Decidim::ParticipatoryProcesses::Admin::ParticipatoryProcessTypeForm)
86
+ end
87
+
88
+ def current_participatory_process_type
89
+ @current_participatory_process_type ||= Decidim::ParticipatoryProcessType.find(params[:id])
90
+ end
91
+
92
+ def collection
93
+ @collection ||= Decidim::ParticipatoryProcessType.where(organization: current_organization)
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
@@ -77,7 +77,7 @@ module Decidim
77
77
  private
78
78
 
79
79
  def process_group
80
- @process_group ||= ParticipatoryProcessGroup.find_by(id: ransack_params[:decidim_participatory_process_group_id_eq], organization: current_organization)
80
+ @process_group ||= ParticipatoryProcessGroup.find_by(id: ransack_params[:decidim_participatory_process_group_id_eq])
81
81
  end
82
82
 
83
83
  def collection
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module ParticipatoryProcesses
5
+ module Admin
6
+ # This controller allows to send reminders.
7
+ # It is targeted for customizations for reminder things that lives under
8
+ # a participatory process.
9
+ class RemindersController < Decidim::Admin::RemindersController
10
+ include Concerns::ParticipatoryProcessAdmin
11
+ end
12
+ end
13
+ end
14
+ end
@@ -40,15 +40,16 @@ module Decidim
40
40
 
41
41
  private
42
42
 
43
- def search_klass
44
- ParticipatoryProcessSearch
43
+ def search_collection
44
+ ParticipatoryProcess.where(organization: current_organization).published.visible_for(current_user).includes(:area)
45
45
  end
46
46
 
47
47
  def default_filter_params
48
48
  {
49
- scope_id: nil,
50
- area_id: nil,
51
- date: default_date_filter
49
+ with_scope: nil,
50
+ with_area: nil,
51
+ with_type: nil,
52
+ with_date: default_date_filter
52
53
  }
53
54
  end
54
55
 
@@ -85,7 +86,7 @@ module Decidim
85
86
  end
86
87
 
87
88
  def filtered_processes
88
- search.results
89
+ search.result
89
90
  end
90
91
 
91
92
  def participatory_processes
@@ -102,7 +103,7 @@ module Decidim
102
103
  end
103
104
 
104
105
  def metrics
105
- @metrics ||= ParticipatoryProcessMetricChartsPresenter.new(participatory_process: current_participatory_space)
106
+ @metrics ||= ParticipatoryProcessMetricChartsPresenter.new(participatory_process: current_participatory_space, view_context: view_context)
106
107
  end
107
108
 
108
109
  def participatory_process_group
@@ -6,7 +6,7 @@ module Decidim
6
6
  include Decidim::Events::AuthorEvent
7
7
 
8
8
  def notification_title
9
- I18n.t("notification_title", i18n_options).html_safe
9
+ I18n.t("notification_title", **i18n_options).html_safe
10
10
  end
11
11
 
12
12
  def i18n_role
@@ -39,6 +39,7 @@ module Decidim
39
39
  attribute :scopes_enabled, Boolean
40
40
  attribute :show_metrics, Boolean
41
41
  attribute :show_statistics, Boolean
42
+ attribute :participatory_process_type_id, Integer
42
43
 
43
44
  attribute :end_date, Decidim::Attributes::LocalizedDate
44
45
  attribute :start_date, Decidim::Attributes::LocalizedDate
@@ -66,6 +67,7 @@ module Decidim
66
67
  def map_model(model)
67
68
  self.scope_id = model.decidim_scope_id
68
69
  self.participatory_process_group_id = model.decidim_participatory_process_group_id
70
+ self.participatory_process_type_id = model.decidim_participatory_process_type_id
69
71
  self.related_process_ids = model.linked_participatory_space_resources(:participatory_process, "related_processes").pluck(:id)
70
72
  @processes = Decidim::ParticipatoryProcess.where(organization: model.organization).where.not(id: model.id)
71
73
  end
@@ -86,12 +88,26 @@ module Decidim
86
88
  Decidim::ParticipatoryProcessGroup.find_by(id: participatory_process_group_id)
87
89
  end
88
90
 
91
+ def participatory_process_type
92
+ Decidim::ParticipatoryProcessType.find_by(id: participatory_process_type_id)
93
+ end
94
+
89
95
  def processes
90
96
  @processes ||= Decidim::ParticipatoryProcess.where(organization: current_organization)
91
97
  end
92
98
 
99
+ def participatory_process_types_for_select
100
+ @participatory_process_types_for_select ||= participatory_process_types.map do |type|
101
+ [translated_attribute(type.title), type.id]
102
+ end
103
+ end
104
+
93
105
  private
94
106
 
107
+ def participatory_process_types
108
+ Decidim::ParticipatoryProcessType.where(organization: current_organization)
109
+ end
110
+
95
111
  def organization_participatory_processes
96
112
  OrganizationParticipatoryProcesses.new(current_organization).query
97
113
  end
@@ -8,7 +8,6 @@ module Decidim
8
8
  #
9
9
  class ParticipatoryProcessImportForm < Form
10
10
  include TranslatableAttributes
11
- include Decidim::HasUploadValidations
12
11
 
13
12
  JSON_MIME_TYPE = "application/json"
14
13
  # Accepted mime types
@@ -30,10 +29,9 @@ module Decidim
30
29
  attribute :import_categories, Boolean, default: true
31
30
  attribute :import_attachments, Boolean, default: true
32
31
  attribute :import_components, Boolean, default: true
33
- attribute :document
34
-
35
- validates :document, presence: true
32
+ attribute :document, Decidim::Attributes::Blob
36
33
 
34
+ validates :document, file_content_type: { allow: ACCEPTED_TYPES.values }
37
35
  validates :slug, presence: true, format: { with: Decidim::ParticipatoryProcess.slug_format }
38
36
  validates :title, translatable_presence: true
39
37
  validate :slug_uniqueness
@@ -41,7 +39,7 @@ module Decidim
41
39
  validate :document_type_must_be_valid, if: :document
42
40
 
43
41
  def document_text
44
- @document_text ||= document&.read
42
+ @document_text ||= document&.download
45
43
  end
46
44
 
47
45
  def document_type_must_be_valid
@@ -60,9 +58,9 @@ module Decidim
60
58
  end
61
59
 
62
60
  def i18n_invalid_document_type_text
63
- I18n.t("invalid_document_type",
61
+ I18n.t("allowed_file_content_types",
64
62
  scope: "activemodel.errors.models.participatory_process.attributes.document",
65
- valid_mime_types: i18n_valid_mime_types_text)
63
+ types: i18n_valid_mime_types_text)
66
64
  end
67
65
 
68
66
  def i18n_valid_mime_types_text
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module ParticipatoryProcesses
5
+ module Admin
6
+ # A form object used to create participatory process types from the admin
7
+ # dashboard.
8
+ #
9
+ class ParticipatoryProcessTypeForm < Form
10
+ include TranslatableAttributes
11
+
12
+ mimic :participatory_process_type
13
+
14
+ translatable_attribute :title, String
15
+
16
+ validates :title, translatable_presence: true
17
+ end
18
+ end
19
+ end
20
+ end
@@ -12,14 +12,14 @@ module Decidim
12
12
  include Decidim::ResourceReferenceHelper
13
13
 
14
14
  # Public: Returns the dates for a step in a readable format like
15
- # "01/01/2016 - 05/02/2016".
15
+ # "2016-01-01 - 2016-02-05".
16
16
  #
17
17
  # participatory_process_step - The step to format to
18
18
  #
19
19
  # Returns a String with the formatted dates.
20
20
  def step_dates(participatory_process_step)
21
21
  dates = [participatory_process_step.start_date, participatory_process_step.end_date]
22
- dates.map { |date| date ? l(date.to_date, format: :decidim_short) : "?" }.join(" - ")
22
+ dates.map { |date| date ? localize(date.to_date, format: :default) : "?" }.join(" - ")
23
23
  end
24
24
 
25
25
  # Public: Returns the path for the participatory process cta button
@@ -21,6 +21,8 @@ module Decidim
21
21
  include Decidim::Searchable
22
22
  include Decidim::HasUploadValidations
23
23
  include Decidim::TranslatableResource
24
+ include Decidim::HasArea
25
+ include Decidim::FilterableResource
24
26
 
25
27
  translatable_fields :title, :subtitle, :short_description, :description, :developer_group, :meta_scope, :local_area,
26
28
  :target, :participatory_scope, :participatory_structure, :announcement
@@ -28,10 +30,6 @@ module Decidim
28
30
  belongs_to :organization,
29
31
  foreign_key: "decidim_organization_id",
30
32
  class_name: "Decidim::Organization"
31
- belongs_to :area,
32
- foreign_key: "decidim_area_id",
33
- class_name: "Decidim::Area",
34
- optional: true
35
33
  belongs_to :participatory_process_group,
36
34
  foreign_key: "decidim_participatory_process_group_id",
37
35
  class_name: "Decidim::ParticipatoryProcessGroup",
@@ -58,6 +56,10 @@ module Decidim
58
56
  foreign_key: "decidim_scope_type_id",
59
57
  class_name: "Decidim::ScopeType",
60
58
  optional: true
59
+ belongs_to :participatory_process_type,
60
+ foreign_key: "decidim_participatory_process_type_id",
61
+ class_name: "Decidim::ParticipatoryProcessType",
62
+ optional: true
61
63
 
62
64
  has_many :components, as: :participatory_space, dependent: :destroy
63
65
 
@@ -76,6 +78,31 @@ module Decidim
76
78
  scope :upcoming, -> { where(arel_table[:start_date].gt(Date.current)) }
77
79
  scope :active, -> { where(arel_table[:start_date].lteq(Date.current).and(arel_table[:end_date].gteq(Date.current).or(arel_table[:end_date].eq(nil)))) }
78
80
 
81
+ scope :with_date, lambda { |date_key|
82
+ case date_key
83
+ when "active"
84
+ active.order(start_date: :desc)
85
+ when "past"
86
+ past.order(end_date: :desc)
87
+ when "upcoming"
88
+ upcoming.order(start_date: :asc)
89
+ else # Assume 'all'
90
+ timezone = ActiveSupport::TimeZone.find_tzinfo(Time.zone.name).identifier
91
+ order(
92
+ Arel.sql(
93
+ sanitize_sql_array(
94
+ [
95
+ "ABS(start_date - (CURRENT_DATE at time zone :timezone)::date)",
96
+ { timezone: timezone }
97
+ ]
98
+ )
99
+ )
100
+ )
101
+ end
102
+ }
103
+
104
+ scope :with_type, ->(type_id) { where(decidim_participatory_process_type_id: type_id) }
105
+
79
106
  searchable_fields({
80
107
  scope_id: :decidim_scope_id,
81
108
  participatory_space: :itself,
@@ -177,8 +204,10 @@ module Decidim
177
204
  end
178
205
 
179
206
  # Allow ransacker to search for a key in a hstore column (`title`.`en`)
180
- ransacker :title do |parent|
181
- Arel::Nodes::InfixOperation.new("->>", parent.table[:title], Arel::Nodes.build_quoted(I18n.locale.to_s))
207
+ ransacker_i18n :title
208
+
209
+ def self.ransackable_scopes(_auth_object = nil)
210
+ [:with_date, :with_area, :with_scope, :with_type]
182
211
  end
183
212
  end
184
213
  end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ class ParticipatoryProcessType < ApplicationRecord
5
+ include Decidim::Traceable
6
+ include Decidim::Loggable
7
+ include Decidim::TranslatableResource
8
+
9
+ translatable_fields :title
10
+
11
+ belongs_to :organization,
12
+ foreign_key: "decidim_organization_id",
13
+ class_name: "Decidim::Organization"
14
+
15
+ has_many :processes,
16
+ foreign_key: "decidim_participatory_process_type_id",
17
+ class_name: "Decidim::ParticipatoryProcess",
18
+ inverse_of: :participatory_process_type,
19
+ dependent: :nullify
20
+
21
+ validates :title, presence: true
22
+
23
+ def self.log_presenter_class_for(_log)
24
+ Decidim::ParticipatoryProcesses::AdminLog::ParticipatoryProcessTypePresenter
25
+ end
26
+ end
27
+ end
@@ -38,6 +38,7 @@ module Decidim
38
38
 
39
39
  # org admins and space admins can do everything in the admin section
40
40
  org_admin_action?
41
+ participatory_process_type_action?
41
42
 
42
43
  return permission_action unless process
43
44
 
@@ -252,6 +253,19 @@ module Decidim
252
253
  allow! if is_allowed
253
254
  end
254
255
 
256
+ def participatory_process_type_action?
257
+ return unless permission_action.subject == :participatory_process_type
258
+ return disallow! unless user.admin?
259
+
260
+ participatory_process_type = context.fetch(:participatory_process_type, nil)
261
+ case permission_action.action
262
+ when :destroy
263
+ toggle_allow(participatory_process_type&.processes&.none?)
264
+ else
265
+ allow!
266
+ end
267
+ end
268
+
255
269
  # Checks if the permission_action is to read the admin processes list or
256
270
  # not.
257
271
  def read_process_list_permission_action?
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Log
5
+ module ValueTypes
6
+ # This class presents the given value as a
7
+ # Decidim::ParticipatoryProcessType. If the type can be found, it shows
8
+ # its title. Otherwise it shows its ID.
9
+ #
10
+ # Returns an HTML-safe String
11
+ class ParticipatoryProcessTypePresenter < Decidim::Log::ValueTypes::DefaultPresenter
12
+ def present
13
+ return unless value
14
+ return h.translated_attribute(type.title) if type
15
+
16
+ I18n.t("not_found", id: value, scope: "decidim.log.value_types.participatory_process_type_presenter")
17
+ end
18
+
19
+ private
20
+
21
+ def type
22
+ @type ||= Decidim::ParticipatoryProcessType.find_by(id: value)
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -31,13 +31,14 @@ module Decidim
31
31
  slug: :string,
32
32
  subtitle: :i18n,
33
33
  target: :i18n,
34
- title: :i18n
34
+ title: :i18n,
35
+ decidim_participatory_process_type_id: :participatory_process_type
35
36
  }
36
37
  end
37
38
 
38
39
  def action_string
39
40
  case action
40
- when "create", "publish", "unpublish", "update"
41
+ when "create", "publish", "unpublish", "update", "import", "export", "duplicate"
41
42
  "decidim.admin_log.participatory_process.#{action}"
42
43
  else
43
44
  super