decidim-participatory_processes 0.26.2 → 0.27.0.rc2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (136) 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/process_filters_cell.rb +15 -18
  7. data/app/cells/decidim/participatory_processes/content_blocks/highlighted_processes/show.erb +1 -1
  8. data/app/cells/decidim/participatory_processes/content_blocks/highlighted_processes/single_process.erb +1 -1
  9. data/app/cells/decidim/participatory_processes/content_blocks/highlighted_processes_cell.rb +1 -1
  10. data/app/cells/decidim/participatory_processes/filtered_participatory_processes_cell.rb +11 -7
  11. data/app/cells/decidim/participatory_processes/process_filters/show.erb +13 -9
  12. data/app/cells/decidim/participatory_processes/process_filters/type_filter.erb +17 -0
  13. data/app/cells/decidim/participatory_processes/process_filters_cell.rb +50 -16
  14. data/app/cells/decidim/participatory_processes/process_group_s/image.erb +1 -1
  15. data/app/cells/decidim/participatory_processes/process_s/image.erb +1 -1
  16. data/app/commands/decidim/participatory_processes/admin/activate_participatory_process_step.rb +1 -1
  17. data/app/commands/decidim/participatory_processes/admin/copy_participatory_process.rb +11 -8
  18. data/app/commands/decidim/participatory_processes/admin/create_participatory_process.rb +2 -1
  19. data/app/commands/decidim/participatory_processes/admin/create_participatory_process_group.rb +1 -1
  20. data/app/commands/decidim/participatory_processes/admin/create_participatory_process_step.rb +1 -1
  21. data/app/commands/decidim/participatory_processes/admin/create_participatory_process_type.rb +47 -0
  22. data/app/commands/decidim/participatory_processes/admin/destroy_participatory_process_admin.rb +1 -1
  23. data/app/commands/decidim/participatory_processes/admin/destroy_participatory_process_group.rb +1 -1
  24. data/app/commands/decidim/participatory_processes/admin/destroy_participatory_process_step.rb +1 -1
  25. data/app/commands/decidim/participatory_processes/admin/destroy_participatory_process_type.rb +49 -0
  26. data/app/commands/decidim/participatory_processes/admin/import_participatory_process.rb +9 -6
  27. data/app/commands/decidim/participatory_processes/admin/notify_role_assigned_to_participatory_process.rb +1 -1
  28. data/app/commands/decidim/participatory_processes/admin/publish_participatory_process.rb +1 -1
  29. data/app/commands/decidim/participatory_processes/admin/reorder_participatory_process_steps.rb +1 -1
  30. data/app/commands/decidim/participatory_processes/admin/unpublish_participatory_process.rb +1 -1
  31. data/app/commands/decidim/participatory_processes/admin/update_participatory_process.rb +2 -1
  32. data/app/commands/decidim/participatory_processes/admin/update_participatory_process_group.rb +1 -1
  33. data/app/commands/decidim/participatory_processes/admin/update_participatory_process_step.rb +1 -1
  34. data/app/commands/decidim/participatory_processes/admin/update_participatory_process_type.rb +49 -0
  35. data/app/controllers/decidim/participatory_processes/admin/participatory_process_copies_controller.rb +1 -1
  36. data/app/controllers/decidim/participatory_processes/admin/participatory_process_types_controller.rb +98 -0
  37. data/app/controllers/decidim/participatory_processes/admin/reminders_controller.rb +14 -0
  38. data/app/controllers/decidim/participatory_processes/participatory_processes_controller.rb +8 -7
  39. data/app/events/decidim/participatory_process_role_assigned_event.rb +1 -1
  40. data/app/forms/decidim/participatory_processes/admin/participatory_process_form.rb +16 -0
  41. data/app/forms/decidim/participatory_processes/admin/participatory_process_import_form.rb +5 -7
  42. data/app/forms/decidim/participatory_processes/admin/participatory_process_type_form.rb +20 -0
  43. data/app/models/decidim/participatory_process.rb +35 -6
  44. data/app/models/decidim/participatory_process_type.rb +27 -0
  45. data/app/permissions/decidim/participatory_processes/permissions.rb +14 -0
  46. data/app/presenters/decidim/log/value_types/participatory_process_type_presenter.rb +27 -0
  47. data/app/presenters/decidim/participatory_processes/admin_log/participatory_process_presenter.rb +3 -2
  48. data/app/presenters/decidim/participatory_processes/admin_log/participatory_process_type_presenter.rb +38 -0
  49. data/app/presenters/decidim/participatory_processes/participatory_process_group_stats_presenter.rb +4 -1
  50. data/app/presenters/decidim/participatory_processes/participatory_process_metric_charts_presenter.rb +5 -1
  51. data/app/presenters/decidim/participatory_processes/participatory_process_stats_presenter.rb +4 -1
  52. data/app/queries/decidim/participatory_processes/admin/admin_users.rb +1 -1
  53. data/app/queries/decidim/participatory_processes/admin/moderators.rb +1 -1
  54. data/app/queries/decidim/participatory_processes/filtered_participatory_process_groups.rb +1 -1
  55. data/app/queries/decidim/participatory_processes/filtered_participatory_processes.rb +1 -1
  56. data/app/queries/decidim/participatory_processes/group_participatory_processes.rb +1 -1
  57. data/app/queries/decidim/participatory_processes/group_published_participatory_processes.rb +2 -2
  58. data/app/queries/decidim/participatory_processes/highlighted_participatory_processes.rb +1 -1
  59. data/app/queries/decidim/participatory_processes/organization_participatory_process_groups.rb +1 -1
  60. data/app/queries/decidim/participatory_processes/organization_participatory_processes.rb +1 -1
  61. data/app/queries/decidim/participatory_processes/organization_prioritized_participatory_process_groups.rb +2 -2
  62. data/app/queries/decidim/participatory_processes/organization_prioritized_participatory_processes.rb +2 -2
  63. data/app/queries/decidim/participatory_processes/organization_promoted_participatory_process_groups.rb +1 -1
  64. data/app/queries/decidim/participatory_processes/organization_published_participatory_processes.rb +2 -2
  65. data/app/queries/decidim/participatory_processes/participatory_processes_by_group.rb +1 -1
  66. data/app/queries/decidim/participatory_processes/prioritized_participatory_processes.rb +1 -1
  67. data/app/queries/decidim/participatory_processes/promoted_participatory_process_groups.rb +1 -1
  68. data/app/queries/decidim/participatory_processes/promoted_participatory_processes.rb +1 -1
  69. data/app/queries/decidim/participatory_processes/published_participatory_processes.rb +1 -1
  70. data/app/queries/decidim/participatory_processes/stats_followers_count.rb +2 -2
  71. data/app/queries/decidim/participatory_processes/stats_participants_count.rb +2 -2
  72. data/app/queries/decidim/participatory_processes/visible_participatory_process_groups.rb +1 -1
  73. data/app/queries/decidim/participatory_processes/visible_participatory_processes.rb +1 -1
  74. data/app/serializers/decidim/participatory_processes/participatory_process_importer.rb +4 -3
  75. data/app/views/decidim/participatory_processes/admin/participatory_process_types/_form.html.erb +11 -0
  76. data/app/views/decidim/participatory_processes/admin/participatory_process_types/edit.html.erb +9 -0
  77. data/app/views/decidim/participatory_processes/admin/participatory_process_types/index.html.erb +60 -0
  78. data/app/views/decidim/participatory_processes/admin/participatory_process_types/new.html.erb +9 -0
  79. data/app/views/decidim/participatory_processes/admin/participatory_processes/_form.html.erb +10 -0
  80. data/app/views/decidim/participatory_processes/participatory_process_groups/show.html.erb +3 -1
  81. data/app/views/decidim/participatory_processes/participatory_process_groups/show.js.erb +9 -6
  82. data/app/views/decidim/participatory_processes/participatory_processes/_promoted_process.html.erb +1 -1
  83. data/app/views/decidim/participatory_processes/participatory_processes/_promoted_process_group.html.erb +1 -1
  84. data/app/views/decidim/participatory_processes/participatory_processes/index.html.erb +3 -1
  85. data/app/views/decidim/participatory_processes/participatory_processes/index.js.erb +3 -1
  86. data/app/views/layouts/decidim/_process_header.html.erb +1 -1
  87. data/app/views/layouts/decidim/admin/participatory_process_type.html.erb +15 -0
  88. data/config/locales/ar.yml +1 -0
  89. data/config/locales/bg.yml +1 -0
  90. data/config/locales/ca.yml +43 -1
  91. data/config/locales/cs.yml +49 -7
  92. data/config/locales/de.yml +38 -1
  93. data/config/locales/el.yml +1 -6
  94. data/config/locales/en.yml +42 -1
  95. data/config/locales/es-MX.yml +43 -1
  96. data/config/locales/es-PY.yml +43 -1
  97. data/config/locales/es.yml +43 -1
  98. data/config/locales/eu.yml +1 -6
  99. data/config/locales/fi-plain.yml +43 -1
  100. data/config/locales/fi.yml +43 -1
  101. data/config/locales/fr-CA.yml +43 -1
  102. data/config/locales/fr.yml +44 -2
  103. data/config/locales/ga-IE.yml +1 -0
  104. data/config/locales/gl.yml +1 -6
  105. data/config/locales/hu.yml +116 -1
  106. data/config/locales/id-ID.yml +1 -0
  107. data/config/locales/is-IS.yml +2 -1
  108. data/config/locales/it.yml +1 -6
  109. data/config/locales/ja.yml +43 -1
  110. data/config/locales/lb.yml +1 -6
  111. data/config/locales/lt.yml +546 -0
  112. data/config/locales/lv.yml +1 -6
  113. data/config/locales/nl.yml +1 -6
  114. data/config/locales/no.yml +17 -6
  115. data/config/locales/pl.yml +7 -6
  116. data/config/locales/pt-BR.yml +1 -6
  117. data/config/locales/pt.yml +1 -6
  118. data/config/locales/ro-RO.yml +1 -6
  119. data/config/locales/ru.yml +1 -0
  120. data/config/locales/sk.yml +1 -6
  121. data/config/locales/sl.yml +1 -0
  122. data/config/locales/sr-CS.yml +1 -0
  123. data/config/locales/sv.yml +15 -6
  124. data/config/locales/tr-TR.yml +1 -6
  125. data/config/locales/uk.yml +1 -0
  126. data/config/locales/zh-CN.yml +1 -6
  127. data/db/migrate/20211125202008_create_decidim_participatory_process_types.rb +22 -0
  128. data/lib/decidim/api/participatory_process_type_type.rb +17 -0
  129. data/lib/decidim/participatory_processes/admin_engine.rb +12 -1
  130. data/lib/decidim/participatory_processes/api.rb +1 -0
  131. data/lib/decidim/participatory_processes/participatory_space.rb +17 -8
  132. data/lib/decidim/participatory_processes/query_extensions.rb +22 -0
  133. data/lib/decidim/participatory_processes/test/factories.rb +17 -0
  134. data/lib/decidim/participatory_processes/version.rb +1 -1
  135. metadata +31 -15
  136. data/app/services/decidim/participatory_processes/participatory_process_search.rb +0 -27
@@ -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
@@ -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
@@ -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
@@ -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
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module ParticipatoryProcesses
5
+ module AdminLog
6
+ # This class holds the logic to present a
7
+ # `Decidim::ParticipatoryProcessType`
8
+ # for the `AdminLog` log.
9
+ #
10
+ # Usage should be automatic and you shouldn't need to call this class
11
+ # directly, but here's an example:
12
+ #
13
+ # action_log = Decidim::ActionLog.last
14
+ # view_helpers # => this comes from the views
15
+ # ParticipatoryProcessTypePresenter.new(action_log, view_helpers).present
16
+ class ParticipatoryProcessTypePresenter < Decidim::Log::BasePresenter
17
+ private
18
+
19
+ def diff_fields_mapping
20
+ { title: :i18n }
21
+ end
22
+
23
+ def action_string
24
+ case action
25
+ when "create", "update"
26
+ "decidim.admin_log.participatory_process_type.#{action}"
27
+ else
28
+ super
29
+ end
30
+ end
31
+
32
+ def i18n_labels_scope
33
+ "activemodel.attributes.participatory_process_type"
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -4,9 +4,12 @@ module Decidim
4
4
  module ParticipatoryProcesses
5
5
  # A presenter to render statistics in the homepage.
6
6
  class ParticipatoryProcessGroupStatsPresenter < Decidim::StatsPresenter
7
- attribute :participatory_process_group, Decidim::ParticipatoryProcessGroup
8
7
  include Decidim::IconHelper
9
8
 
9
+ def participatory_process_group
10
+ __getobj__.fetch(:participatory_process_group)
11
+ end
12
+
10
13
  # Public: returns a collection of stats (Hash) for the participatory
11
14
  # process group landing page.
12
15
  def collection
@@ -4,7 +4,11 @@ module Decidim
4
4
  module ParticipatoryProcesses
5
5
  # A presenter to render metrics in ParticipatoryProcesses statistics page
6
6
  class ParticipatoryProcessMetricChartsPresenter < Decidim::MetricChartsPresenter
7
- attribute :participatory_process, Decidim::ParticipatoryProcess
7
+ delegate :hidden_field_tag, :link_to, :capture, to: :view_context
8
+
9
+ def participatory_process
10
+ __getobj__.fetch(:participatory_process)
11
+ end
8
12
 
9
13
  def params
10
14
  capture do
@@ -4,9 +4,12 @@ module Decidim
4
4
  module ParticipatoryProcesses
5
5
  # A presenter to render statistics in the homepage.
6
6
  class ParticipatoryProcessStatsPresenter < Decidim::StatsPresenter
7
- attribute :participatory_process, Decidim::ParticipatoryProcess
8
7
  include Decidim::IconHelper
9
8
 
9
+ def participatory_process
10
+ __getobj__.fetch(:participatory_process)
11
+ end
12
+
10
13
  # Public: returns a collection of stats (Hash) for the Process Home.
11
14
  def collection
12
15
  highlighted_stats = process_participants_stats
@@ -5,7 +5,7 @@ module Decidim
5
5
  module Admin
6
6
  # A class used to find the admins for a participatory process including
7
7
  # organization admins.
8
- class AdminUsers < Rectify::Query
8
+ class AdminUsers < Decidim::Query
9
9
  # Syntactic sugar to initialize the class and return the queried objects.
10
10
  #
11
11
  # process - a process that needs to find its process admins
@@ -5,7 +5,7 @@ module Decidim
5
5
  module Admin
6
6
  # A class used to find the users that can moderate the participatory
7
7
  # process.
8
- class Moderators < Rectify::Query
8
+ class Moderators < Decidim::Query
9
9
  # Syntactic sugar to initialize the class and return the queried objects.
10
10
  #
11
11
  # process - a process that needs to find its moderators