decidim-assemblies 0.9.3 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
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.