decidim-admin 0.23.3 → 0.24.1

Sign up to get free protection for your applications and to get access to all the features.

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