decidim-admin 0.23.3 → 0.24.1

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.

Potentially problematic release.


This version of decidim-admin might be problematic. Click here for more details.

Files changed (178) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/config/decidim_admin_manifest.js +1 -0
  3. data/app/assets/javascripts/decidim/admin/application.js.es6 +4 -1
  4. data/app/assets/javascripts/decidim/admin/budget_rule_toggler.component.js.es6 +23 -20
  5. data/app/assets/javascripts/decidim/admin/bundle.js +10 -17
  6. data/app/assets/javascripts/decidim/admin/bundle.js.map +1 -1
  7. data/app/assets/javascripts/decidim/admin/form.js.es6 +1 -0
  8. data/app/assets/javascripts/decidim/admin/import_guidance.js.es6 +29 -0
  9. data/app/assets/javascripts/decidim/admin/moderations.js.es6 +24 -0
  10. data/app/assets/javascripts/decidim/admin/proposal_infinite_edit.js.es6 +20 -0
  11. data/app/assets/javascripts/decidim/admin/subform_multi_toggler.component.js.es6 +2 -2
  12. data/app/assets/javascripts/decidim/admin/subform_toggler.component.js.es6 +2 -2
  13. data/app/assets/javascripts/decidim/admin/user_moderations.js +2 -0
  14. data/app/assets/stylesheets/decidim/admin/_variables.scss +9 -0
  15. data/app/assets/stylesheets/decidim/admin/components/_dropdown-menu.scss +3 -0
  16. data/app/assets/stylesheets/decidim/admin/extra/_action-icon.scss +13 -0
  17. data/app/assets/stylesheets/decidim/admin/extra/_block_user.scss +5 -0
  18. data/app/assets/stylesheets/decidim/admin/extra/_title_bar.scss +1 -0
  19. data/app/assets/stylesheets/decidim/admin/modules/_moderations.scss +39 -0
  20. data/app/assets/stylesheets/decidim/admin/modules/_modules.scss +2 -0
  21. data/app/assets/stylesheets/decidim/admin/modules/_reveal.scss +5 -0
  22. data/app/assets/stylesheets/decidim/admin/modules/_secondary-nav.scss +6 -3
  23. data/app/assets/stylesheets/decidim/admin/modules/_user-login.scss +2 -2
  24. data/app/assets/stylesheets/decidim/admin/user_moderations.scss +3 -0
  25. data/app/assets/stylesheets/decidim/admin/utils/_settings.scss +1 -0
  26. data/app/cells/decidim/admin/content_block/show.erb +1 -1
  27. data/app/cells/decidim/admin/content_block_cell.rb +4 -0
  28. data/app/commands/decidim/admin/block_user.rb +70 -0
  29. data/app/commands/decidim/admin/create_import.rb +29 -0
  30. data/app/commands/decidim/admin/create_participatory_space_admin_user_actions.rb +98 -0
  31. data/app/commands/decidim/admin/create_participatory_space_private_user.rb +1 -1
  32. data/app/commands/decidim/admin/create_static_page.rb +2 -1
  33. data/app/commands/decidim/admin/hide_resource.rb +21 -0
  34. data/app/commands/decidim/admin/impersonate_user.rb +17 -1
  35. data/app/commands/decidim/admin/promote_managed_user.rb +10 -0
  36. data/app/commands/decidim/admin/reorder_content_blocks.rb +6 -3
  37. data/app/commands/decidim/admin/transfer_user.rb +78 -0
  38. data/app/commands/decidim/admin/unblock_user.rb +48 -0
  39. data/app/commands/decidim/admin/unreport_user.rb +46 -0
  40. data/app/commands/decidim/admin/update_organization_appearance.rb +12 -4
  41. data/app/commands/decidim/admin/update_static_page.rb +2 -1
  42. data/app/commands/decidim/admin/verify_user_group.rb +1 -1
  43. data/app/controllers/concerns/decidim/admin/filterable.rb +1 -1
  44. data/app/controllers/concerns/decidim/admin/global_moderation_context.rb +47 -0
  45. data/app/controllers/concerns/decidim/admin/landing_page.rb +105 -0
  46. data/app/controllers/concerns/decidim/admin/landing_page_content_blocks.rb +118 -0
  47. data/app/controllers/concerns/decidim/moderations/admin/filterable.rb +54 -0
  48. data/app/controllers/decidim/admin/block_user_controller.rb +60 -0
  49. data/app/controllers/decidim/admin/components/base_controller.rb +1 -0
  50. data/app/controllers/decidim/admin/conflicts_controller.rb +46 -0
  51. data/app/controllers/decidim/admin/exports_controller.rb +1 -2
  52. data/app/controllers/decidim/admin/global_moderations/reports_controller.rb +18 -0
  53. data/app/controllers/decidim/admin/global_moderations_controller.rb +32 -0
  54. data/app/controllers/decidim/admin/impersonations_controller.rb +1 -1
  55. data/app/controllers/decidim/admin/imports_controller.rb +52 -0
  56. data/app/controllers/decidim/admin/moderated_users_controller.rb +44 -0
  57. data/app/controllers/decidim/admin/moderations/reports_controller.rb +39 -0
  58. data/app/controllers/decidim/admin/moderations_controller.rb +31 -7
  59. data/app/controllers/decidim/admin/officializations_controller.rb +3 -3
  60. data/app/controllers/decidim/admin/organization_homepage_controller.rb +6 -2
  61. data/app/controllers/decidim/admin/static_pages_controller.rb +7 -0
  62. data/app/events/decidim/resource_hidden_event.rb +37 -0
  63. data/app/forms/decidim/admin/block_user_form.rb +25 -0
  64. data/app/forms/decidim/admin/import_form.rb +85 -0
  65. data/app/forms/decidim/admin/organization_appearance_form.rb +1 -2
  66. data/app/forms/decidim/admin/static_page_form.rb +6 -1
  67. data/app/forms/decidim/admin/transfer_user_form.rb +19 -0
  68. data/app/helpers/decidim/admin/admin_terms_helper.rb +0 -7
  69. data/app/helpers/decidim/admin/application_helper.rb +5 -4
  70. data/app/helpers/decidim/admin/exports_helper.rb +2 -2
  71. data/app/helpers/decidim/admin/filterable_helper.rb +3 -2
  72. data/app/helpers/decidim/admin/imports_helper.rb +43 -0
  73. data/app/helpers/decidim/admin/menu_helper.rb +10 -0
  74. data/app/helpers/decidim/admin/moderations/reports_helper.rb +40 -0
  75. data/app/helpers/decidim/admin/moderations_helper.rb +36 -0
  76. data/app/helpers/decidim/admin/newsletters_helper.rb +4 -10
  77. data/app/helpers/decidim/admin/settings_helper.rb +2 -1
  78. data/app/helpers/decidim/admin/sidebar_menu_helper.rb +13 -0
  79. data/app/helpers/decidim/admin/user_moderations_helper.rb +6 -0
  80. data/app/jobs/decidim/admin/import_participatory_space_private_user_csv_job.rb +1 -1
  81. data/app/jobs/decidim/admin/verify_user_group_from_csv_job.rb +1 -1
  82. data/app/permissions/decidim/admin/permissions.rb +7 -6
  83. data/app/presenters/decidim/admin/dashboard_metric_charts_presenter.rb +1 -1
  84. data/app/presenters/decidim/admin/secondary_menu_presenter.rb +26 -0
  85. data/app/queries/decidim/admin/active_users_counter.rb +1 -2
  86. data/app/queries/decidim/admin/user_filter.rb +1 -2
  87. data/app/views/decidim/admin/admin_terms/show.html.erb +1 -1
  88. data/app/views/decidim/admin/attachment_collections/index.html.erb +1 -1
  89. data/app/views/decidim/admin/attachments/index.html.erb +1 -1
  90. data/app/views/decidim/admin/block_user/new.html.erb +22 -0
  91. data/app/views/decidim/admin/categories/index.html.erb +1 -1
  92. data/app/views/decidim/admin/components/_component.html.erb +12 -0
  93. data/app/views/decidim/admin/components/_form.html.erb +1 -1
  94. data/app/views/decidim/admin/conflicts/edit.html.erb +46 -0
  95. data/app/views/decidim/admin/conflicts/index.html.erb +34 -0
  96. data/app/views/decidim/admin/dashboard/show.html.erb +2 -1
  97. data/app/views/decidim/admin/exports/_dropdown.html.erb +1 -1
  98. data/app/views/decidim/admin/imports/_dropdown.html.erb +9 -0
  99. data/app/views/decidim/admin/imports/new.html.erb +57 -0
  100. data/app/views/decidim/admin/moderated_users/_report.html.erb +10 -0
  101. data/app/views/decidim/admin/moderated_users/index.html.erb +78 -0
  102. data/app/views/decidim/admin/moderations/_report.html.erb +1 -1
  103. data/app/views/decidim/admin/moderations/index.html.erb +28 -9
  104. data/app/views/decidim/admin/moderations/reports/index.html.erb +102 -0
  105. data/app/views/decidim/admin/moderations/reports/show.html.erb +62 -0
  106. data/app/views/decidim/admin/newsletters/index.html.erb +1 -1
  107. data/app/views/decidim/admin/newsletters/select_recipients_to_deliver.html.erb +2 -2
  108. data/app/views/decidim/admin/officializations/index.html.erb +13 -4
  109. data/app/views/decidim/admin/organization_appearance/_form.html.erb +0 -4
  110. data/app/views/decidim/admin/organization_appearance/form/_colors.html.erb +1 -1
  111. data/app/views/decidim/admin/organization_appearance/form/_images.html.erb +4 -4
  112. data/app/views/decidim/admin/participatory_space_private_users/index.html.erb +1 -1
  113. data/app/views/decidim/admin/shared/landing_page/edit.html.erb +47 -0
  114. data/app/views/decidim/admin/shared/landing_page_content_blocks/edit.html.erb +15 -0
  115. data/app/views/decidim/admin/static_pages/_form.html.erb +6 -0
  116. data/app/views/decidim/admin/users/index.html.erb +1 -1
  117. data/app/views/layouts/decidim/admin/_application.html.erb +6 -1
  118. data/app/views/layouts/decidim/admin/_js_configuration.html.erb +26 -0
  119. data/app/views/layouts/decidim/admin/_title_bar.html.erb +2 -2
  120. data/app/views/layouts/decidim/admin/global_moderations.html.erb +7 -0
  121. data/app/views/layouts/decidim/admin/newsletters.erb +1 -1
  122. data/app/views/layouts/decidim/admin/settings.html.erb +2 -33
  123. data/app/views/layouts/decidim/admin/users.html.erb +11 -0
  124. data/config/locales/ar.yml +0 -5
  125. data/config/locales/bg.yml +0 -1
  126. data/config/locales/ca.yml +150 -4
  127. data/config/locales/cs.yml +155 -9
  128. data/config/locales/de.yml +150 -5
  129. data/config/locales/el.yml +55 -5
  130. data/config/locales/en.yml +151 -5
  131. data/config/locales/es-MX.yml +148 -3
  132. data/config/locales/es-PY.yml +148 -3
  133. data/config/locales/es.yml +148 -3
  134. data/config/locales/eu.yml +0 -3
  135. data/config/locales/fi-plain.yml +149 -3
  136. data/config/locales/fi.yml +149 -3
  137. data/config/locales/fr-CA.yml +139 -4
  138. data/config/locales/fr.yml +139 -4
  139. data/config/locales/gl.yml +127 -5
  140. data/config/locales/hu.yml +13 -5
  141. data/config/locales/id-ID.yml +0 -3
  142. data/config/locales/is-IS.yml +19 -3
  143. data/config/locales/it.yml +59 -5
  144. data/config/locales/ja.yml +46 -5
  145. data/config/locales/lv.yml +0 -5
  146. data/config/locales/nl.yml +120 -4
  147. data/config/locales/no.yml +13 -7
  148. data/config/locales/pl.yml +166 -20
  149. data/config/locales/pt-BR.yml +0 -3
  150. data/config/locales/pt.yml +0 -5
  151. data/config/locales/ro-RO.yml +232 -120
  152. data/config/locales/ru.yml +0 -3
  153. data/config/locales/sk.yml +0 -5
  154. data/config/locales/sl.yml +0 -1
  155. data/config/locales/sr-CS.yml +0 -3
  156. data/config/locales/sv.yml +150 -5
  157. data/config/locales/tr-TR.yml +81 -4
  158. data/config/locales/uk.yml +0 -3
  159. data/config/locales/zh-CN.yml +0 -5
  160. data/config/routes.rb +21 -1
  161. data/lib/decidim/admin.rb +6 -0
  162. data/lib/decidim/admin/engine.rb +76 -1
  163. data/lib/decidim/admin/import.rb +12 -0
  164. data/lib/decidim/admin/import/creator.rb +82 -0
  165. data/lib/decidim/admin/import/importer.rb +82 -0
  166. data/lib/decidim/admin/import/importer_factory.rb +17 -0
  167. data/lib/decidim/admin/import/readers.rb +39 -0
  168. data/lib/decidim/admin/import/readers/base.rb +31 -0
  169. data/lib/decidim/admin/import/readers/csv.rb +23 -0
  170. data/lib/decidim/admin/import/readers/json.rb +25 -0
  171. data/lib/decidim/admin/import/readers/xls.rb +25 -0
  172. data/lib/decidim/admin/test/commands/create_attachment_collection_examples.rb +6 -6
  173. data/lib/decidim/admin/test/commands/create_category_examples.rb +6 -6
  174. data/lib/decidim/admin/test/filterable_examples.rb +1 -8
  175. data/lib/decidim/admin/test/manage_moderations_examples.rb +68 -4
  176. data/lib/decidim/admin/version.rb +1 -1
  177. metadata +72 -15
  178. data/app/assets/javascripts/decidim/admin/gallery.js.es6 +0 -5
@@ -3,7 +3,7 @@
3
3
  <%= t(public_name_key) %>
4
4
  <div>
5
5
  <% if has_settings? %>
6
- <%= link_to decidim_admin.edit_organization_homepage_content_block_path(manifest_name), class: "mr-s text-muted" do %>
6
+ <%= link_to edit_content_block_path, class: "mr-s text-muted" do %>
7
7
  <%= icon "pencil", role: "img" %>
8
8
  <% end %>
9
9
  <% end %>
@@ -11,6 +11,10 @@ module Decidim
11
11
  model.try(:manifest_name) || model.name
12
12
  end
13
13
 
14
+ def edit_content_block_path
15
+ decidim_admin.edit_organization_homepage_content_block_path(manifest_name)
16
+ end
17
+
14
18
  def decidim_admin
15
19
  Decidim::Admin::Engine.routes.url_helpers
16
20
  end
@@ -0,0 +1,70 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Admin
5
+ class BlockUser < Rectify::Command
6
+ # Public: Initializes the command.
7
+ #
8
+ # form - BlockUserForm
9
+ def initialize(form)
10
+ @form = form
11
+ end
12
+
13
+ # Executes the command. Broadcasts these events:
14
+ #
15
+ # - :ok when everything is valid, together with the resource.
16
+ # - :invalid if the resource is not reported
17
+ #
18
+ # Returns nothing.
19
+ def call
20
+ return broadcast(:invalid) unless form.valid?
21
+
22
+ transaction do
23
+ block!
24
+ register_justification!
25
+ notify_user!
26
+ end
27
+
28
+ broadcast(:ok, form.user)
29
+ end
30
+
31
+ private
32
+
33
+ attr_reader :form
34
+
35
+ def register_justification!
36
+ @current_blocking = UserBlock.create!(
37
+ justification: form.justification,
38
+ user: form.user,
39
+ blocking_user: form.current_user
40
+ )
41
+ end
42
+
43
+ def notify_user!
44
+ Decidim::BlockUserJob.perform_later(
45
+ @current_blocking.user,
46
+ @current_blocking.justification
47
+ )
48
+ end
49
+
50
+ def block!
51
+ Decidim.traceability.perform_action!(
52
+ "block",
53
+ form.user,
54
+ form.current_user,
55
+ extra: {
56
+ reportable_type: form.user.class.name,
57
+ current_justification: form.justification
58
+ }
59
+ ) do
60
+ form.user.blocked = true
61
+ form.user.blocked_at = Time.current
62
+ form.user.blocking = @current_blocking
63
+ form.user.extended_data["user_name"] = form.user.name
64
+ form.user.name = "Blocked user"
65
+ form.user.save!
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Admin
5
+ class CreateImport < Rectify::Command
6
+ def initialize(form)
7
+ @form = form
8
+ end
9
+
10
+ def call
11
+ return broadcast(:invalid) if form.invalid?
12
+
13
+ imported_data = form.importer.prepare
14
+ transaction do
15
+ form.importer.import!
16
+
17
+ return broadcast(:ok, imported_data)
18
+ rescue StandardError
19
+ raise ActiveRecord::Rollback
20
+ end
21
+
22
+ # Something went wrong with import/finish
23
+ broadcast(:invalid)
24
+ end
25
+
26
+ attr_reader :form
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,98 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Admin
5
+ # This is not a Command but an abstration of reusable methods by commands in participatory spaces that create space admins.
6
+ # Expects the command to have a `participatory_space` attribute.
7
+ module CreateParticipatorySpaceAdminUserActions
8
+ # Executes the command. Broadcasts these events:
9
+ #
10
+ # - :ok when everything is valid.
11
+ # - :invalid if the form wasn't valid and we couldn't proceed.
12
+ #
13
+ # Returns nothing.
14
+ def call
15
+ return broadcast(:invalid) if form.invalid?
16
+
17
+ ActiveRecord::Base.transaction do
18
+ @user ||= existing_user || new_user
19
+ existing_role || create_role
20
+ add_admin_as_follower
21
+ end
22
+
23
+ broadcast(:ok)
24
+ rescue ActiveRecord::RecordInvalid
25
+ form.errors.add(:email, :taken)
26
+ broadcast(:invalid)
27
+ end
28
+
29
+ # This is command specific
30
+ # It is expected to find if a UserRole for the same user, role and participatory_process already exist
31
+ # Return a boolean, or some object equally evaluable
32
+ def existing_role
33
+ raise NotImplementedError
34
+ end
35
+
36
+ # This is command specific
37
+ # It is expected to
38
+ # - create a XxxUserRole using `Decidim.traceability`
39
+ # - send a notification to the user telling she has been invited to manage the participatory space
40
+ def create_role
41
+ raise NotImplementedError
42
+ end
43
+
44
+ def existing_user
45
+ return @existing_user if defined?(@existing_user)
46
+
47
+ @existing_user = User.find_by(
48
+ email: form.email,
49
+ organization: @participatory_space.organization
50
+ )
51
+
52
+ InviteUserAgain.call(@existing_user, invitation_instructions) if @existing_user && invitation_pending?(@existing_user)
53
+
54
+ @existing_user
55
+ end
56
+
57
+ def invitation_pending?(user)
58
+ user.invited_to_sign_up? && !user.invitation_accepted?
59
+ end
60
+
61
+ def new_user
62
+ @new_user ||= InviteUser.call(user_form) do
63
+ on(:ok) do |user|
64
+ return user
65
+ end
66
+ end
67
+ end
68
+
69
+ def user_form
70
+ OpenStruct.new(name: form.name,
71
+ email: form.email.downcase,
72
+ organization: @participatory_space.organization,
73
+ admin: false,
74
+ invited_by: current_user,
75
+ invitation_instructions: invitation_instructions)
76
+ end
77
+
78
+ def invitation_instructions
79
+ return "invite_admin" if form.role == "admin"
80
+
81
+ "invite_collaborator"
82
+ end
83
+
84
+ def add_admin_as_follower
85
+ return if user.follows?(@participatory_space)
86
+
87
+ form = Decidim::FollowForm
88
+ .from_params(followable_gid: @participatory_space.to_signed_global_id.to_s)
89
+ .with_context(
90
+ current_organization: @participatory_space.organization,
91
+ current_user: user
92
+ )
93
+
94
+ Decidim::CreateFollow.new(form, user).call
95
+ end
96
+ end
97
+ end
98
+ end
@@ -10,7 +10,7 @@ module Decidim
10
10
  # form - A form object with the params.
11
11
  # private_user_to - The private_user_to that will hold the
12
12
  # user role
13
- def initialize(form, current_user, private_user_to, via_csv = false)
13
+ def initialize(form, current_user, private_user_to, via_csv: false)
14
14
  @form = form
15
15
  @current_user = current_user
16
16
  @private_user_to = private_user_to
@@ -40,7 +40,8 @@ module Decidim
40
40
  show_in_footer: form.show_in_footer,
41
41
  weight: form.weight,
42
42
  topic: form.topic,
43
- organization: form.organization
43
+ organization: form.organization,
44
+ allow_public_access: form.allow_public_access
44
45
  )
45
46
  end
46
47
 
@@ -23,6 +23,9 @@ module Decidim
23
23
  return broadcast(:invalid) unless hideable?
24
24
 
25
25
  hide!
26
+
27
+ send_hide_notification_to_author
28
+
26
29
  broadcast(:ok, @reportable)
27
30
  end
28
31
 
@@ -44,6 +47,24 @@ module Decidim
44
47
  @reportable.moderation.update!(hidden_at: Time.current)
45
48
  end
46
49
  end
50
+
51
+ def send_hide_notification_to_author
52
+ data = {
53
+ event: "decidim.events.reports.resource_hidden",
54
+ event_class: Decidim::ResourceHiddenEvent,
55
+ resource: @reportable,
56
+ extra: {
57
+ report_reasons: report_reasons
58
+ },
59
+ affected_users: @reportable.try(:authors) || [@reportable.try(:normalized_author)]
60
+ }
61
+
62
+ Decidim::EventsManager.publish(data)
63
+ end
64
+
65
+ def report_reasons
66
+ @reportable.moderation.reports.pluck(:reason).uniq
67
+ end
47
68
  end
48
69
  end
49
70
  end
@@ -26,7 +26,8 @@ module Decidim
26
26
 
27
27
  create_authorization
28
28
 
29
- create_impersonation_log
29
+ impersonation_log = create_impersonation_log
30
+ create_action_log(impersonation_log)
30
31
  end
31
32
 
32
33
  enqueue_expire_job
@@ -60,6 +61,21 @@ module Decidim
60
61
  .set(wait: Decidim::ImpersonationLog::SESSION_TIME_IN_MINUTES.minutes)
61
62
  .perform_later(user, form.current_user)
62
63
  end
64
+
65
+ def create_action_log(impersonation_log)
66
+ Decidim.traceability.perform_action!(
67
+ "manage",
68
+ impersonation_log,
69
+ form.current_user,
70
+ resource: {
71
+ name: user.name,
72
+ id: user.id,
73
+ nickname: user.nickname
74
+ },
75
+ visibility: "admin-only",
76
+ reason: form.reason
77
+ )
78
+ end
63
79
  end
64
80
  end
65
81
  end
@@ -30,6 +30,7 @@ module Decidim
30
30
 
31
31
  promote_user
32
32
  invite_user
33
+ create_action_log
33
34
 
34
35
  broadcast(:ok)
35
36
  end
@@ -51,6 +52,15 @@ module Decidim
51
52
  def email_already_exists?
52
53
  Decidim::User.where(email: form.email.downcase).any?
53
54
  end
55
+
56
+ def create_action_log
57
+ Decidim.traceability.perform_action!(
58
+ "promote",
59
+ user,
60
+ form.current_user,
61
+ visibility: "admin-only"
62
+ )
63
+ end
54
64
  end
55
65
  end
56
66
  end
@@ -10,10 +10,12 @@ module Decidim
10
10
  # organization - the Organization where the content blocks reside
11
11
  # scope - the scope applied to the content blocks
12
12
  # order - an Array holding the order of IDs of published content blocks.
13
- def initialize(organization, scope, order)
13
+ # scoped_resource_id - (optional) The id of the resource the content blocks belongs to.
14
+ def initialize(organization, scope, order, scoped_resource_id = nil)
14
15
  @organization = organization
15
16
  @scope = scope
16
17
  @order = order
18
+ @scoped_resource_id = scoped_resource_id
17
19
  end
18
20
 
19
21
  # Executes the command. Broadcasts these events:
@@ -31,7 +33,7 @@ module Decidim
31
33
 
32
34
  private
33
35
 
34
- attr_reader :organization, :scope
36
+ attr_reader :organization, :scope, :scoped_resource_id
35
37
 
36
38
  def reorder_steps
37
39
  transaction do
@@ -78,6 +80,7 @@ module Decidim
78
80
  Decidim::ContentBlock.create!(
79
81
  organization: organization,
80
82
  scope_name: scope,
83
+ scoped_resource_id: scoped_resource_id.presence,
81
84
  weight: weight,
82
85
  manifest_name: manifest_name
83
86
  )
@@ -90,7 +93,7 @@ module Decidim
90
93
  end
91
94
 
92
95
  def collection
93
- @collection ||= Decidim::ContentBlock.for_scope(scope, organization: organization)
96
+ @collection ||= Decidim::ContentBlock.for_scope(scope, organization: organization).where(scoped_resource_id: scoped_resource_id)
94
97
  end
95
98
  end
96
99
  end
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Admin
5
+ # A command with all the business logic to transfer a managed user.
6
+ class TransferUser < Rectify::Command
7
+ # Public: Initializes the command.
8
+ #
9
+ # form
10
+ # user - The current user
11
+ # managed_user - The managed User
12
+ def initialize(form)
13
+ @form = form
14
+ end
15
+
16
+ # Executes the command. Broadcasts these events:
17
+ #
18
+ # - :ok when everything is valid.
19
+ # - :invalid if the impersonation is not valid.
20
+ #
21
+ # Returns nothing.
22
+ def call
23
+ return broadcast(:invalid) unless form.valid?
24
+
25
+ transaction do
26
+ update_managed_user
27
+ mark_conflict_as_solved
28
+ create_action_log
29
+ end
30
+
31
+ broadcast(:ok)
32
+ end
33
+
34
+ private
35
+
36
+ attr_reader :form
37
+
38
+ def new_user
39
+ form.conflict.current_user
40
+ end
41
+
42
+ def managed_user
43
+ form.conflict.managed_user
44
+ end
45
+
46
+ def current_user
47
+ form.current_user
48
+ end
49
+
50
+ def update_managed_user
51
+ clean_email_and_delete_new_user if form.email == new_user.email
52
+ managed_user.email = form.email
53
+ managed_user.encrypted_password = new_user.encrypted_password
54
+ managed_user.confirmed_at = new_user.confirmed_at
55
+ managed_user.managed = false
56
+ managed_user.skip_reconfirmation!
57
+ managed_user.save!
58
+ end
59
+
60
+ def clean_email_and_delete_new_user
61
+ new_user.update(deleted_at: Time.now.utc, email: "")
62
+ end
63
+
64
+ def mark_conflict_as_solved
65
+ form.conflict.update(solved: true)
66
+ end
67
+
68
+ def create_action_log
69
+ Decidim.traceability.perform_action!(
70
+ "transfer",
71
+ form.conflict.managed_user,
72
+ current_user,
73
+ visibility: "admin-only"
74
+ )
75
+ end
76
+ end
77
+ end
78
+ end