decidim-assemblies 0.8.4 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +1 -1
  3. data/app/assets/javascripts/decidim/assemblies/admin/assemblies.js.es6 +11 -9
  4. data/app/commands/decidim/assemblies/admin/create_assembly_admin.rb +93 -0
  5. data/app/commands/decidim/assemblies/admin/update_assembly_admin.rb +42 -0
  6. data/app/controllers/decidim/assemblies/admin/assemblies_controller.rb +2 -4
  7. data/app/controllers/decidim/assemblies/admin/assembly_user_roles_controller.rb +99 -0
  8. data/app/forms/decidim/assemblies/admin/assembly_user_role_form.rb +30 -0
  9. data/app/models/decidim/assemblies/abilities/admin/admin_ability.rb +1 -0
  10. data/app/models/decidim/assemblies/abilities/admin/assembly_admin_ability.rb +54 -0
  11. data/app/models/decidim/assemblies/abilities/admin/assembly_collaborator_ability.rb +25 -0
  12. data/app/models/decidim/assemblies/abilities/admin/assembly_moderator_ability.rb +33 -0
  13. data/app/models/decidim/assemblies/abilities/admin/assembly_role_ability.rb +65 -0
  14. data/app/models/decidim/assemblies/abilities/assembly_admin_ability.rb +15 -0
  15. data/app/models/decidim/assemblies/abilities/assembly_collaborator_ability.rb +15 -0
  16. data/app/models/decidim/assemblies/abilities/assembly_moderator_ability.rb +15 -0
  17. data/app/models/decidim/assemblies/abilities/assembly_role_ability.rb +51 -0
  18. data/app/models/decidim/assembly.rb +1 -0
  19. data/app/models/decidim/assembly_user_role.rb +22 -0
  20. data/app/queries/decidim/assemblies/assemblies_with_user_role.rb +48 -0
  21. data/app/views/decidim/assemblies/admin/assemblies/_form.html.erb +1 -1
  22. data/app/views/decidim/assemblies/admin/assembly_user_roles/_form.html.erb +22 -0
  23. data/app/views/decidim/assemblies/admin/assembly_user_roles/edit.html.erb +7 -0
  24. data/app/views/decidim/assemblies/admin/assembly_user_roles/index.html.erb +65 -0
  25. data/app/views/decidim/assemblies/admin/assembly_user_roles/new.html.erb +7 -0
  26. data/app/views/decidim/assemblies/assemblies/show.html.erb +5 -0
  27. data/app/views/layouts/decidim/admin/assembly.html.erb +19 -14
  28. data/config/locales/ca.yml +28 -1
  29. data/config/locales/en.yml +28 -0
  30. data/config/locales/es.yml +32 -5
  31. data/config/locales/eu.yml +28 -0
  32. data/config/locales/fi.yml +66 -38
  33. data/config/locales/fr.yml +28 -0
  34. data/config/locales/gl.yml +165 -0
  35. data/config/locales/it.yml +30 -2
  36. data/config/locales/nl.yml +28 -0
  37. data/config/locales/pl.yml +28 -0
  38. data/config/locales/pt-BR.yml +165 -0
  39. data/config/locales/pt.yml +48 -20
  40. data/config/locales/sv.yml +165 -0
  41. data/db/migrate/20180109105917_add_assembly_user_roles.rb +17 -0
  42. data/lib/decidim/assemblies/admin_engine.rb +11 -2
  43. data/lib/decidim/assemblies/engine.rb +9 -0
  44. data/lib/decidim/assemblies/participatory_space.rb +7 -2
  45. data/lib/decidim/assemblies/test/factories.rb +36 -0
  46. data/lib/decidim/assemblies/version.rb +1 -1
  47. metadata +34 -12
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 36bdde02af4051c46ec0dfe0fa5f01a80bb4c4ee
4
- data.tar.gz: a761f3f9f2ec9a17707a5987559ba09ed766e6ad
2
+ SHA256:
3
+ metadata.gz: 239b54948da6dacd5224932fd59660b9593c5f47658af0ece3f2e77cac509574
4
+ data.tar.gz: f781b393aeaf19a7a5d5646c6fbb98fd450c79449ff054d0bb7d639490703ef7
5
5
  SHA512:
6
- metadata.gz: 67d0794a61829846d36a3d8fc3c3c5ce11f4acbf8c57f59ea78e90e0263c257eef2bd8c1b75df0e548b20e5b26c7b96535af9f4b053037a0fb597fcdf3fd0d00
7
- data.tar.gz: e2c685cf545dd8890512dc11b9c699f9c1e741957844729e00c67cd82f71199e1694c7e121543786b6ae5f642eccd79fc4f080c55b9c1adcce5c489d427cad43
6
+ metadata.gz: 6ca312550fe3293500f448d66eca8c343192cf4e6f416f5e8e22c2fc8e106f3b7cb7ac4f444db1b5e29a413dede542e54754b06258ee8d124ce17061a11a26f3
7
+ data.tar.gz: 3a2eaf20e4de03122cf94a3a1b71d8e8058bf1acbcff54c01f973aa6f0a947e0142260e3d7bcbcf481925911728c70f7405fbc56faf716f22afc237ee17d95b3
data/README.md CHANGED
@@ -9,7 +9,7 @@ can be fully managed via an administration UI.
9
9
 
10
10
  ## Usage
11
11
 
12
- This plugin provides:
12
+ This module provides:
13
13
 
14
14
  * A CRUD engine to manage assemblies.
15
15
 
@@ -1,12 +1,14 @@
1
1
  $(() => {
2
- const $assemblyScopeEnabled = $('#assembly_scopes_enabled');
3
- const $assemblyScopeId = $("#assembly_scope_id");
2
+ ((exports) => {
3
+ const $assemblyScopeEnabled = $('#assembly_scopes_enabled');
4
+ const $assemblyScopeId = $("#assembly_scope_id");
4
5
 
5
- if ($('.edit_assembly, .new_assembly').length > 0) {
6
- $assemblyScopeEnabled.on('change', (event) => {
7
- const checked = event.target.checked;
8
- $assemblyScopeId.attr("disabled", !checked);
9
- })
10
- $assemblyScopeId.attr("disabled", !$assemblyScopeEnabled.prop('checked'));
11
- }
6
+ if ($('.edit_assembly, .new_assembly').length > 0) {
7
+ $assemblyScopeEnabled.on('change', (event) => {
8
+ const checked = event.target.checked;
9
+ exports.theDataPicker.enabled($assemblyScopeId, checked);
10
+ })
11
+ exports.theDataPicker.enabled($assemblyScopeId, $assemblyScopeEnabled.prop('checked'));
12
+ }
13
+ })(window);
12
14
  });
@@ -0,0 +1,93 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Assemblies
5
+ module Admin
6
+ # A command with all the business logic when creating a new participatory
7
+ # process admin in the system.
8
+ class CreateAssemblyAdmin < Rectify::Command
9
+ # Public: Initializes the command.
10
+ #
11
+ # form - A form object with the params.
12
+ # assembly - The Assembly that will hold the
13
+ # user role
14
+ def initialize(form, current_user, assembly)
15
+ @form = form
16
+ @current_user = current_user
17
+ @assembly = assembly
18
+ end
19
+
20
+ # Executes the command. Broadcasts these events:
21
+ #
22
+ # - :ok when everything is valid.
23
+ # - :invalid if the form wasn't valid and we couldn't proceed.
24
+ #
25
+ # Returns nothing.
26
+ def call
27
+ return broadcast(:invalid) if form.invalid?
28
+
29
+ ActiveRecord::Base.transaction do
30
+ create_or_invite_user
31
+ create_role
32
+ end
33
+
34
+ broadcast(:ok)
35
+ rescue ActiveRecord::RecordInvalid
36
+ form.errors.add(:email, :taken)
37
+ broadcast(:invalid)
38
+ end
39
+
40
+ private
41
+
42
+ attr_reader :form, :assembly, :current_user, :user
43
+
44
+ def create_role
45
+ Decidim::AssemblyUserRole.find_or_create_by!(
46
+ role: form.role.to_sym,
47
+ user: user,
48
+ assembly: @assembly
49
+ )
50
+ end
51
+
52
+ def create_or_invite_user
53
+ @user ||= existing_user || new_user
54
+ end
55
+
56
+ def existing_user
57
+ return @existing_user if defined?(@existing_user)
58
+
59
+ @existing_user = User.where(
60
+ email: form.email,
61
+ organization: assembly.organization
62
+ ).first
63
+
64
+ InviteUserAgain.call(@existing_user, invitation_instructions) if @existing_user && !@existing_user.invitation_accepted?
65
+
66
+ @existing_user
67
+ end
68
+
69
+ def new_user
70
+ @new_user ||= InviteUser.call(user_form) do
71
+ on(:ok) do |user|
72
+ return user
73
+ end
74
+ end
75
+ end
76
+
77
+ def user_form
78
+ OpenStruct.new(name: form.name,
79
+ email: form.email.downcase,
80
+ organization: assembly.organization,
81
+ admin: false,
82
+ invited_by: current_user,
83
+ invitation_instructions: invitation_instructions)
84
+ end
85
+
86
+ def invitation_instructions
87
+ return "invite_admin" if form.role == "admin"
88
+ "invite_collaborator"
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Assemblies
5
+ module Admin
6
+ # A command with all the business logic when updated a participatory
7
+ # process admin in the system.
8
+ class UpdateAssemblyAdmin < Rectify::Command
9
+ # Public: Initializes the command.
10
+ #
11
+ # form - A form object with the params.
12
+ # user_role - The AssemblyUSerRole to update
13
+ def initialize(form, user_role)
14
+ @form = form
15
+ @user_role = user_role
16
+ end
17
+
18
+ # Executes the command. Broadcasts these events:
19
+ #
20
+ # - :ok when everything is valid.
21
+ # - :invalid if the form wasn't valid and we couldn't proceed.
22
+ #
23
+ # Returns nothing.
24
+ def call
25
+ return broadcast(:invalid) if form.invalid?
26
+ return broadcast(:invalid) unless user_role
27
+
28
+ update_role!
29
+ broadcast(:ok)
30
+ end
31
+
32
+ private
33
+
34
+ attr_reader :form, :user_role
35
+
36
+ def update_role!
37
+ user_role.update_attributes!(role: form.role)
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -6,7 +6,7 @@ module Decidim
6
6
  # Controller that allows managing assemblies.
7
7
  #
8
8
  class AssembliesController < Decidim::Admin::ApplicationController
9
- helper_method :current_assembly
9
+ helper_method :current_assembly, :current_participatory_space
10
10
  layout "decidim/admin/assemblies"
11
11
 
12
12
  def index
@@ -83,9 +83,7 @@ module Decidim
83
83
  ).first
84
84
  end
85
85
 
86
- def current_participatory_space
87
- current_assembly
88
- end
86
+ alias current_participatory_space current_assembly
89
87
 
90
88
  def collection
91
89
  @collection ||= OrganizationAssemblies.new(current_user.organization).query
@@ -0,0 +1,99 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Assemblies
5
+ module Admin
6
+ # Controller that allows managing assembly user roles.
7
+ #
8
+ class AssemblyUserRolesController < Decidim::Assemblies::Admin::ApplicationController
9
+ include Concerns::AssemblyAdmin
10
+
11
+ def index
12
+ authorize! :read, Decidim::AssemblyUserRole
13
+ @assembly_user_roles = collection
14
+ end
15
+
16
+ def new
17
+ authorize! :create, Decidim::AssemblyUserRole
18
+ @form = form(AssemblyUserRoleForm).instance
19
+ end
20
+
21
+ def create
22
+ authorize! :create, Decidim::AssemblyUserRole
23
+ @form = form(AssemblyUserRoleForm).from_params(params)
24
+
25
+ CreateAssemblyAdmin.call(@form, current_user, current_assembly) do
26
+ on(:ok) do
27
+ flash[:notice] = I18n.t("assembly_user_roles.create.success", scope: "decidim.admin")
28
+ end
29
+
30
+ on(:invalid) do
31
+ flash[:alert] = I18n.t("assembly_user_roles.create.error", scope: "decidim.admin")
32
+ end
33
+ redirect_to assembly_user_roles_path(current_assembly)
34
+ end
35
+ end
36
+
37
+ def edit
38
+ @user_role = collection.find(params[:id])
39
+ authorize! :update, @user_role
40
+ @form = form(AssemblyUserRoleForm).from_model(@user_role.user)
41
+ end
42
+
43
+ def update
44
+ @user_role = collection.find(params[:id])
45
+ authorize! :update, @user_role
46
+ @form = form(AssemblyUserRoleForm).from_params(params)
47
+
48
+ UpdateAssemblyAdmin.call(@form, @user_role) do
49
+ on(:ok) do
50
+ flash[:notice] = I18n.t("assembly_user_roles.update.success", scope: "decidim.admin")
51
+ redirect_to assembly_user_roles_path(current_assembly)
52
+ end
53
+
54
+ on(:invalid) do
55
+ flash.now[:alert] = I18n.t("assembly_user_roles.update.error", scope: "decidim.admin")
56
+ render :edit
57
+ end
58
+ end
59
+ end
60
+
61
+ def destroy
62
+ @assembly_user_role = collection.find(params[:id])
63
+ authorize! :destroy, @assembly_user_role
64
+ @assembly_user_role.destroy!
65
+
66
+ flash[:notice] = I18n.t("assembly_user_roles.destroy.success", scope: "decidim.admin")
67
+
68
+ redirect_to assembly_user_roles_path(@assembly_user_role.assembly)
69
+ end
70
+
71
+ def resend_invitation
72
+ @user_role = collection.find(params[:id])
73
+ authorize! :invite, @user_role
74
+
75
+ InviteUserAgain.call(@user_role.user, "invite_admin") do
76
+ on(:ok) do
77
+ flash[:notice] = I18n.t("users.resend_invitation.success", scope: "decidim.admin")
78
+ end
79
+
80
+ on(:invalid) do
81
+ flash[:alert] = I18n.t("users.resend_invitation.error", scope: "decidim.admin")
82
+ end
83
+ end
84
+
85
+ redirect_to assembly_user_roles_path(current_assembly)
86
+ end
87
+
88
+ private
89
+
90
+ def collection
91
+ @collection ||= Decidim::AssemblyUserRole
92
+ .includes(:user)
93
+ .where(assembly: current_assembly)
94
+ .order(:role, "decidim_users.name")
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Assemblies
5
+ module Admin
6
+ # A form object used to create assembly user roles from the admin dashboard.
7
+ #
8
+ class AssemblyUserRoleForm < Form
9
+ mimic :assembly_user_role
10
+
11
+ attribute :name, String
12
+ attribute :email, String
13
+ attribute :role, String
14
+
15
+ validates :email, :role, presence: true
16
+ validates :name, presence: true
17
+ validates :role, inclusion: { in: Decidim::AssemblyUserRole::ROLES }
18
+
19
+ def roles
20
+ Decidim::AssemblyUserRole::ROLES.map do |role|
21
+ [
22
+ I18n.t(role, scope: "decidim.admin.models.assembly_user_role.roles"),
23
+ role
24
+ ]
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -10,6 +10,7 @@ module Decidim
10
10
  super
11
11
 
12
12
  can :manage, Assembly
13
+ can :manage, Decidim::AssemblyUserRole
13
14
  end
14
15
  end
15
16
  end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Assemblies
5
+ module Abilities
6
+ module Admin
7
+ # Defines the abilities for an assembly admin user. Intended to be used
8
+ # with `cancancan`.
9
+ class AssemblyAdminAbility < Decidim::Assemblies::Abilities::Admin::AssemblyRoleAbility
10
+ def define_abilities
11
+ super
12
+
13
+ can :manage, Assembly do |assembly|
14
+ can_manage_assembly?(assembly)
15
+ end
16
+
17
+ cannot :create, Assembly
18
+ cannot :destroy, Assembly
19
+ end
20
+
21
+ def role
22
+ :admin
23
+ end
24
+
25
+ def define_assembly_abilities
26
+ can :manage, Feature do |feature|
27
+ can_manage_assembly?(feature.participatory_space)
28
+ end
29
+
30
+ can :manage, Category do |category|
31
+ can_manage_assembly?(category.participatory_space)
32
+ end
33
+
34
+ can :manage, Attachment do |attachment|
35
+ attachment.attached_to.is_a?(Decidim::Assembly) && can_manage_assembly?(attachment.attached_to)
36
+ end
37
+
38
+ can :manage, AssemblyUserRole do |role|
39
+ can_manage_assembly?(role.assembly) && role.user != @user
40
+ end
41
+
42
+ can :manage, Moderation do |moderation|
43
+ can_manage_assembly?(moderation.participatory_space)
44
+ end
45
+
46
+ can [:unreport, :hide], Reportable do |reportable|
47
+ can_manage_assembly?(reportable.feature.participatory_space)
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Assemblies
5
+ module Abilities
6
+ module Admin
7
+ # Defines the abilities for an assembly collaborator user. Intended to be used
8
+ # with `cancancan`.
9
+ class AssemblyCollaboratorAbility < Decidim::Assemblies::Abilities::Admin::AssemblyRoleAbility
10
+ def define_abilities
11
+ super
12
+
13
+ can [:read, :preview], Assembly do |assembly|
14
+ can_manage_assembly?(assembly)
15
+ end
16
+ end
17
+
18
+ def role
19
+ :collaborator
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Assemblies
5
+ module Abilities
6
+ module Admin
7
+ # Defines the abilities for an assembly moderator user. Intended to be used
8
+ # with `cancancan`.
9
+ class AssemblyModeratorAbility < Decidim::Assemblies::Abilities::Admin::AssemblyRoleAbility
10
+ def define_abilities
11
+ super
12
+
13
+ can [:index, :read], Assembly do |assembly|
14
+ can_manage_assembly?(assembly)
15
+ end
16
+
17
+ can :manage, Moderation do |moderation|
18
+ can_manage_assembly?(moderation.participatory_space)
19
+ end
20
+
21
+ can [:unreport, :hide], Reportable do |reportable|
22
+ can_manage_assembly?(reportable.feature.participatory_space)
23
+ end
24
+ end
25
+
26
+ def role
27
+ :moderator
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end