decidim-admin 0.31.6 → 0.32.0.rc1

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 (232) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -12
  3. data/app/cells/decidim/admin/attachments_privacy_warning/show.erb +1 -1
  4. data/app/cells/decidim/admin/attachments_privacy_warning_cell.rb +2 -6
  5. data/app/commands/decidim/admin/content_blocks/reorder_content_blocks.rb +1 -1
  6. data/app/commands/decidim/admin/create_newsletter.rb +1 -1
  7. data/app/commands/decidim/admin/create_taxonomy_filter.rb +2 -16
  8. data/app/commands/decidim/admin/participatory_space/create_member.rb +99 -0
  9. data/app/commands/decidim/admin/participatory_space/destroy_member.rb +30 -0
  10. data/app/commands/decidim/admin/participatory_space/import_member_csv.rb +46 -0
  11. data/app/commands/decidim/admin/participatory_space/publish_all_members.rb +52 -0
  12. data/app/commands/decidim/admin/participatory_space/unpublish_all_members.rb +52 -0
  13. data/app/commands/decidim/admin/participatory_space/update_member.rb +13 -0
  14. data/app/commands/decidim/admin/reorder_components.rb +1 -1
  15. data/app/commands/decidim/admin/reorder_taxonomies.rb +1 -1
  16. data/app/commands/decidim/admin/update_organization.rb +1 -1
  17. data/app/commands/decidim/admin/update_taxonomy_filter.rb +6 -24
  18. data/app/controllers/concerns/decidim/admin/content_blocks/landing_page.rb +1 -0
  19. data/app/controllers/concerns/decidim/admin/content_blocks/landing_page_content_blocks.rb +3 -2
  20. data/app/controllers/concerns/decidim/admin/filterable.rb +4 -4
  21. data/app/controllers/concerns/decidim/admin/participatory_space_admin_context.rb +1 -0
  22. data/app/controllers/concerns/decidim/admin/participatory_space_export.rb +1 -1
  23. data/app/controllers/decidim/admin/area_types_controller.rb +2 -2
  24. data/app/controllers/decidim/admin/areas_controller.rb +3 -2
  25. data/app/controllers/decidim/admin/block_user_controller.rb +2 -4
  26. data/app/controllers/decidim/admin/component_permissions_controller.rb +1 -1
  27. data/app/controllers/decidim/admin/components/base_controller.rb +13 -9
  28. data/app/controllers/decidim/admin/components_controller.rb +3 -2
  29. data/app/controllers/decidim/admin/concerns/has_attachment_collections.rb +2 -2
  30. data/app/controllers/decidim/admin/concerns/has_attachments.rb +2 -2
  31. data/app/controllers/decidim/admin/conflicts_controller.rb +1 -1
  32. data/app/controllers/decidim/admin/exports_controller.rb +1 -1
  33. data/app/controllers/decidim/admin/impersonations_controller.rb +1 -1
  34. data/app/controllers/decidim/admin/imports_controller.rb +2 -1
  35. data/app/controllers/decidim/admin/managed_users/promotions_controller.rb +1 -1
  36. data/app/controllers/decidim/admin/newsletters_controller.rb +9 -9
  37. data/app/controllers/decidim/admin/officializations_controller.rb +0 -2
  38. data/app/controllers/decidim/admin/organization_appearance_controller.rb +1 -1
  39. data/app/controllers/decidim/admin/organization_controller.rb +30 -1
  40. data/app/controllers/decidim/admin/organization_external_domain_allowlist_controller.rb +1 -1
  41. data/app/controllers/decidim/admin/participatory_space/concerns/has_members.rb +166 -0
  42. data/app/controllers/decidim/admin/participatory_space/concerns/has_members_csv_import.rb +67 -0
  43. data/app/controllers/decidim/admin/participatory_space/concerns/members_filterable.rb +36 -0
  44. data/app/controllers/decidim/admin/participatory_space/user_role_controller.rb +2 -2
  45. data/app/controllers/decidim/admin/reminders_controller.rb +1 -1
  46. data/app/controllers/decidim/admin/resource_permissions_controller.rb +1 -1
  47. data/app/controllers/decidim/admin/scope_types_controller.rb +2 -2
  48. data/app/controllers/decidim/admin/scopes_controller.rb +3 -2
  49. data/app/controllers/decidim/admin/share_tokens_controller.rb +2 -2
  50. data/app/controllers/decidim/admin/space_publications_controller.rb +2 -2
  51. data/app/controllers/decidim/admin/static_page_topics_controller.rb +2 -2
  52. data/app/controllers/decidim/admin/static_pages_controller.rb +2 -2
  53. data/app/controllers/decidim/admin/taxonomies_controller.rb +3 -3
  54. data/app/controllers/decidim/admin/taxonomy_filters_controller.rb +3 -3
  55. data/app/controllers/decidim/admin/taxonomy_items_controller.rb +3 -3
  56. data/app/controllers/decidim/admin/users_controller.rb +1 -1
  57. data/app/forms/decidim/admin/content_block_form.rb +28 -1
  58. data/app/forms/decidim/admin/organization_form.rb +0 -1
  59. data/app/forms/decidim/admin/participatory_space/member_csv_import_form.rb +33 -0
  60. data/app/forms/decidim/admin/participatory_space/member_form.rb +26 -0
  61. data/app/forms/decidim/admin/participatory_space_admin_user_form.rb +1 -1
  62. data/app/forms/decidim/admin/selective_newsletter_form.rb +7 -7
  63. data/app/forms/decidim/admin/taxonomy_filter_form.rb +10 -11
  64. data/app/helpers/decidim/admin/newsletters_helper.rb +8 -5
  65. data/app/helpers/decidim/admin/search_form_helper.rb +17 -0
  66. data/app/helpers/decidim/admin/settings_helper.rb +2 -0
  67. data/app/jobs/decidim/admin/newsletter_job.rb +2 -2
  68. data/app/jobs/decidim/admin/participatory_space/destroy_members_follows_job.rb +36 -0
  69. data/app/jobs/decidim/admin/participatory_space/import_member_csv_job.rb +29 -0
  70. data/app/packs/src/decidim/admin/admin_autocomplete.js +10 -16
  71. data/app/packs/src/decidim/admin/controllers/access_mode/access_mode.test.js +68 -0
  72. data/app/packs/src/decidim/admin/controllers/access_mode/controller.js +52 -0
  73. data/app/packs/src/decidim/admin/newsletters.js +2 -2
  74. data/app/packs/stylesheets/decidim/admin/_datepicker.scss +0 -4
  75. data/app/packs/stylesheets/decidim/admin/application.scss +1 -1
  76. data/app/queries/decidim/admin/newsletter_recipients.rb +8 -8
  77. data/app/views/decidim/admin/admin_terms/show.html.erb +3 -1
  78. data/app/views/decidim/admin/area_types/index.html.erb +3 -2
  79. data/app/views/decidim/admin/areas/index.html.erb +3 -2
  80. data/app/views/decidim/admin/attachment_collections/edit.html.erb +2 -2
  81. data/app/views/decidim/admin/attachment_collections/index.html.erb +3 -3
  82. data/app/views/decidim/admin/attachment_collections/new.html.erb +2 -2
  83. data/app/views/decidim/admin/attachments/index.html.erb +3 -2
  84. data/app/views/decidim/admin/authorization_workflows/index.html.erb +2 -2
  85. data/app/views/decidim/admin/block_user/new.html.erb +1 -0
  86. data/app/views/decidim/admin/components/_actions.html.erb +1 -1
  87. data/app/views/decidim/admin/components/index.html.erb +2 -2
  88. data/app/views/decidim/admin/components/manage_trash.html.erb +2 -2
  89. data/app/views/decidim/admin/conflicts/edit.html.erb +3 -1
  90. data/app/views/decidim/admin/conflicts/index.html.erb +3 -2
  91. data/app/views/decidim/admin/dashboard/show.html.erb +4 -4
  92. data/app/views/decidim/admin/help_sections/update.html.erb +2 -0
  93. data/app/views/decidim/admin/impersonatable_users/index.html.erb +3 -2
  94. data/app/views/decidim/admin/impersonations/_form.html.erb +2 -2
  95. data/app/views/decidim/admin/impersonations/new.html.erb +3 -2
  96. data/app/views/decidim/admin/imports/new.html.erb +1 -0
  97. data/app/views/decidim/admin/logs/_logs_list.html.erb +1 -1
  98. data/app/views/decidim/admin/logs/index.html.erb +1 -1
  99. data/app/views/decidim/admin/managed_users/impersonation_logs/index.html.erb +6 -5
  100. data/app/views/decidim/admin/managed_users/promotions/new.html.erb +3 -2
  101. data/app/views/decidim/admin/{participatory_space_private_users → members}/edit.html.erb +2 -2
  102. data/app/views/decidim/admin/{participatory_space_private_users → members}/index.html.erb +25 -25
  103. data/app/views/decidim/admin/{participatory_space_private_users → members}/new.html.erb +2 -2
  104. data/app/views/decidim/admin/{participatory_space_private_users_csv_imports → members_csv_imports}/new.html.erb +2 -2
  105. data/app/views/decidim/admin/moderations/_moderation-tr.html.erb +3 -7
  106. data/app/views/decidim/admin/moderations/_moderations-thead.html.erb +0 -1
  107. data/app/views/decidim/admin/moderations/reports/index.html.erb +1 -1
  108. data/app/views/decidim/admin/newsletter_templates/show.html.erb +3 -2
  109. data/app/views/decidim/admin/newsletters/confirm_recipients.html.erb +4 -6
  110. data/app/views/decidim/admin/newsletters/index.html.erb +2 -2
  111. data/app/views/decidim/admin/newsletters/select_recipients_to_deliver.html.erb +2 -2
  112. data/app/views/decidim/admin/newsletters/show.html.erb +3 -2
  113. data/app/views/decidim/admin/officializations/index.html.erb +6 -4
  114. data/app/views/decidim/admin/officializations/show_email.html.erb +3 -7
  115. data/app/views/decidim/admin/organization/form/_extra_features.html.erb +0 -4
  116. data/app/views/decidim/admin/organization_external_domain_allowlist/_form.html.erb +2 -2
  117. data/app/views/decidim/admin/organization_external_domain_allowlist/edit.html.erb +2 -2
  118. data/app/views/decidim/admin/reminders/new.html.erb +8 -1
  119. data/app/views/decidim/admin/resource_permissions/edit.html.erb +2 -2
  120. data/app/views/decidim/admin/scope_types/index.html.erb +3 -2
  121. data/app/views/decidim/admin/scopes/index.html.erb +2 -2
  122. data/app/views/decidim/admin/share_tokens/index.html.erb +2 -0
  123. data/app/views/decidim/admin/shared/_gallery.html.erb +15 -0
  124. data/app/views/decidim/admin/shared/landing_page/_content_blocks.html.erb +0 -2
  125. data/app/views/decidim/admin/shared/landing_page/edit.html.erb +2 -0
  126. data/app/views/decidim/admin/shared/landing_page_content_blocks/edit.html.erb +1 -0
  127. data/app/views/decidim/admin/static_page_topics/index.html.erb +2 -2
  128. data/app/views/decidim/admin/static_pages/edit.html.erb +2 -1
  129. data/app/views/decidim/admin/static_pages/index.html.erb +2 -2
  130. data/app/views/decidim/admin/statistics/_statistics.html.erb +1 -1
  131. data/app/views/decidim/admin/statistics/index.html.erb +2 -0
  132. data/app/views/decidim/admin/taxonomies/_row.html.erb +1 -1
  133. data/app/views/decidim/admin/taxonomies/_row_children.html.erb +1 -1
  134. data/app/views/decidim/admin/taxonomies/_table.html.erb +1 -1
  135. data/app/views/decidim/admin/taxonomies/edit.html.erb +2 -2
  136. data/app/views/decidim/admin/taxonomies/index.html.erb +4 -4
  137. data/app/views/decidim/admin/taxonomy_filters/_table.html.erb +2 -2
  138. data/app/views/decidim/admin/taxonomy_filters/index.html.erb +2 -2
  139. data/app/views/decidim/admin/taxonomy_filters_selector/index.html.erb +2 -0
  140. data/app/views/decidim/admin/taxonomy_filters_selector/new.html.erb +2 -0
  141. data/app/views/decidim/admin/taxonomy_filters_selector/show.html.erb +2 -0
  142. data/app/views/decidim/admin/taxonomy_items/edit.html.erb +2 -0
  143. data/app/views/decidim/admin/taxonomy_items/new.html.erb +2 -0
  144. data/app/views/decidim/admin/users/index.html.erb +3 -2
  145. data/app/views/layouts/decidim/admin/_application.html.erb +1 -1
  146. data/config/locales/ar.yml +9 -49
  147. data/config/locales/bg.yml +9 -55
  148. data/config/locales/bs-BA.yml +4 -24
  149. data/config/locales/ca-IT.yml +130 -113
  150. data/config/locales/ca.yml +130 -113
  151. data/config/locales/cs.yml +126 -107
  152. data/config/locales/de.yml +114 -98
  153. data/config/locales/el.yml +17 -45
  154. data/config/locales/en.yml +130 -112
  155. data/config/locales/eo.yml +0 -7
  156. data/config/locales/es-MX.yml +130 -113
  157. data/config/locales/es-PY.yml +130 -113
  158. data/config/locales/es.yml +130 -113
  159. data/config/locales/eu.yml +159 -142
  160. data/config/locales/fi-plain.yml +129 -112
  161. data/config/locales/fi.yml +129 -112
  162. data/config/locales/fr-CA.yml +91 -142
  163. data/config/locales/fr.yml +91 -142
  164. data/config/locales/ga-IE.yml +0 -13
  165. data/config/locales/gl.yml +10 -41
  166. data/config/locales/he-IL.yml +1 -5
  167. data/config/locales/hu.yml +10 -52
  168. data/config/locales/id-ID.yml +4 -34
  169. data/config/locales/is-IS.yml +1 -16
  170. data/config/locales/it.yml +8 -69
  171. data/config/locales/ja.yml +129 -114
  172. data/config/locales/kaa.yml +4 -16
  173. data/config/locales/ko.yml +6 -40
  174. data/config/locales/lb.yml +9 -41
  175. data/config/locales/lt.yml +10 -52
  176. data/config/locales/lv.yml +8 -38
  177. data/config/locales/nl.yml +10 -46
  178. data/config/locales/no.yml +10 -46
  179. data/config/locales/pl.yml +9 -54
  180. data/config/locales/pt-BR.yml +121 -104
  181. data/config/locales/pt.yml +9 -42
  182. data/config/locales/ro-RO.yml +15 -51
  183. data/config/locales/ru.yml +4 -35
  184. data/config/locales/sk.yml +8 -814
  185. data/config/locales/sl.yml +1 -7
  186. data/config/locales/sq-AL.yml +1 -21
  187. data/config/locales/sr-CS.yml +4 -24
  188. data/config/locales/sv.yml +79 -89
  189. data/config/locales/th-TH.yml +0 -8
  190. data/config/locales/tr-TR.yml +33 -65
  191. data/config/locales/uk.yml +0 -26
  192. data/config/locales/val-ES.yml +0 -1
  193. data/config/locales/zh-CN.yml +9 -38
  194. data/config/locales/zh-TW.yml +10 -52
  195. data/config/routes.rb +4 -0
  196. data/decidim-admin.gemspec +7 -10
  197. data/lib/decidim/admin/engine.rb +5 -2
  198. data/lib/decidim/admin/form_builder.rb +3 -1
  199. data/lib/decidim/admin/menu.rb +1 -1
  200. data/lib/decidim/admin/test/admin_members_shared_examples.rb +119 -0
  201. data/lib/decidim/admin/test/admin_participatory_space_access_examples.rb +3 -3
  202. data/lib/decidim/admin/test/filterable_examples.rb +20 -11
  203. data/lib/decidim/admin/test/invite_participatory_space_admins_shared_examples.rb +17 -17
  204. data/lib/decidim/admin/test/invite_participatory_space_collaborators_shared_examples.rb +1 -1
  205. data/lib/decidim/admin/test/invite_participatory_space_moderators_shared_examples.rb +1 -1
  206. data/lib/decidim/admin/test/invite_participatory_space_users_shared_context.rb +1 -1
  207. data/lib/decidim/admin/test/manage_attachment_collections_examples.rb +3 -3
  208. data/lib/decidim/admin/test/manage_attachments_examples.rb +6 -6
  209. data/lib/decidim/admin/test/manage_component_permissions_examples.rb +5 -5
  210. data/lib/decidim/admin/test/manage_moderations_examples.rb +6 -6
  211. data/lib/decidim/admin/test/manage_participatory_space_publications_examples.rb +2 -2
  212. data/lib/decidim/admin/test/manage_resource_soft_deletion_examples.rb +3 -3
  213. data/lib/decidim/admin/version.rb +1 -1
  214. data/lib/decidim/admin.rb +0 -2
  215. metadata +40 -36
  216. data/app/commands/decidim/admin/create_participatory_space_private_user.rb +0 -98
  217. data/app/commands/decidim/admin/destroy_participatory_space_private_user.rb +0 -28
  218. data/app/commands/decidim/admin/process_participatory_space_private_user_import_csv.rb +0 -44
  219. data/app/commands/decidim/admin/publish_all_participatory_space_private_users.rb +0 -50
  220. data/app/commands/decidim/admin/unpublish_all_participatory_space_private_users.rb +0 -50
  221. data/app/commands/decidim/admin/update_participatory_space_private_user.rb +0 -11
  222. data/app/controllers/concerns/decidim/participatory_space_private_users/admin/filterable.rb +0 -34
  223. data/app/controllers/decidim/admin/concerns/has_private_users.rb +0 -169
  224. data/app/controllers/decidim/admin/concerns/has_private_users_csv_import.rb +0 -65
  225. data/app/forms/decidim/admin/participatory_space_private_user_csv_import_form.rb +0 -31
  226. data/app/forms/decidim/admin/participatory_space_private_user_form.rb +0 -24
  227. data/app/jobs/decidim/admin/destroy_private_users_follows_job.rb +0 -37
  228. data/app/jobs/decidim/admin/import_participatory_space_private_user_csv_job.rb +0 -27
  229. data/app/views/decidim/admin/devise/mailers/password_change.html.erb +0 -3
  230. data/app/views/decidim/admin/devise/mailers/reset_password_instructions.html.erb +0 -8
  231. data/app/views/decidim/admin/shared/_attachments.html.erb +0 -15
  232. /data/app/views/decidim/admin/{participatory_space_private_users → members}/_form.html.erb +0 -0
@@ -10,6 +10,7 @@ module Decidim
10
10
 
11
11
  include Decidim::Admin::ParticipatorySpaceAdminContext
12
12
  include Decidim::NeedsPermission
13
+
13
14
  participatory_space_admin_layout
14
15
 
15
16
  helper Decidim::ResourceHelper
@@ -23,15 +24,9 @@ module Decidim
23
24
  :current_participatory_space,
24
25
  :parent_path
25
26
 
26
- before_action except: [:index, :show] do
27
- enforce_permission_to :manage, :component, component: current_component unless skip_manage_component_permission
28
- end
29
-
30
- before_action on: [:index, :show] do
31
- enforce_permission_to :read, :component, component: current_component
32
- end
27
+ before_action :enforce_component_permissions
33
28
 
34
- before_action :set_component_breadcrumb_item
29
+ before_action :set_breadcrumb_items
35
30
 
36
31
  def permissions_context
37
32
  super.merge(
@@ -68,7 +63,16 @@ module Decidim
68
63
  false
69
64
  end
70
65
 
71
- def set_component_breadcrumb_item
66
+ def enforce_component_permissions
67
+ case action_name.to_sym
68
+ when :index, :show
69
+ enforce_permission_to :read, :component, component: current_component
70
+ else
71
+ enforce_permission_to :manage, :component, component: current_component unless skip_manage_component_permission
72
+ end
73
+ end
74
+
75
+ def set_breadcrumb_items
72
76
  context_breadcrumb_items << {
73
77
  label: t("components", scope: "decidim.admin.menu"),
74
78
  url: parent_path,
@@ -7,6 +7,7 @@ module Decidim
7
7
  #
8
8
  class ComponentsController < Decidim::Admin::ApplicationController
9
9
  include Decidim::Admin::HasTrashableResources
10
+
10
11
  helper_method :manifest
11
12
 
12
13
  def index
@@ -47,7 +48,7 @@ module Decidim
47
48
 
48
49
  on(:invalid) do
49
50
  flash.now[:alert] = I18n.t("components.create.error", scope: "decidim.admin")
50
- render action: "new", status: :unprocessable_entity
51
+ render action: "new", status: :unprocessable_content
51
52
  end
52
53
  end
53
54
  end
@@ -74,7 +75,7 @@ module Decidim
74
75
 
75
76
  on(:invalid) do
76
77
  flash[:alert] = I18n.t("components.update.error", scope: "decidim.admin")
77
- render action: :edit, status: :unprocessable_entity
78
+ render action: :edit, status: :unprocessable_content
78
79
  end
79
80
  end
80
81
  end
@@ -39,7 +39,7 @@ module Decidim
39
39
 
40
40
  on(:invalid) do
41
41
  flash.now[:alert] = I18n.t("attachment_collections.create.error", scope: "decidim.admin")
42
- render template: "decidim/admin/attachment_collections/new", status: :unprocessable_entity
42
+ render template: "decidim/admin/attachment_collections/new", status: :unprocessable_content
43
43
  end
44
44
  end
45
45
  end
@@ -64,7 +64,7 @@ module Decidim
64
64
 
65
65
  on(:invalid) do
66
66
  flash.now[:alert] = I18n.t("attachment_collections.update.error", scope: "decidim.admin")
67
- render template: "decidim/admin/attachment_collections/edit", status: :unprocessable_entity
67
+ render template: "decidim/admin/attachment_collections/edit", status: :unprocessable_content
68
68
  end
69
69
  end
70
70
  end
@@ -39,7 +39,7 @@ module Decidim
39
39
 
40
40
  on(:invalid) do
41
41
  flash.now[:alert] = I18n.t("attachments.create.error", scope: "decidim.admin")
42
- render template: "decidim/admin/attachments/new", status: :unprocessable_entity
42
+ render template: "decidim/admin/attachments/new", status: :unprocessable_content
43
43
  end
44
44
  end
45
45
  end
@@ -64,7 +64,7 @@ module Decidim
64
64
 
65
65
  on(:invalid) do
66
66
  flash.now[:alert] = I18n.t("attachments.update.error", scope: "decidim.admin")
67
- render template: "decidim/admin/attachments/edit", status: :unprocessable_entity
67
+ render template: "decidim/admin/attachments/edit", status: :unprocessable_content
68
68
  end
69
69
  end
70
70
  end
@@ -47,7 +47,7 @@ module Decidim
47
47
 
48
48
  on(:invalid) do
49
49
  flash.now[:alert] = I18n.t("error", scope: "decidim.admin.conflicts.transfer")
50
- render action: "edit", status: :unprocessable_entity
50
+ render action: "edit", status: :unprocessable_content
51
51
  end
52
52
  end
53
53
  end
@@ -15,7 +15,7 @@ module Decidim
15
15
 
16
16
  flash[:notice] = t("decidim.admin.exports.notice")
17
17
 
18
- redirect_back(fallback_location: manage_component_path(component))
18
+ redirect_back_or_to(manage_component_path(component))
19
19
  end
20
20
 
21
21
  private
@@ -46,7 +46,7 @@ module Decidim
46
46
 
47
47
  on(:invalid) do
48
48
  flash.now[:alert] = I18n.t("impersonations.create.error", scope: "decidim.admin")
49
- render :new, status: :unprocessable_entity
49
+ render :new, status: :unprocessable_content
50
50
  end
51
51
  end
52
52
  end
@@ -5,6 +5,7 @@ module Decidim
5
5
  # This controller allows admins to import resources from a file.
6
6
  class ImportsController < Decidim::Admin::ApplicationController
7
7
  include Decidim::ComponentPathHelper
8
+
8
9
  before_action :set_import_breadcrumb_item
9
10
 
10
11
  helper_method :import_manifest
@@ -39,7 +40,7 @@ module Decidim
39
40
 
40
41
  on(:invalid) do
41
42
  flash.now[:alert] = t("decidim.admin.imports.error")
42
- render :new, status: :unprocessable_entity
43
+ render :new, status: :unprocessable_content
43
44
  end
44
45
  end
45
46
  end
@@ -25,7 +25,7 @@ module Decidim
25
25
 
26
26
  on(:invalid) do
27
27
  flash.now[:alert] = I18n.t("managed_users.promotion.error", scope: "decidim.admin")
28
- render :new, status: :unprocessable_entity
28
+ render :new, status: :unprocessable_content
29
29
  end
30
30
  end
31
31
  end
@@ -7,6 +7,7 @@ module Decidim
7
7
  include Decidim::NewslettersHelper
8
8
  include Decidim::Admin::NewslettersHelper
9
9
  include Paginable
10
+
10
11
  helper_method :newsletter, :recipients_count_query, :content_block, :selected_options, :newsletter_params
11
12
 
12
13
  def index
@@ -31,7 +32,7 @@ module Decidim
31
32
  NewsletterMailer.newsletter(current_user, newsletter).deliver_later
32
33
  flash[:notice] = I18n.t("newsletters.send_to_user.sent_successfully", scope: "decidim.admin", email: current_user.email)
33
34
 
34
- redirect_back fallback_location: newsletters_path
35
+ redirect_back_or_to(newsletters_path)
35
36
  end
36
37
 
37
38
  def preview
@@ -44,7 +45,7 @@ module Decidim
44
45
 
45
46
  def create
46
47
  enforce_permission_to :create, :newsletter
47
- @form = form(NewsletterForm).from_params(params)
48
+ @form = form(NewsletterForm).from_params(params, content_block:)
48
49
  @form.images = images_block_context unless has_images_block_context?
49
50
 
50
51
  CreateNewsletter.call(@form, content_block) do
@@ -55,9 +56,8 @@ module Decidim
55
56
 
56
57
  on(:invalid) do |newsletter|
57
58
  @newsletter = newsletter
58
- @form.images = content_block.images_container
59
59
  flash.now[:error] = I18n.t("newsletters.create.error", scope: "decidim.admin")
60
- render action: :new, status: :unprocessable_entity
60
+ render action: :new, status: :unprocessable_content
61
61
  end
62
62
  end
63
63
  end
@@ -69,7 +69,7 @@ module Decidim
69
69
 
70
70
  def update
71
71
  enforce_permission_to(:update, :newsletter, newsletter:)
72
- @form = form(NewsletterForm).from_params(params)
72
+ @form = form(NewsletterForm).from_params(params, content_block:)
73
73
  @form.images = images_block_context unless has_images_block_context?
74
74
 
75
75
  UpdateNewsletter.call(newsletter, @form) do
@@ -81,7 +81,7 @@ module Decidim
81
81
  on(:invalid) do |newsletter|
82
82
  @newsletter = newsletter
83
83
  flash.now[:error] = I18n.t("newsletters.update.error", scope: "decidim.admin")
84
- render action: :edit, status: :unprocessable_entity
84
+ render action: :edit, status: :unprocessable_content
85
85
  end
86
86
  end
87
87
  end
@@ -129,12 +129,12 @@ module Decidim
129
129
 
130
130
  on(:invalid) do
131
131
  flash.now[:error] = I18n.t("newsletters.deliver.error", scope: "decidim.admin")
132
- render action: :select_recipients_to_deliver, status: :unprocessable_entity
132
+ render action: :select_recipients_to_deliver, status: :unprocessable_content
133
133
  end
134
134
 
135
135
  on(:no_recipients) do
136
136
  flash.now[:error] = I18n.t("newsletters.send.no_recipients", scope: "decidim.admin")
137
- render action: :select_recipients_to_deliver, status: :unprocessable_entity
137
+ render action: :select_recipients_to_deliver, status: :unprocessable_content
138
138
  end
139
139
  end
140
140
  end
@@ -156,7 +156,7 @@ module Decidim
156
156
  :send_to_verified_users,
157
157
  :send_to_followers,
158
158
  :send_to_participants,
159
- :send_to_private_members,
159
+ :send_to_members,
160
160
  verification_types: [],
161
161
  participatory_space_types: {
162
162
  assemblies: [:manifest_name, { ids: [] }],
@@ -22,8 +22,6 @@ module Decidim
22
22
  def new
23
23
  enforce_permission_to :create, :officialization
24
24
 
25
- return redirect_to(officializations_path, alert: I18n.t("officializations.create.no_user_found", scope: "decidim.admin")) unless user
26
-
27
25
  @form = form(OfficializationForm).from_model(user)
28
26
  end
29
27
 
@@ -25,7 +25,7 @@ module Decidim
25
25
 
26
26
  on(:invalid) do
27
27
  flash.now[:alert] = I18n.t("organization.update.error", scope: "decidim.admin")
28
- render :edit, status: :unprocessable_entity
28
+ render :edit, status: :unprocessable_content
29
29
  end
30
30
  end
31
31
  end
@@ -29,7 +29,36 @@ module Decidim
29
29
 
30
30
  on(:invalid) do
31
31
  flash.now[:alert] = I18n.t("organization.update.error", scope: "decidim.admin")
32
- render :edit, status: :unprocessable_entity
32
+ render :edit, status: :unprocessable_content
33
+ end
34
+ end
35
+ end
36
+
37
+ def users
38
+ search(current_organization.users.available)
39
+ end
40
+
41
+ private
42
+
43
+ def search(relation)
44
+ respond_to do |format|
45
+ format.json do
46
+ if (term = params[:term].to_s).present?
47
+ query = if term.start_with?("@")
48
+ nickname = term.delete("@")
49
+ relation.where("nickname LIKE ?", "#{nickname}%")
50
+ .order(Arel.sql(ActiveRecord::Base.sanitize_sql_array("similarity(nickname, '#{nickname}') DESC")))
51
+ else
52
+ relation.where("name ILIKE ?", "%#{term}%").or(
53
+ relation.where("email ILIKE ?", "%#{term}%")
54
+ )
55
+ .order(Arel.sql(ActiveRecord::Base.sanitize_sql_array("GREATEST(similarity(name, '#{term}'), similarity(email, '#{term}')) DESC")))
56
+ .order(Arel.sql(ActiveRecord::Base.sanitize_sql_array("(similarity(name, '#{term}') + similarity(email, '#{term}')) / 2 DESC")))
57
+ end
58
+ render json: query.all.collect { |u| { value: u.id, label: "#{u.name} (@#{u.nickname})" } }
59
+ else
60
+ render json: []
61
+ end
33
62
  end
34
63
  end
35
64
  end
@@ -25,7 +25,7 @@ module Decidim
25
25
  end
26
26
  on(:invalid) do
27
27
  flash[:notice] = t("domain_allowlist.update.error", scope: "decidim.admin")
28
- render action: "edit", status: :unprocessable_entity
28
+ render action: "edit", status: :unprocessable_content
29
29
  end
30
30
  end
31
31
  end
@@ -0,0 +1,166 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Admin
5
+ module ParticipatorySpace
6
+ module Concerns
7
+ # Members can be related to any ParticipatorySpace, in order to
8
+ # manage the members for a given type, you should create a new
9
+ # controller and include this concern.
10
+ #
11
+ # It takes the current_participatory_space that is defined
12
+ # in the controller, so there is no need to define any method
13
+ module HasMembers
14
+ extend ActiveSupport::Concern
15
+
16
+ included do
17
+ include Decidim::Admin::ParticipatorySpace::Concerns::MembersFilterable
18
+
19
+ helper PaginateHelper
20
+ helper_method :members
21
+
22
+ # rubocop:disable Rails/LexicallyScopedActionFilter
23
+ before_action :set_member, only: [:edit, :update, :destroy, :resend_invitation]
24
+ # rubocop:enable Rails/LexicallyScopedActionFilter
25
+
26
+ def index
27
+ enforce_permission_to :read, :space_member
28
+
29
+ render template: "decidim/admin/members/index"
30
+ end
31
+
32
+ def new
33
+ enforce_permission_to :create, :space_member
34
+ @form = form(MemberForm).from_params({})
35
+ render template: "decidim/admin/members/new"
36
+ end
37
+
38
+ def edit
39
+ enforce_permission_to :update, :space_member, member: @member
40
+ @form = form(MemberForm).from_model(@member)
41
+ render template: "decidim/admin/members/edit"
42
+ end
43
+
44
+ def update
45
+ enforce_permission_to :update, :space_member, member: @member
46
+ @form = form(MemberForm).from_params(params)
47
+
48
+ UpdateMember.call(@form, @member) do
49
+ on(:ok) do
50
+ flash[:notice] = I18n.t("members.update.success", scope: "decidim.admin")
51
+ redirect_to action: :index
52
+ end
53
+
54
+ on(:invalid) do
55
+ flash.now[:alert] = I18n.t("members.update.error", scope: "decidim.admin")
56
+ render template: "decidim/admin/members/edit", status: :unprocessable_content
57
+ end
58
+ end
59
+ end
60
+
61
+ def create
62
+ enforce_permission_to :create, :space_member
63
+ @form = form(MemberForm).from_params(params)
64
+
65
+ CreateMember.call(@form, current_participatory_space) do
66
+ on(:ok) do
67
+ flash[:notice] = I18n.t("members.create.success", scope: "decidim.admin")
68
+ redirect_to action: :index
69
+ end
70
+
71
+ on(:invalid) do
72
+ flash.now[:alert] = I18n.t("members.create.error", scope: "decidim.admin")
73
+ render template: "decidim/admin/members/new", status: :unprocessable_content
74
+ end
75
+ end
76
+ end
77
+
78
+ def destroy
79
+ enforce_permission_to :destroy, :space_member, member: @member
80
+
81
+ DestroyMember.call(@member, current_user) do
82
+ on(:ok) do
83
+ flash[:notice] = I18n.t("members.destroy.success", scope: "decidim.admin")
84
+ redirect_to after_destroy_path
85
+ end
86
+
87
+ on(:invalid) do
88
+ flash.now[:alert] = I18n.t("members.destroy.error", scope: "decidim.admin")
89
+ render template: "decidim/admin/members/index", status: :unprocessable_content
90
+ end
91
+ end
92
+ end
93
+
94
+ def resend_invitation
95
+ enforce_permission_to :invite, :space_member, member: @member
96
+ InviteUserAgain.call(@member.user, "invite_member") do
97
+ on(:ok) do
98
+ flash[:notice] = I18n.t("users.resend_invitation.success", scope: "decidim.admin")
99
+ end
100
+
101
+ on(:invalid) do
102
+ flash[:alert] = I18n.t("users.resend_invitation.error", scope: "decidim.admin")
103
+ end
104
+ end
105
+
106
+ redirect_to after_destroy_path
107
+ end
108
+
109
+ def publish_all
110
+ PublishAllMembers.call(current_participatory_space, current_user) do
111
+ on(:ok) do
112
+ flash[:notice] = I18n.t("members.publish_all.success", scope: "decidim.admin")
113
+ redirect_to action: :index
114
+ end
115
+
116
+ on(:invalid) do
117
+ flash[:alert] = I18n.t("members.publish_all.error", scope: "decidim.admin")
118
+ redirect_to action: :index
119
+ end
120
+ end
121
+ end
122
+
123
+ def unpublish_all
124
+ UnpublishAllMembers.call(current_participatory_space, current_user) do
125
+ on(:ok) do
126
+ flash[:notice] = I18n.t("members.unpublish_all.success", scope: "decidim.admin")
127
+ redirect_to action: :index
128
+ end
129
+
130
+ on(:invalid) do
131
+ flash[:alert] = I18n.t("members.unpublish_all.error", scope: "decidim.admin")
132
+ redirect_to action: :index
133
+ end
134
+ end
135
+ end
136
+
137
+ # Public: Returns a String or Object that will be passed to `redirect_to` after
138
+ # destroying a member. By default it redirects to the participatory_space.
139
+ #
140
+ # It can be redefined at controller level if you need to redirect elsewhere.
141
+ def after_destroy_path
142
+ members_path(current_participatory_space)
143
+ end
144
+
145
+ def collection
146
+ # there is an unidentified corner case where Decidim::User
147
+ # may have been destroyed, but the related Member
148
+ # remains in the database. That is why filtering by not null users
149
+ @collection ||= current_participatory_space
150
+ .members
151
+ .includes(:user).where.not("decidim_users.id" => nil)
152
+ end
153
+
154
+ def members
155
+ filtered_collection
156
+ end
157
+
158
+ def set_member
159
+ @member = collection.find(params[:id])
160
+ end
161
+ end
162
+ end
163
+ end
164
+ end
165
+ end
166
+ end
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Admin
5
+ module ParticipatorySpace
6
+ module Concerns
7
+ # Members can be related to any ParticipatorySpace, in order to
8
+ # import members from csv for a given type, you should create a new
9
+ # controller and include this concern.
10
+ #
11
+ # The only requirement is to define a `participatory_space` method that
12
+ # returns an instance of the model to relate the member to.
13
+ module HasMembersCsvImport
14
+ extend ActiveSupport::Concern
15
+
16
+ included do
17
+ helper_method :participatory_space
18
+
19
+ def new
20
+ enforce_permission_to :csv_import, :space_member
21
+ @form = form(MemberCsvImportForm).from_params({}, participatory_space:)
22
+ @count = Decidim::ParticipatorySpace::Member.by_participatory_space(participatory_space).count
23
+ render template: "decidim/admin/members_csv_imports/new"
24
+ end
25
+
26
+ def create
27
+ enforce_permission_to :csv_import, :space_member
28
+ @form = form(MemberCsvImportForm).from_params(params, participatory_space:)
29
+
30
+ ImportMemberCsv.call(@form, current_participatory_space) do
31
+ on(:ok) do
32
+ flash[:notice] = I18n.t("members_csv_imports.create.success", scope: "decidim.admin")
33
+ redirect_to after_import_path
34
+ end
35
+
36
+ on(:invalid) do
37
+ flash[:alert] = I18n.t("members_csv_imports.create.invalid", scope: "decidim.admin")
38
+ render template: "decidim/admin/members_csv_imports/new", status: :unprocessable_content
39
+ end
40
+ end
41
+ end
42
+
43
+ def destroy_all
44
+ enforce_permission_to :csv_import, :space_member
45
+ Decidim::ParticipatorySpace::Member.by_participatory_space(participatory_space).delete_all
46
+ redirect_to new_members_csv_imports_path
47
+ end
48
+
49
+ # Public: Returns a String or Object that will be passed to `redirect_to` after
50
+ # importing members. By default it redirects to the participatory_space.
51
+ #
52
+ # It can be redefined at controller level if you need to redirect elsewhere.
53
+ def after_import_path
54
+ participatory_space
55
+ end
56
+
57
+ # Public: The only method to be implemented at the controller. You need to
58
+ # return the object where the attachment will be attached to.
59
+ def participatory_space
60
+ raise NotImplementedError
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/concern"
4
+
5
+ module Decidim
6
+ module Admin
7
+ module ParticipatorySpace
8
+ module Concerns
9
+ module MembersFilterable
10
+ extend ActiveSupport::Concern
11
+
12
+ included do
13
+ include Decidim::Admin::Filterable
14
+
15
+ private
16
+
17
+ def base_query
18
+ collection
19
+ end
20
+
21
+ def filters
22
+ [
23
+ :user_invitation_sent_at_not_null,
24
+ :user_invitation_accepted_at_not_null
25
+ ]
26
+ end
27
+
28
+ def search_field_predicate
29
+ :user_name_or_user_email_cont
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -38,7 +38,7 @@ module Decidim
38
38
 
39
39
  on(:invalid) do
40
40
  flash[:alert] = I18n.t("create.error", scope: i18n_scope)
41
- render :new, status: :unprocessable_entity
41
+ render :new, status: :unprocessable_content
42
42
  end
43
43
  end
44
44
  end
@@ -56,7 +56,7 @@ module Decidim
56
56
 
57
57
  on(:invalid) do
58
58
  flash.now[:alert] = I18n.t("update.error", scope: i18n_scope)
59
- render :edit, status: :unprocessable_entity
59
+ render :edit, status: :unprocessable_content
60
60
  end
61
61
  end
62
62
  end
@@ -27,7 +27,7 @@ module Decidim
27
27
 
28
28
  on(:invalid) do
29
29
  flash.now[:alert] = t("decidim.admin.reminders.create.error")
30
- render :new, status: :unprocessable_entity
30
+ render :new, status: :unprocessable_content
31
31
  end
32
32
  end
33
33
  end
@@ -25,7 +25,7 @@ module Decidim
25
25
  end
26
26
 
27
27
  on(:invalid) do
28
- render action: :edit, status: :unprocessable_entity
28
+ render action: :edit, status: :unprocessable_content
29
29
  end
30
30
  end
31
31
  end
@@ -34,7 +34,7 @@ module Decidim
34
34
 
35
35
  on(:invalid) do
36
36
  flash.now[:alert] = I18n.t("scope_types.create.error", scope: "decidim.admin")
37
- render :new, status: :unprocessable_entity
37
+ render :new, status: :unprocessable_content
38
38
  end
39
39
  end
40
40
  end
@@ -56,7 +56,7 @@ module Decidim
56
56
 
57
57
  on(:invalid) do
58
58
  flash.now[:alert] = I18n.t("scope_types.update.error", scope: "decidim.admin")
59
- render :edit, status: :unprocessable_entity
59
+ render :edit, status: :unprocessable_content
60
60
  end
61
61
  end
62
62
  end
@@ -6,6 +6,7 @@ module Decidim
6
6
  #
7
7
  class ScopesController < Decidim::Admin::ApplicationController
8
8
  include Decidim::Admin::Concerns::HasTabbedMenu
9
+
9
10
  helper Decidim::Admin::ScopesHelper
10
11
 
11
12
  layout "decidim/admin/settings"
@@ -36,7 +37,7 @@ module Decidim
36
37
 
37
38
  on(:invalid) do
38
39
  flash.now[:alert] = I18n.t("scopes.create.error", scope: "decidim.admin")
39
- render :new, status: :unprocessable_entity
40
+ render :new, status: :unprocessable_content
40
41
  end
41
42
  end
42
43
  end
@@ -58,7 +59,7 @@ module Decidim
58
59
 
59
60
  on(:invalid) do
60
61
  flash.now[:alert] = I18n.t("scopes.update.error", scope: "decidim.admin")
61
- render :edit, status: :unprocessable_entity
62
+ render :edit, status: :unprocessable_content
62
63
  end
63
64
  end
64
65
  end