decidim-assemblies 0.9.3 → 0.10.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 (45) hide show
  1. checksums.yaml +4 -4
  2. data/app/commands/decidim/assemblies/admin/create_assembly.rb +18 -6
  3. data/app/commands/decidim/assemblies/admin/create_assembly_admin.rb +29 -10
  4. data/app/commands/decidim/assemblies/admin/destroy_assembly_admin.rb +53 -0
  5. data/app/commands/decidim/assemblies/admin/publish_assembly.rb +8 -3
  6. data/app/commands/decidim/assemblies/admin/unpublish_assembly.rb +9 -4
  7. data/app/commands/decidim/assemblies/admin/update_assembly.rb +11 -1
  8. data/app/commands/decidim/assemblies/admin/update_assembly_admin.rb +11 -1
  9. data/app/controllers/decidim/assemblies/admin/assembly_attachment_collections_controller.rb +26 -0
  10. data/app/controllers/decidim/assemblies/admin/assembly_publications_controller.rb +2 -2
  11. data/app/controllers/decidim/assemblies/admin/assembly_user_roles_controller.rb +6 -4
  12. data/app/controllers/decidim/assemblies/assemblies_controller.rb +1 -0
  13. data/app/forms/decidim/assemblies/admin/assembly_copy_form.rb +1 -1
  14. data/app/forms/decidim/assemblies/admin/assembly_form.rb +7 -1
  15. data/app/models/decidim/assemblies/abilities/admin/assembly_admin_ability.rb +4 -0
  16. data/app/models/decidim/assemblies/abilities/admin/assembly_role_ability.rb +2 -2
  17. data/app/models/decidim/assemblies/abilities/assembly_role_ability.rb +2 -2
  18. data/app/models/decidim/assembly.rb +11 -3
  19. data/app/models/decidim/assembly_user_role.rb +8 -0
  20. data/app/presenters/decidim/assemblies/admin_log/assembly_presenter.rb +61 -0
  21. data/app/presenters/decidim/assemblies/admin_log/assembly_user_role_presenter.rb +53 -0
  22. data/app/presenters/decidim/assemblies/admin_log/value_types/role_presenter.rb +22 -0
  23. data/app/views/decidim/assemblies/admin/assemblies/_form.html.erb +4 -0
  24. data/app/views/decidim/assemblies/assemblies/show.html.erb +9 -0
  25. data/app/views/layouts/decidim/admin/assembly.html.erb +15 -3
  26. data/config/locales/ca.yml +22 -2
  27. data/config/locales/en.yml +20 -0
  28. data/config/locales/es.yml +20 -0
  29. data/config/locales/eu.yml +20 -0
  30. data/config/locales/fi.yml +20 -0
  31. data/config/locales/fr.yml +32 -12
  32. data/config/locales/gl.yml +20 -0
  33. data/config/locales/it.yml +20 -0
  34. data/config/locales/nl.yml +20 -0
  35. data/config/locales/pl.yml +20 -5
  36. data/config/locales/pt-BR.yml +20 -0
  37. data/config/locales/pt.yml +20 -0
  38. data/config/locales/sv.yml +20 -0
  39. data/config/locales/uk.yml +28 -4
  40. data/db/migrate/20180125104426_add_reference_to_assemblies.rb +7 -0
  41. data/db/migrate/20180216091553_add_area_to_assemblies.rb +7 -0
  42. data/lib/decidim/assemblies/admin_engine.rb +1 -0
  43. data/lib/decidim/assemblies/participatory_space.rb +14 -0
  44. data/lib/decidim/assemblies/version.rb +1 -1
  45. metadata +16 -9
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bab1bf1a71275b8b6b547fbf43f143f4608ada5eef3c894ce1117be6e9cf3774
4
- data.tar.gz: 18d03bb95e8d15dc49bf6d040fa5ebf8c596c89b8ec06d4b10faa6e601795686
3
+ metadata.gz: 0bce6f82592435d8eaf24b82b7e6268882e112d7ca1bf0a7199f8cd760cfa7e4
4
+ data.tar.gz: 01576d6f352a674f5bd0d28ab756176b07be3711167cf8050083900a5a9b2155
5
5
  SHA512:
6
- metadata.gz: bd649cac9b4adfa2a917f42931d5886b3d2745b3e901da1c7cc60e39376ee5557329ec3bf5a02889a8cc03354dc5fc0ffa5bca368050e89ecf3547b1f068cf2e
7
- data.tar.gz: 2d8ab9121d5f08ca6643b482aa02c5591d296cd6860ae2b879c30ef98a29f91a5dd2637764d05aac6576fd932ee88258c39aa7d24b0d22d2ba53065b3c904d45
6
+ metadata.gz: 14d6d72634ae5a8248be2845d9827c04853c7db7f08e311bfb58873ef868d80f2545eef306b54541080781f1082721fb6380edf7ed82f82cdb8ce1e35325f718
7
+ data.tar.gz: 93e76dc2e1b02588b66d6e2b67bea301c1675c6a6b036098232e0919f7590396f92ed49c85903526f967fc7aed0db0a858bd202a85f16f50a7cbb1656887d3e0
@@ -21,9 +21,9 @@ module Decidim
21
21
  # Returns nothing.
22
22
  def call
23
23
  return broadcast(:invalid) if form.invalid?
24
- assembly = create_assembly
25
24
 
26
25
  if assembly.persisted?
26
+ add_admins_as_followers(assembly)
27
27
  broadcast(:ok, assembly)
28
28
  else
29
29
  form.errors.add(:hero_image, assembly.errors[:hero_image]) if assembly.errors.include? :hero_image
@@ -36,8 +36,10 @@ module Decidim
36
36
 
37
37
  attr_reader :form
38
38
 
39
- def create_assembly
40
- assembly = Assembly.new(
39
+ def assembly
40
+ @assembly ||= Decidim.traceability.create(
41
+ Assembly,
42
+ form.current_user,
41
43
  organization: form.current_organization,
42
44
  title: form.title,
43
45
  subtitle: form.subtitle,
@@ -50,6 +52,7 @@ module Decidim
50
52
  promoted: form.promoted,
51
53
  scopes_enabled: form.scopes_enabled,
52
54
  scope: form.scope,
55
+ area: form.area,
53
56
  developer_group: form.developer_group,
54
57
  local_area: form.local_area,
55
58
  target: form.target,
@@ -57,10 +60,19 @@ module Decidim
57
60
  participatory_structure: form.participatory_structure,
58
61
  meta_scope: form.meta_scope
59
62
  )
63
+ end
64
+
65
+ def add_admins_as_followers(assembly)
66
+ assembly.organization.admins.each do |admin|
67
+ form = Decidim::FollowForm
68
+ .from_params(followable_gid: assembly.to_signed_global_id.to_s)
69
+ .with_context(
70
+ current_organization: assembly.organization,
71
+ current_user: admin
72
+ )
60
73
 
61
- return assembly unless assembly.valid?
62
- assembly.save!
63
- assembly
74
+ Decidim::CreateFollow.new(form, admin).call
75
+ end
64
76
  end
65
77
  end
66
78
  end
@@ -27,8 +27,9 @@ module Decidim
27
27
  return broadcast(:invalid) if form.invalid?
28
28
 
29
29
  ActiveRecord::Base.transaction do
30
- create_or_invite_user
30
+ @user = @user ||= existing_user || new_user
31
31
  create_role
32
+ add_admin_as_follower
32
33
  end
33
34
 
34
35
  broadcast(:ok)
@@ -42,15 +43,20 @@ module Decidim
42
43
  attr_reader :form, :assembly, :current_user, :user
43
44
 
44
45
  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
46
+ Decidim.traceability.perform_action!(
47
+ :create,
48
+ Decidim::AssemblyUserRole,
49
+ current_user,
50
+ resource: {
51
+ title: user.name
52
+ }
53
+ ) do
54
+ Decidim::AssemblyUserRole.find_or_create_by!(
55
+ role: form.role.to_sym,
56
+ user: user,
57
+ assembly: @assembly
58
+ )
59
+ end
54
60
  end
55
61
 
56
62
  def existing_user
@@ -87,6 +93,19 @@ module Decidim
87
93
  return "invite_admin" if form.role == "admin"
88
94
  "invite_collaborator"
89
95
  end
96
+
97
+ def add_admin_as_follower
98
+ return if user.follows?(assembly)
99
+
100
+ form = Decidim::FollowForm
101
+ .from_params(followable_gid: assembly.to_signed_global_id.to_s)
102
+ .with_context(
103
+ current_organization: assembly.organization,
104
+ current_user: user
105
+ )
106
+
107
+ Decidim::CreateFollow.new(form, user).call
108
+ end
90
109
  end
91
110
  end
92
111
  end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Assemblies
5
+ module Admin
6
+ # A command with all the business logic when destroying an assembly
7
+ # admin in the system.
8
+ class DestroyAssemblyAdmin < Rectify::Command
9
+ # Public: Initializes the command.
10
+ #
11
+ # role - the AssemblyUserRole to destroy
12
+ # current_user - the user performing this action
13
+ def initialize(role, current_user)
14
+ @role = role
15
+ @current_user = current_user
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
+ destroy_role!
26
+ broadcast(:ok)
27
+ end
28
+
29
+ private
30
+
31
+ attr_reader :role, :current_user
32
+
33
+ def destroy_role!
34
+ extra_info = {
35
+ resource: {
36
+ title: role.user.name
37
+ }
38
+ }
39
+
40
+ Decidim.traceability.perform_action!(
41
+ "delete",
42
+ role,
43
+ current_user,
44
+ extra_info
45
+ ) do
46
+ role.destroy!
47
+ role
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -8,8 +8,10 @@ module Decidim
8
8
  # Public: Initializes the command.
9
9
  #
10
10
  # assembly - A Assembly that will be published
11
- def initialize(assembly)
11
+ # current_user - the user performing the action
12
+ def initialize(assembly, current_user)
12
13
  @assembly = assembly
14
+ @current_user = current_user
13
15
  end
14
16
 
15
17
  # Executes the command. Broadcasts these events:
@@ -21,13 +23,16 @@ module Decidim
21
23
  def call
22
24
  return broadcast(:invalid) if assembly.nil? || assembly.published?
23
25
 
24
- assembly.publish!
26
+ Decidim.traceability.perform_action!("publish", assembly, current_user) do
27
+ assembly.publish!
28
+ end
29
+
25
30
  broadcast(:ok)
26
31
  end
27
32
 
28
33
  private
29
34
 
30
- attr_reader :assembly
35
+ attr_reader :assembly, :current_user
31
36
  end
32
37
  end
33
38
  end
@@ -7,9 +7,11 @@ module Decidim
7
7
  class UnpublishAssembly < Rectify::Command
8
8
  # Public: Initializes the command.
9
9
  #
10
- # assembly - A Assembly that will be unpublished
11
- def initialize(assembly)
10
+ # assembly - A Assembly that will be published
11
+ # current_user - the user performing the action
12
+ def initialize(assembly, current_user)
12
13
  @assembly = assembly
14
+ @current_user = current_user
13
15
  end
14
16
 
15
17
  # Executes the command. Broadcasts these events:
@@ -21,13 +23,16 @@ module Decidim
21
23
  def call
22
24
  return broadcast(:invalid) if assembly.nil? || !assembly.published?
23
25
 
24
- assembly.unpublish!
26
+ Decidim.traceability.perform_action!("unpublish", assembly, current_user) do
27
+ assembly.unpublish!
28
+ end
29
+
25
30
  broadcast(:ok)
26
31
  end
27
32
 
28
33
  private
29
34
 
30
- attr_reader :assembly
35
+ attr_reader :assembly, :current_user
31
36
  end
32
37
  end
33
38
  end
@@ -40,7 +40,16 @@ module Decidim
40
40
 
41
41
  def update_assembly
42
42
  @assembly.assign_attributes(attributes)
43
- @assembly.save! if @assembly.valid?
43
+ save_assembly if @assembly.valid?
44
+ end
45
+
46
+ def save_assembly
47
+ transaction do
48
+ @assembly.save!
49
+ Decidim.traceability.perform_action!(:update, @assembly, form.current_user) do
50
+ @assembly
51
+ end
52
+ end
44
53
  end
45
54
 
46
55
  def attributes
@@ -58,6 +67,7 @@ module Decidim
58
67
  short_description: form.short_description,
59
68
  scopes_enabled: form.scopes_enabled,
60
69
  scope: form.scope,
70
+ area: form.area,
61
71
  developer_group: form.developer_group,
62
72
  local_area: form.local_area,
63
73
  target: form.target,
@@ -34,7 +34,17 @@ module Decidim
34
34
  attr_reader :form, :user_role
35
35
 
36
36
  def update_role!
37
- user_role.update_attributes!(role: form.role)
37
+ log_info = {
38
+ resource: {
39
+ title: user_role.user.name
40
+ }
41
+ }
42
+ Decidim.traceability.update!(
43
+ user_role,
44
+ form.current_user,
45
+ { role: form.role },
46
+ log_info
47
+ )
38
48
  end
39
49
  end
40
50
  end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Assemblies
5
+ module Admin
6
+ # Controller that allows managing all the attachment collections for an assembly.
7
+ #
8
+ class AssemblyAttachmentCollectionsController < Decidim::Admin::ApplicationController
9
+ include Concerns::AssemblyAdmin
10
+ include Decidim::Admin::Concerns::HasAttachmentCollections
11
+
12
+ def after_destroy_path
13
+ assembly_attachment_collections_path(current_assembly)
14
+ end
15
+
16
+ def collection_for
17
+ current_assembly
18
+ end
19
+
20
+ def authorization_object
21
+ @attachment_collection || AttachmentCollection
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -11,7 +11,7 @@ module Decidim
11
11
  def create
12
12
  authorize! :publish, current_assembly
13
13
 
14
- PublishAssembly.call(current_assembly) do
14
+ PublishAssembly.call(current_assembly, current_user) do
15
15
  on(:ok) do
16
16
  flash[:notice] = I18n.t("assembly_publications.create.success", scope: "decidim.admin")
17
17
  end
@@ -27,7 +27,7 @@ module Decidim
27
27
  def destroy
28
28
  authorize! :publish, current_assembly
29
29
 
30
- UnpublishAssembly.call(current_assembly) do
30
+ UnpublishAssembly.call(current_assembly, current_user) do
31
31
  on(:ok) do
32
32
  flash[:notice] = I18n.t("assembly_publications.destroy.success", scope: "decidim.admin")
33
33
  end
@@ -61,11 +61,13 @@ module Decidim
61
61
  def destroy
62
62
  @assembly_user_role = collection.find(params[:id])
63
63
  authorize! :destroy, @assembly_user_role
64
- @assembly_user_role.destroy!
65
64
 
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)
65
+ DestroyAssemblyAdmin.call(@assembly_user_role, current_user) do
66
+ on(:ok) do
67
+ flash[:notice] = I18n.t("assembly_user_roles.destroy.success", scope: "decidim.admin")
68
+ redirect_to assembly_user_roles_path(current_assembly)
69
+ end
70
+ end
69
71
  end
70
72
 
71
73
  def resend_invitation
@@ -12,6 +12,7 @@ module Decidim
12
12
  helper Decidim::IconHelper
13
13
  helper Decidim::WidgetUrlsHelper
14
14
  helper Decidim::SanitizeHelper
15
+ helper Decidim::ResourceReferenceHelper
15
16
 
16
17
  helper_method :collection, :promoted_assemblies, :assemblies, :stats
17
18
 
@@ -17,7 +17,7 @@ module Decidim
17
17
  attribute :copy_categories, Boolean
18
18
  attribute :copy_features, Boolean
19
19
 
20
- validates :slug, presence: true, format: { with: Decidim::ParticipatoryProcess.slug_format }
20
+ validates :slug, presence: true, format: { with: Decidim::Assembly.slug_format }
21
21
  validates :title, translatable_presence: true
22
22
  validate :slug_uniqueness
23
23
 
@@ -32,10 +32,12 @@ module Decidim
32
32
  attribute :banner_image
33
33
  attribute :remove_banner_image
34
34
  attribute :show_statistics, Boolean
35
+ attribute :area_id, Integer
35
36
 
36
- validates :slug, presence: true, format: { with: Decidim::ParticipatoryProcess.slug_format }
37
+ validates :slug, presence: true, format: { with: Decidim::Assembly.slug_format }
37
38
  validates :title, :subtitle, :description, :short_description, translatable_presence: true
38
39
  validates :scope, presence: true, if: proc { |object| object.scope_id.present? }
40
+ validates :area, presence: true, if: proc { |object| object.area_id.present? }
39
41
 
40
42
  validate :slug_uniqueness
41
43
 
@@ -50,6 +52,10 @@ module Decidim
50
52
  @scope ||= current_organization.scopes.where(id: scope_id).first
51
53
  end
52
54
 
55
+ def area
56
+ @area ||= current_organization.areas.where(id: area_id).first
57
+ end
58
+
53
59
  private
54
60
 
55
61
  def slug_uniqueness
@@ -35,6 +35,10 @@ module Decidim
35
35
  attachment.attached_to.is_a?(Decidim::Assembly) && can_manage_assembly?(attachment.attached_to)
36
36
  end
37
37
 
38
+ can :manage, AttachmentCollection do |attachment_collection|
39
+ attachment_collection.collection_for.is_a?(Decidim::Assembly) && can_manage_assembly?(attachment_collection.collection_for)
40
+ end
41
+
38
42
  can :manage, AssemblyUserRole do |role|
39
43
  can_manage_assembly?(role.assembly) && role.user != @user
40
44
  end
@@ -29,7 +29,7 @@ module Decidim
29
29
  def define_assembly_abilities; end
30
30
 
31
31
  # Abstract: A subclass must define this method returning a valid role.
32
- # See ParticipatoryProcessUserRoles::ROLES for more information.
32
+ # See AssemblyUserRole::ROLES for more information.
33
33
  def role
34
34
  raise "Needs implementation"
35
35
  end
@@ -42,7 +42,7 @@ module Decidim
42
42
  # Returns a collection of assemblies where the given user has the
43
43
  # specific role privilege.
44
44
  def assemblies_with_role_privileges
45
- @assemblies ||= Decidim::Assemblies::AssembliesWithUserRole.for(@user, role)
45
+ @assemblies_with_role_privileges ||= Decidim::Assemblies::AssembliesWithUserRole.for(@user, role)
46
46
  end
47
47
 
48
48
  # Whether the user has at least one assembly to manage or not.
@@ -30,7 +30,7 @@ module Decidim
30
30
  end
31
31
 
32
32
  # Abstract: A subclass must define this method returning a valid role.
33
- # See ParticipatoryProcessUserRoles::ROLES for more information.
33
+ # See AssemblyUserRole::ROLES for more information.
34
34
  def role
35
35
  raise "Needs implementation"
36
36
  end
@@ -38,7 +38,7 @@ module Decidim
38
38
  # Returns a collection of Participatory assemblies where the given user has the
39
39
  # specific role privilege.
40
40
  def assemblies_with_role_privileges
41
- @assemblies ||= Decidim::Assemblies::AssembliesWithUserRole.for(@user, role)
41
+ @assemblies_with_role_privileges ||= Decidim::Assemblies::AssembliesWithUserRole.for(@user, role)
42
42
  end
43
43
 
44
44
  # Whether the user has at least one assembly to manage or not.