decidim-participatory_processes 0.11.2 → 0.12.0.pre

Sign up to get free protection for your applications and to get access to all the features.
Files changed (66) hide show
  1. checksums.yaml +4 -4
  2. data/app/cells/decidim/participatory_processes/process_cell.rb +19 -0
  3. data/app/cells/decidim/participatory_processes/process_group_cell.rb +19 -0
  4. data/app/cells/decidim/participatory_processes/process_group_m/footer.erb +9 -0
  5. data/app/cells/decidim/participatory_processes/process_group_m_cell.rb +46 -0
  6. data/app/cells/decidim/participatory_processes/process_m/data.erb +21 -0
  7. data/app/cells/decidim/participatory_processes/process_m/footer.erb +15 -0
  8. data/app/cells/decidim/participatory_processes/process_m/tags.erb +6 -0
  9. data/app/cells/decidim/participatory_processes/process_m_cell.rb +64 -0
  10. data/app/controllers/decidim/participatory_processes/admin/application_controller.rb +14 -0
  11. data/app/controllers/decidim/participatory_processes/admin/concerns/participatory_process_admin.rb +11 -0
  12. data/app/controllers/decidim/participatory_processes/admin/moderations_controller.rb +4 -0
  13. data/app/controllers/decidim/participatory_processes/admin/participatory_process_attachment_collections_controller.rb +0 -4
  14. data/app/controllers/decidim/participatory_processes/admin/participatory_process_attachments_controller.rb +0 -4
  15. data/app/controllers/decidim/participatory_processes/admin/participatory_process_copies_controller.rb +2 -2
  16. data/app/controllers/decidim/participatory_processes/admin/participatory_process_groups_controller.rb +8 -8
  17. data/app/controllers/decidim/participatory_processes/admin/participatory_process_publications_controller.rb +2 -2
  18. data/app/controllers/decidim/participatory_processes/admin/participatory_process_step_activations_controller.rb +1 -1
  19. data/app/controllers/decidim/participatory_processes/admin/participatory_process_step_ordering_controller.rb +1 -1
  20. data/app/controllers/decidim/participatory_processes/admin/participatory_process_steps_controller.rb +7 -7
  21. data/app/controllers/decidim/participatory_processes/admin/participatory_process_user_roles_controller.rb +7 -7
  22. data/app/controllers/decidim/participatory_processes/admin/participatory_processes_controller.rb +8 -12
  23. data/app/controllers/decidim/participatory_processes/admin/participatory_space_private_users_controller.rb +1 -1
  24. data/app/controllers/decidim/participatory_processes/application_controller.rb +16 -0
  25. data/app/controllers/decidim/participatory_processes/participatory_process_groups_controller.rb +5 -1
  26. data/app/controllers/decidim/participatory_processes/participatory_processes_controller.rb +2 -2
  27. data/app/models/decidim/participatory_process.rb +11 -0
  28. data/app/models/decidim/participatory_process_group.rb +2 -0
  29. data/app/permissions/decidim/participatory_processes/permissions.rb +261 -0
  30. data/app/types/decidim/participatory_processes/participatory_process_type.rb +2 -2
  31. data/app/views/decidim/participatory_process_groups/_participatory_process_group.html.erb +1 -22
  32. data/app/views/decidim/participatory_processes/_participatory_process.html.erb +1 -28
  33. data/app/views/decidim/participatory_processes/admin/participatory_process_groups/edit.html.erb +1 -1
  34. data/app/views/decidim/participatory_processes/admin/participatory_process_groups/index.html.erb +4 -4
  35. data/app/views/decidim/participatory_processes/admin/participatory_process_steps/index.html.erb +4 -4
  36. data/app/views/decidim/participatory_processes/admin/participatory_process_steps/show.html.erb +2 -2
  37. data/app/views/decidim/participatory_processes/admin/participatory_process_user_roles/index.html.erb +4 -4
  38. data/app/views/decidim/participatory_processes/admin/participatory_processes/edit.html.erb +2 -2
  39. data/app/views/decidim/participatory_processes/admin/participatory_processes/index.html.erb +7 -7
  40. data/app/views/decidim/participatory_processes/participatory_processes/show.html.erb +0 -1
  41. data/app/views/layouts/decidim/admin/participatory_process.html.erb +15 -12
  42. data/app/views/layouts/decidim/admin/participatory_process_groups.html.erb +1 -1
  43. data/app/views/layouts/decidim/admin/participatory_processes.html.erb +7 -10
  44. data/config/locales/ca.yml +16 -0
  45. data/config/locales/en.yml +16 -0
  46. data/config/locales/es.yml +16 -0
  47. data/config/locales/eu.yml +16 -0
  48. data/config/locales/fi.yml +16 -0
  49. data/config/locales/fr.yml +16 -0
  50. data/config/locales/gl.yml +16 -0
  51. data/config/locales/it.yml +16 -0
  52. data/config/locales/nl.yml +16 -0
  53. data/config/locales/pl.yml +22 -0
  54. data/config/locales/pt-BR.yml +16 -0
  55. data/config/locales/pt.yml +16 -0
  56. data/config/locales/ru.yml +51 -14
  57. data/config/locales/sv.yml +16 -0
  58. data/config/locales/uk.yml +24 -2
  59. data/lib/decidim/participatory_processes/admin_engine.rb +2 -10
  60. data/lib/decidim/participatory_processes/engine.rb +3 -7
  61. data/lib/decidim/participatory_processes/participatory_space.rb +13 -1
  62. data/lib/decidim/participatory_processes/version.rb +1 -1
  63. metadata +19 -13
  64. data/app/models/decidim/participatory_processes/abilities/admin/admin_ability.rb +0 -22
  65. data/app/models/decidim/participatory_processes/abilities/admin_ability.rb +0 -16
  66. data/app/models/decidim/participatory_processes/abilities/everyone_ability.rb +0 -19
@@ -9,17 +9,17 @@ module Decidim
9
9
  include Concerns::ParticipatoryProcessAdmin
10
10
 
11
11
  def index
12
- authorize! :read, Decidim::ParticipatoryProcessUserRole
12
+ enforce_permission_to :read, :process_user_role
13
13
  @participatory_process_user_roles = collection
14
14
  end
15
15
 
16
16
  def new
17
- authorize! :create, Decidim::ParticipatoryProcessUserRole
17
+ enforce_permission_to :create, :process_user_role
18
18
  @form = form(ParticipatoryProcessUserRoleForm).instance
19
19
  end
20
20
 
21
21
  def create
22
- authorize! :create, Decidim::ParticipatoryProcessUserRole
22
+ enforce_permission_to :create, :process_user_role
23
23
  @form = form(ParticipatoryProcessUserRoleForm).from_params(params)
24
24
 
25
25
  CreateParticipatoryProcessAdmin.call(@form, current_user, current_participatory_process) do
@@ -36,13 +36,13 @@ module Decidim
36
36
 
37
37
  def edit
38
38
  @user_role = collection.find(params[:id])
39
- authorize! :update, @user_role
39
+ enforce_permission_to :update, :process_user_role, process_user_role: @user_role
40
40
  @form = form(ParticipatoryProcessUserRoleForm).from_model(@user_role.user)
41
41
  end
42
42
 
43
43
  def update
44
44
  @user_role = collection.find(params[:id])
45
- authorize! :update, @user_role
45
+ enforce_permission_to :update, :process_user_role, process_user_role: @user_role
46
46
  @form = form(ParticipatoryProcessUserRoleForm).from_params(params)
47
47
 
48
48
  UpdateParticipatoryProcessAdmin.call(@form, @user_role) do
@@ -60,7 +60,7 @@ module Decidim
60
60
 
61
61
  def destroy
62
62
  @participatory_process_user_role = collection.find(params[:id])
63
- authorize! :destroy, @participatory_process_user_role
63
+ enforce_permission_to :destroy, :process_user_role, process_user_role: @participatory_process_user_role
64
64
 
65
65
  DestroyParticipatoryProcessAdmin.call(@participatory_process_user_role, current_user) do
66
66
  on(:ok) do
@@ -72,7 +72,7 @@ module Decidim
72
72
 
73
73
  def resend_invitation
74
74
  @user_role = collection.find(params[:id])
75
- authorize! :invite, @user_role
75
+ enforce_permission_to :invite, :process_user_role, process_user_role: @user_role
76
76
 
77
77
  InviteUserAgain.call(@user_role.user, "invite_admin") do
78
78
  on(:ok) do
@@ -5,7 +5,7 @@ module Decidim
5
5
  module Admin
6
6
  # Controller that allows managing participatory processes.
7
7
  #
8
- class ParticipatoryProcessesController < Decidim::Admin::ApplicationController
8
+ class ParticipatoryProcessesController < Decidim::ParticipatoryProcesses::Admin::ApplicationController
9
9
  include Decidim::Admin::ParticipatorySpaceAdminContext
10
10
  participatory_space_admin_layout only: [:edit]
11
11
 
@@ -16,17 +16,17 @@ module Decidim
16
16
  layout "decidim/admin/participatory_processes"
17
17
 
18
18
  def index
19
- authorize! :index, Decidim::ParticipatoryProcess
19
+ enforce_permission_to :read, :process_list
20
20
  @participatory_processes = collection
21
21
  end
22
22
 
23
23
  def new
24
- authorize! :new, Decidim::ParticipatoryProcess
24
+ enforce_permission_to :create, :process
25
25
  @form = form(ParticipatoryProcessForm).instance
26
26
  end
27
27
 
28
28
  def create
29
- authorize! :new, Decidim::ParticipatoryProcess
29
+ enforce_permission_to :create, :process
30
30
  @form = form(ParticipatoryProcessForm).from_params(params)
31
31
 
32
32
  CreateParticipatoryProcess.call(@form) do
@@ -43,13 +43,13 @@ module Decidim
43
43
  end
44
44
 
45
45
  def edit
46
- authorize! :update, current_participatory_process
46
+ enforce_permission_to :update, :process, process: current_participatory_process
47
47
  @form = form(ParticipatoryProcessForm).from_model(current_participatory_process)
48
48
  render layout: "decidim/admin/participatory_process"
49
49
  end
50
50
 
51
51
  def update
52
- authorize! :update, current_participatory_process
52
+ enforce_permission_to :update, :process, process: current_participatory_process
53
53
  @form = form(ParticipatoryProcessForm).from_params(
54
54
  participatory_process_params,
55
55
  process_id: current_participatory_process.id
@@ -69,7 +69,7 @@ module Decidim
69
69
  end
70
70
 
71
71
  def destroy
72
- authorize! :destroy, current_participatory_process
72
+ enforce_permission_to :destroy, :process, process: current_participatory_process
73
73
  current_participatory_process.destroy!
74
74
 
75
75
  flash[:notice] = I18n.t("participatory_processes.destroy.success", scope: "decidim.admin")
@@ -78,7 +78,7 @@ module Decidim
78
78
  end
79
79
 
80
80
  def copy
81
- authorize! :create, Decidim::ParticipatoryProcess
81
+ enforce_permission_to :create, Decidim::ParticipatoryProcess
82
82
  end
83
83
 
84
84
  private
@@ -95,10 +95,6 @@ module Decidim
95
95
  @collection ||= Decidim::ParticipatoryProcessesWithUserRole.for(current_user)
96
96
  end
97
97
 
98
- def ability_context
99
- super.merge(current_participatory_space: current_participatory_process)
100
- end
101
-
102
98
  def participatory_process_params
103
99
  {
104
100
  id: params[:slug],
@@ -17,7 +17,7 @@ module Decidim
17
17
  end
18
18
 
19
19
  def authorization_object
20
- @participatory_space_private_user || ParticipatorySpacePrivateUser
20
+ @participatory_space_private_user
21
21
  end
22
22
  end
23
23
  end
@@ -6,6 +6,22 @@ module Decidim
6
6
  # this engine inherit.
7
7
  class ApplicationController < Decidim::ApplicationController
8
8
  helper Decidim::ParticipatoryProcesses::ApplicationHelper
9
+
10
+ include NeedsPermission
11
+
12
+ private
13
+
14
+ def permission_class_chain
15
+ [
16
+ Decidim::ParticipatoryProcesses::Permissions,
17
+ Decidim::Admin::Permissions,
18
+ Decidim::Permissions
19
+ ]
20
+ end
21
+
22
+ def permission_scope
23
+ :public
24
+ end
9
25
  end
10
26
  end
11
27
  end
@@ -8,8 +8,12 @@ module Decidim
8
8
 
9
9
  before_action :set_group
10
10
 
11
+ def index
12
+ enforce_permission_to :list, :process_group
13
+ end
14
+
11
15
  def show
12
- authorize! :read, ParticipatoryProcessGroup
16
+ enforce_permission_to :read, :process_group, process_group: @group
13
17
  end
14
18
 
15
19
  private
@@ -21,8 +21,8 @@ module Decidim
21
21
  def index
22
22
  redirect_to "/404" if published_processes.none?
23
23
 
24
- authorize! :read, ParticipatoryProcess
25
- authorize! :read, ParticipatoryProcessGroup
24
+ enforce_permission_to :list, :process
25
+ enforce_permission_to :list, :process_group
26
26
  end
27
27
 
28
28
  def show
@@ -70,6 +70,11 @@ module Decidim
70
70
  Decidim::ParticipatoryProcesses::AdminLog::ParticipatoryProcessPresenter
71
71
  end
72
72
 
73
+ def past?
74
+ return false if end_date.blank?
75
+ end_date < Time.current
76
+ end
77
+
73
78
  def hashtag
74
79
  attributes["hashtag"].to_s.delete("#")
75
80
  end
@@ -81,5 +86,11 @@ module Decidim
81
86
  def self.private_processes
82
87
  where(private_space: true)
83
88
  end
89
+
90
+ def can_participate?(user)
91
+ return true unless private_space?
92
+ return true if private_space? && users.include?(user)
93
+ false
94
+ end
84
95
  end
85
96
  end
@@ -2,6 +2,8 @@
2
2
 
3
3
  module Decidim
4
4
  class ParticipatoryProcessGroup < ApplicationRecord
5
+ include Decidim::Resourceable
6
+
5
7
  has_many :participatory_processes,
6
8
  foreign_key: "decidim_participatory_process_group_id",
7
9
  class_name: "Decidim::ParticipatoryProcess",
@@ -0,0 +1,261 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module ParticipatoryProcesses
5
+ class Permissions < Decidim::DefaultPermissions
6
+ def permissions
7
+ user_can_enter_processes_space_area?
8
+ user_can_enter_process_groups_space_area?
9
+
10
+ return permission_action if process && !process.is_a?(Decidim::ParticipatoryProcess)
11
+
12
+ if permission_action.scope == :public
13
+ public_list_processes_action?
14
+ public_list_process_groups_action?
15
+ public_read_process_group_action?
16
+ public_read_process_action?
17
+ public_report_content_action?
18
+ return permission_action
19
+ end
20
+
21
+ return permission_action unless user
22
+ if !has_manageable_processes? && !user.admin?
23
+ disallow!
24
+ return permission_action
25
+ end
26
+ return permission_action unless permission_action.scope == :admin
27
+
28
+ valid_process_group_action?
29
+
30
+ if read_admin_dashboard_action?
31
+ user_can_read_admin_dashboard?
32
+ return permission_action
33
+ end
34
+
35
+ user_can_read_process_list?
36
+ user_can_read_current_process?
37
+ user_can_create_process?
38
+ user_can_destroy_process?
39
+
40
+ # org admins and space admins can do everything in the admin section
41
+ org_admin_action?
42
+
43
+ return permission_action unless process
44
+
45
+ moderator_action?
46
+ collaborator_action?
47
+ process_admin_action?
48
+
49
+ permission_action
50
+ end
51
+
52
+ private
53
+
54
+ # It's an admin user if it's an organization admin or is a space admin
55
+ # for the current `process`.
56
+ def admin_user?
57
+ user.admin? || (process ? can_manage_process?(role: :admin) : has_manageable_processes?)
58
+ end
59
+
60
+ # Checks if it has any manageable process, with any possible role.
61
+ def has_manageable_processes?(role: :any)
62
+ return unless user
63
+ participatory_processes_with_role_privileges(role).any?
64
+ end
65
+
66
+ # Whether the user can manage the given process or not.
67
+ def can_manage_process?(role: :any)
68
+ return unless user
69
+ participatory_processes_with_role_privileges(role).include? process
70
+ end
71
+
72
+ # Returns a collection of Participatory processes where the given user has the
73
+ # specific role privilege.
74
+ def participatory_processes_with_role_privileges(role)
75
+ Decidim::ParticipatoryProcessesWithUserRole.for(user, role)
76
+ end
77
+
78
+ def public_list_processes_action?
79
+ return unless permission_action.action == :list &&
80
+ permission_action.subject == :process
81
+
82
+ allow!
83
+ end
84
+
85
+ def public_list_process_groups_action?
86
+ return unless permission_action.action == :list &&
87
+ permission_action.subject == :process_group
88
+
89
+ allow!
90
+ end
91
+
92
+ def public_read_process_group_action?
93
+ return unless permission_action.action == :read &&
94
+ permission_action.subject == :process_group &&
95
+ process_group
96
+
97
+ allow!
98
+ end
99
+
100
+ def public_read_process_action?
101
+ return unless permission_action.action == :read &&
102
+ [:process, :participatory_space].include?(permission_action.subject) &&
103
+ process
104
+
105
+ return allow! if user&.admin?
106
+ return allow! if process.published?
107
+ toggle_allow(can_manage_process?)
108
+ end
109
+
110
+ def public_report_content_action?
111
+ return unless permission_action.action == :create &&
112
+ permission_action.subject == :moderation
113
+
114
+ allow!
115
+ end
116
+
117
+ # Only organization admins can enter the process groups space area.
118
+ def user_can_enter_process_groups_space_area?
119
+ return unless permission_action.action == :enter &&
120
+ permission_action.scope == :admin &&
121
+ permission_action.subject == :space_area &&
122
+ context.fetch(:space_name, nil) == :process_groups
123
+
124
+ toggle_allow(user.admin?)
125
+ end
126
+
127
+ # All users with a relation to a process and organization admins can enter
128
+ # the processes space area.
129
+ def user_can_enter_processes_space_area?
130
+ return unless permission_action.action == :enter &&
131
+ permission_action.scope == :admin &&
132
+ permission_action.subject == :space_area &&
133
+ context.fetch(:space_name, nil) == :processes
134
+
135
+ toggle_allow(user.admin? || has_manageable_processes?)
136
+ end
137
+
138
+ # Only organization admins can manage process groups.
139
+ def valid_process_group_action?
140
+ return unless permission_action.subject == :process_group
141
+ toggle_allow(user.admin?)
142
+ end
143
+
144
+ # Checks if the permission_action is to read in the admin or not.
145
+ def admin_read_permission_action?
146
+ permission_action.action == :read
147
+ end
148
+
149
+ def read_admin_dashboard_action?
150
+ permission_action.action == :read &&
151
+ permission_action.subject == :admin_dashboard
152
+ end
153
+
154
+ # Any user that can enter the space area can read the admin dashboard.
155
+ def user_can_read_admin_dashboard?
156
+ toggle_allow(user.admin? || has_manageable_processes?)
157
+ end
158
+
159
+ # Only organization admins can create a process
160
+ def user_can_create_process?
161
+ return unless permission_action.action == :create &&
162
+ permission_action.subject == :process
163
+
164
+ toggle_allow(user.admin?)
165
+ end
166
+
167
+ # Only organization admins can destroy a process
168
+ def user_can_destroy_process?
169
+ return unless permission_action.action == :destroy &&
170
+ permission_action.subject == :process
171
+
172
+ toggle_allow(user.admin?)
173
+ end
174
+
175
+ # Everyone can read the process list
176
+ def user_can_read_process_list?
177
+ return unless read_process_list_permission_action?
178
+ toggle_allow(user.admin? || has_manageable_processes?)
179
+ end
180
+
181
+ def user_can_read_current_process?
182
+ return unless read_process_list_permission_action?
183
+ return if permission_action.subject == :process_list
184
+ toggle_allow(user.admin? || can_manage_process?)
185
+ end
186
+
187
+ # A moderator needs to be able to read the process they are assigned to,
188
+ # and needs to perform all actions for the moderations of that process.
189
+ def moderator_action?
190
+ return unless can_manage_process?(role: :moderator)
191
+
192
+ allow! if permission_action.subject == :moderation
193
+ end
194
+
195
+ # Collaborators can read/preview everything inside their process.
196
+ def collaborator_action?
197
+ return unless can_manage_process?(role: :collaborator)
198
+
199
+ allow! if permission_action.action == :read || permission_action.action == :preview
200
+ end
201
+
202
+ # Process admins can eprform everything *inside* that process. They cannot
203
+ # create a process or perform actions on process groups or other
204
+ # processes. They cannot destroy their process either.
205
+ def process_admin_action?
206
+ return unless can_manage_process?(role: :admin)
207
+ return if user.admin?
208
+ return disallow! if permission_action.action == :create &&
209
+ permission_action.subject == :process
210
+ return disallow! if permission_action.action == :destroy &&
211
+ permission_action.subject == :process
212
+
213
+ is_allowed = [
214
+ :attachment,
215
+ :attachment_collection,
216
+ :category,
217
+ :component,
218
+ :component_data,
219
+ :moderation,
220
+ :process,
221
+ :process_step,
222
+ :process_user_role
223
+ ].include?(permission_action.subject)
224
+ allow! if is_allowed
225
+ end
226
+
227
+ def org_admin_action?
228
+ return unless user.admin?
229
+
230
+ is_allowed = [
231
+ :attachment,
232
+ :attachment_collection,
233
+ :category,
234
+ :component,
235
+ :component_data,
236
+ :moderation,
237
+ :process,
238
+ :process_step,
239
+ :process_user_role,
240
+ :space_private_user
241
+ ].include?(permission_action.subject)
242
+ allow! if is_allowed
243
+ end
244
+
245
+ # Checks if the permission_action is to read the admin processes list or
246
+ # not.
247
+ def read_process_list_permission_action?
248
+ permission_action.action == :read &&
249
+ [:process, :participatory_space, :process_list].include?(permission_action.subject)
250
+ end
251
+
252
+ def process
253
+ @process ||= context.fetch(:current_participatory_space, nil) || context.fetch(:process, nil)
254
+ end
255
+
256
+ def process_group
257
+ @process_group ||= context.fetch(:process_group, nil)
258
+ end
259
+ end
260
+ end
261
+ end