decidim-core 0.29.5 → 0.30.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 (595) hide show
  1. checksums.yaml +4 -4
  2. data/app/cells/decidim/activity/show.erb +6 -6
  3. data/app/cells/decidim/address/show.erb +3 -3
  4. data/app/cells/decidim/amendable/amend_button_card/show.erb +6 -4
  5. data/app/cells/decidim/amendable/amend_button_card_cell.rb +8 -0
  6. data/app/cells/decidim/amendable/amendments/show.erb +1 -1
  7. data/app/cells/decidim/amendable/promote_button_card/show.erb +2 -0
  8. data/app/cells/decidim/author/flag.erb +6 -0
  9. data/app/cells/decidim/author/flag_user.erb +14 -0
  10. data/app/cells/decidim/author/show.erb +4 -2
  11. data/app/cells/decidim/author_cell.rb +1 -1
  12. data/app/cells/decidim/card_l/extra_data.erb +1 -0
  13. data/app/cells/decidim/card_metadata_cell.rb +9 -16
  14. data/app/cells/decidim/comments_button_cell.rb +14 -2
  15. data/app/cells/decidim/content_blocks/highlighted_elements_cell.rb +2 -0
  16. data/app/cells/decidim/content_blocks/highlighted_elements_with_cell_for_list_cell.rb +1 -1
  17. data/app/cells/decidim/content_blocks/participatory_space_extra_data/extra_data.erb +2 -2
  18. data/app/cells/decidim/content_blocks/participatory_space_main_data/title.erb +2 -11
  19. data/app/cells/decidim/endorsement_block/show.erb +0 -1
  20. data/app/cells/decidim/endorsement_block_cell.rb +6 -0
  21. data/app/cells/decidim/endorsement_buttons/button_content.erb +1 -1
  22. data/app/cells/decidim/endorsement_buttons/select_identity_button.erb +1 -1
  23. data/app/cells/decidim/endorsement_buttons/show.erb +7 -7
  24. data/app/cells/decidim/endorsement_buttons/verification_modal.erb +4 -2
  25. data/app/cells/decidim/endorsers_list/empty.erb +3 -0
  26. data/app/cells/decidim/endorsers_list/full.erb +17 -5
  27. data/app/cells/decidim/endorsers_list/show.erb +19 -10
  28. data/app/cells/decidim/endorsers_list_cell.rb +19 -6
  29. data/app/cells/decidim/flag_modal/flag_user.erb +34 -0
  30. data/app/cells/decidim/flag_modal/show.erb +52 -0
  31. data/app/cells/decidim/flag_modal_cell.rb +56 -0
  32. data/app/cells/decidim/follow_button/show.erb +1 -2
  33. data/app/cells/decidim/follow_button_cell.rb +5 -0
  34. data/app/cells/decidim/footer_topics/show.erb +2 -2
  35. data/app/cells/decidim/group_admins/show.erb +1 -3
  36. data/app/cells/decidim/group_members/show.erb +2 -6
  37. data/app/cells/decidim/images_panel/show.erb +2 -5
  38. data/app/cells/decidim/map/show.erb +3 -0
  39. data/app/cells/decidim/map/template.erb +14 -0
  40. data/app/cells/decidim/map_cell.rb +39 -0
  41. data/app/cells/decidim/notification_actions/buttons_cell.rb +1 -1
  42. data/app/cells/decidim/onboarding_action_message/show.erb +15 -0
  43. data/app/cells/decidim/onboarding_action_message_cell.rb +81 -0
  44. data/app/cells/decidim/participatory_space_dropdown_metadata/metadata.erb +4 -4
  45. data/app/cells/decidim/participatory_space_dropdown_metadata/show.erb +3 -5
  46. data/app/cells/decidim/participatory_space_private_user/show.erb +23 -0
  47. data/app/cells/decidim/participatory_space_private_user_cell.rb +21 -0
  48. data/app/cells/decidim/profile_actions/show.erb +1 -1
  49. data/app/cells/decidim/profile_sidebar/show.erb +167 -0
  50. data/app/cells/decidim/profile_sidebar_cell.rb +68 -0
  51. data/app/cells/decidim/progress_bar/show.erb +2 -2
  52. data/app/cells/decidim/report_button/already_reported_modal.erb +2 -2
  53. data/app/cells/decidim/report_button/flag_modal.erb +36 -24
  54. data/app/cells/decidim/report_button_cell.rb +9 -2
  55. data/app/cells/decidim/resource_history/show.erb +20 -0
  56. data/app/cells/decidim/resource_history_cell.rb +66 -0
  57. data/app/cells/decidim/resource_types_filter/show.erb +1 -1
  58. data/app/cells/decidim/resource_types_filter_cell.rb +6 -6
  59. data/app/cells/decidim/share_button_cell.rb +0 -4
  60. data/app/cells/decidim/share_widget/modal.erb +26 -0
  61. data/app/cells/decidim/share_widget/show.erb +2 -0
  62. data/app/cells/decidim/share_widget_cell.rb +20 -0
  63. data/app/cells/decidim/tags/show.erb +7 -4
  64. data/app/cells/decidim/tags_cell.rb +11 -72
  65. data/app/cells/decidim/upload_modal/files.erb +4 -4
  66. data/app/cells/decidim/upload_modal_cell.rb +3 -5
  67. data/app/cells/decidim/user_activity/show.erb +1 -1
  68. data/app/commands/decidim/amendable/accept.rb +1 -2
  69. data/app/commands/decidim/amendable/create_draft.rb +2 -2
  70. data/app/commands/decidim/create_ephemeral_user.rb +52 -0
  71. data/app/commands/decidim/create_omniauth_registration.rb +21 -17
  72. data/app/commands/decidim/create_report.rb +8 -11
  73. data/app/commands/decidim/create_user_group.rb +6 -2
  74. data/app/commands/decidim/destroy_ephemeral_user.rb +47 -0
  75. data/app/commands/decidim/invite_user.rb +1 -1
  76. data/app/commands/decidim/search.rb +0 -14
  77. data/app/commands/decidim/update_account.rb +11 -3
  78. data/app/commands/decidim/update_notifications_settings.rb +1 -0
  79. data/app/commands/decidim/update_resources_taxonomies.rb +67 -0
  80. data/app/commands/decidim/update_user_group.rb +7 -1
  81. data/app/constraints/decidim/current_component.rb +1 -1
  82. data/app/controllers/concerns/decidim/ajax_permission_handler.rb +21 -0
  83. data/app/controllers/concerns/decidim/devise_authentication_methods.rb +3 -6
  84. data/app/controllers/concerns/decidim/devise_controllers.rb +2 -0
  85. data/app/controllers/concerns/decidim/disable_redirection_to_external_host.rb +1 -1
  86. data/app/controllers/concerns/decidim/ephemeral_session_checker.rb +87 -0
  87. data/app/controllers/concerns/decidim/filter_resource.rb +4 -2
  88. data/app/controllers/concerns/decidim/has_members_page.rb +25 -0
  89. data/app/controllers/concerns/decidim/locale_switcher.rb +2 -2
  90. data/app/controllers/concerns/decidim/needs_password_change.rb +0 -1
  91. data/app/controllers/concerns/decidim/needs_permission.rb +2 -1
  92. data/app/controllers/concerns/decidim/needs_tos_accepted.rb +4 -5
  93. data/app/controllers/concerns/decidim/onboarding_action_methods.rb +52 -0
  94. data/app/controllers/concerns/decidim/participatory_space_context.rb +1 -4
  95. data/app/controllers/decidim/amendments_controller.rb +3 -3
  96. data/app/controllers/decidim/application_controller.rb +9 -0
  97. data/app/controllers/decidim/authorization_modals_controller.rb +8 -2
  98. data/app/controllers/decidim/components/base_controller.rb +3 -7
  99. data/app/controllers/decidim/devise/confirmations_controller.rb +4 -0
  100. data/app/controllers/decidim/devise/omniauth_registrations_controller.rb +8 -1
  101. data/app/controllers/decidim/devise/registrations_controller.rb +1 -1
  102. data/app/controllers/decidim/devise/sessions_controller.rb +2 -0
  103. data/app/controllers/decidim/download_your_data_controller.rb +33 -2
  104. data/app/controllers/decidim/editor_images_controller.rb +1 -11
  105. data/app/controllers/decidim/follows_controller.rb +1 -1
  106. data/app/controllers/decidim/geolocation_controller.rb +19 -0
  107. data/app/controllers/decidim/homepage_controller.rb +0 -1
  108. data/app/controllers/decidim/open_data_controller.rb +33 -8
  109. data/app/controllers/decidim/profiles_controller.rb +2 -2
  110. data/app/controllers/decidim/reports_controller.rb +2 -7
  111. data/app/controllers/decidim/user_activities_controller.rb +1 -1
  112. data/app/controllers/decidim/user_conversations_controller.rb +1 -11
  113. data/app/events/decidim/soft_delete_resource_event.rb +15 -0
  114. data/app/forms/decidim/account_form.rb +2 -5
  115. data/app/forms/decidim/amendable/form.rb +4 -2
  116. data/app/forms/decidim/ephemeral_user_form.rb +22 -0
  117. data/app/forms/decidim/notifications_settings_form.rb +1 -0
  118. data/app/forms/decidim/omniauth_registration_form.rb +15 -2
  119. data/app/forms/decidim/registration_form.rb +1 -1
  120. data/app/helpers/concerns/decidim/flash_helper_extensions.rb +17 -2
  121. data/app/helpers/decidim/action_authorization_helper.rb +75 -14
  122. data/app/helpers/decidim/amendments_helper.rb +1 -11
  123. data/app/helpers/decidim/application_helper.rb +6 -2
  124. data/app/helpers/decidim/breadcrumb_helper.rb +6 -0
  125. data/app/helpers/decidim/cache_helper.rb +1 -1
  126. data/app/helpers/decidim/check_boxes_tree_helper.rb +25 -53
  127. data/app/helpers/decidim/decidim_form_helper.rb +0 -44
  128. data/app/helpers/decidim/endorsable_helper.rb +0 -10
  129. data/app/helpers/decidim/filters_helper.rb +0 -25
  130. data/app/helpers/decidim/layout_helper.rb +6 -6
  131. data/app/helpers/decidim/menu_helper.rb +2 -2
  132. data/app/helpers/decidim/messaging/conversation_helper.rb +2 -3
  133. data/app/helpers/decidim/meta_tags_helper.rb +32 -23
  134. data/app/helpers/decidim/modal_helper.rb +23 -0
  135. data/app/helpers/decidim/omniauth_helper.rb +5 -5
  136. data/app/helpers/decidim/onboarding_action_helper.rb +13 -0
  137. data/app/helpers/decidim/orders_helper.rb +1 -2
  138. data/app/helpers/decidim/paginate_helper.rb +1 -1
  139. data/app/helpers/decidim/participatory_space_helpers.rb +1 -1
  140. data/app/helpers/decidim/passwords_helper.rb +2 -2
  141. data/app/helpers/decidim/taxonomies_helper.rb +40 -0
  142. data/app/helpers/decidim/tooltip_helper.rb +1 -4
  143. data/app/jobs/decidim/download_your_data_export_job.rb +2 -19
  144. data/app/jobs/decidim/event_publisher_job.rb +18 -9
  145. data/app/jobs/decidim/export_job.rb +5 -1
  146. data/app/jobs/decidim/export_participatory_space_job.rb +4 -1
  147. data/app/jobs/decidim/open_data_job.rb +4 -4
  148. data/app/mailers/decidim/export_mailer.rb +7 -12
  149. data/app/mailers/decidim/notifications_digest_mailer.rb +1 -7
  150. data/app/mailers/decidim/reported_mailer.rb +2 -18
  151. data/app/models/decidim/action_log.rb +20 -1
  152. data/app/models/decidim/category.rb +4 -0
  153. data/app/models/decidim/component.rb +25 -3
  154. data/app/models/decidim/metric.rb +2 -1
  155. data/app/models/decidim/moderation.rb +16 -0
  156. data/app/models/decidim/newsletter.rb +12 -8
  157. data/app/models/decidim/organization.rb +7 -3
  158. data/app/models/decidim/participatory_space_private_user.rb +20 -0
  159. data/app/models/decidim/private_export.rb +24 -0
  160. data/app/models/decidim/push_notification_message.rb +1 -1
  161. data/app/models/decidim/report.rb +1 -1
  162. data/app/models/decidim/scope.rb +4 -0
  163. data/app/models/decidim/share_token.rb +36 -10
  164. data/app/models/decidim/taxonomization.rb +23 -0
  165. data/app/models/decidim/taxonomy.rb +139 -0
  166. data/app/models/decidim/taxonomy_filter.rb +130 -0
  167. data/app/models/decidim/taxonomy_filter_item.rb +33 -0
  168. data/app/models/decidim/user.rb +13 -23
  169. data/app/models/decidim/user_base_entity.rb +12 -4
  170. data/app/models/decidim/user_moderation.rb +9 -0
  171. data/app/models/decidim/user_report.rb +4 -0
  172. data/app/packs/entrypoints/decidim_core.js +1 -0
  173. data/app/packs/entrypoints/decidim_geocoding.js +2 -0
  174. data/app/packs/images/decidim/brands/facebook.svg +10 -0
  175. data/app/packs/images/decidim/brands/google.svg +7 -1
  176. data/app/packs/images/decidim/brands/twitter-x.svg +3 -0
  177. data/app/packs/images/decidim/default-avatar.svg +1 -1
  178. data/app/packs/src/decidim/callout.js +8 -13
  179. data/app/packs/src/decidim/check_boxes_tree.js +0 -1
  180. data/app/packs/src/decidim/clipboard.js +18 -9
  181. data/app/packs/src/decidim/datepicker/datepicker_functions.js +3 -3
  182. data/app/packs/src/decidim/datepicker/generate_datepicker.js +0 -2
  183. data/app/packs/src/decidim/datepicker/generate_timepicker.js +0 -2
  184. data/app/packs/src/decidim/decidim_application.js +1 -0
  185. data/app/packs/src/decidim/direct_uploads/upload_field.js +4 -3
  186. data/app/packs/src/decidim/direct_uploads/upload_modal.js +9 -8
  187. data/app/packs/src/decidim/editor/common/suggestion.js +1 -11
  188. data/app/packs/src/decidim/geocoding/reverse_geocoding.js +60 -0
  189. data/app/packs/src/decidim/index.js +9 -5
  190. data/app/packs/src/decidim/input_character_counter.js +1 -1
  191. data/app/packs/src/decidim/map/provider/here.js +1 -1
  192. data/app/packs/src/decidim/onboarding_pending_action.js +24 -0
  193. data/app/packs/src/decidim/sticky_footer.js +29 -0
  194. data/app/packs/src/decidim/sticky_header.js +6 -31
  195. data/app/packs/src/decidim/user_registrations.js +13 -0
  196. data/app/packs/src/decidim/vendor/leaflet-tilelayer-here.js +212 -0
  197. data/app/packs/stylesheets/decidim/_accordion.scss +30 -0
  198. data/app/packs/stylesheets/decidim/_activity.scss +4 -4
  199. data/app/packs/stylesheets/decidim/_buttons.scss +19 -0
  200. data/app/packs/stylesheets/decidim/_cards.scss +0 -4
  201. data/app/packs/stylesheets/decidim/_content_blocks.scss +0 -4
  202. data/app/packs/stylesheets/decidim/_dropdown.scss +1 -1
  203. data/app/packs/stylesheets/decidim/_endorsers_list.scss +26 -20
  204. data/app/packs/stylesheets/decidim/_filters.scss +1 -1
  205. data/app/packs/stylesheets/decidim/_forms.scss +2 -2
  206. data/app/packs/stylesheets/decidim/_header.scss +39 -70
  207. data/app/packs/stylesheets/decidim/_layout.scss +34 -4
  208. data/app/packs/stylesheets/decidim/_login.scss +53 -6
  209. data/app/packs/stylesheets/decidim/_modal.scss +47 -1
  210. data/app/packs/stylesheets/decidim/_modal_tos_refuse.scss +4 -0
  211. data/app/packs/stylesheets/decidim/_modal_update.scss +1 -5
  212. data/app/packs/stylesheets/decidim/_participatory_spaces.scss +46 -0
  213. data/app/packs/stylesheets/decidim/_profile.scss +1 -1
  214. data/app/packs/stylesheets/decidim/_success_image.scss +64 -0
  215. data/app/packs/stylesheets/decidim/_tribute.scss +36 -0
  216. data/app/packs/stylesheets/decidim/application.scss +1 -1
  217. data/app/packs/stylesheets/decidim/geocoding_addons.scss +5 -0
  218. data/app/packs/stylesheets/decidim/map.scss +7 -10
  219. data/app/packs/stylesheets/decidim/resource_history.scss +31 -0
  220. data/app/permissions/decidim/default_permissions.rb +0 -2
  221. data/app/permissions/decidim/permissions.rb +9 -15
  222. data/app/presenters/decidim/admin_log/base_user_presenter.rb +67 -0
  223. data/app/presenters/decidim/admin_log/component_presenter.rb +32 -3
  224. data/app/presenters/decidim/admin_log/moderation_presenter.rb +30 -3
  225. data/app/presenters/decidim/admin_log/share_token_presenter.rb +39 -0
  226. data/app/presenters/decidim/admin_log/taxonomy_filter_presenter.rb +57 -0
  227. data/app/presenters/decidim/admin_log/taxonomy_presenter.rb +48 -0
  228. data/app/presenters/decidim/admin_log/user_group_presenter.rb +6 -6
  229. data/app/presenters/decidim/admin_log/user_presenter.rb +4 -18
  230. data/app/presenters/decidim/log/user_presenter.rb +0 -1
  231. data/app/presenters/decidim/log/value_types/date_presenter.rb +1 -0
  232. data/app/presenters/decidim/log/value_types/taxonomy_presenter.rb +29 -0
  233. data/app/presenters/decidim/notification_to_mailer_presenter.rb +3 -7
  234. data/app/presenters/decidim/participatory_space_private_user_presenter.rb +50 -0
  235. data/app/presenters/decidim/taxonomy_filter_presenter.rb +19 -0
  236. data/app/presenters/decidim/taxonomy_presenter.rb +14 -0
  237. data/app/presenters/decidim/user_presenter.rb +1 -1
  238. data/app/queries/decidim/last_activity.rb +0 -25
  239. data/app/queries/decidim/metrics/blocked_users_metric_manage.rb +2 -2
  240. data/app/queries/decidim/metrics/users_metric_manage.rb +2 -2
  241. data/app/queries/decidim/public_activities.rb +1 -12
  242. data/app/queries/decidim/stats_users_count.rb +2 -2
  243. data/app/resolvers/decidim/meta_image_url_resolver.rb +128 -0
  244. data/app/serializers/decidim/exporters/open_data_blocked_user_serializer.rb +25 -0
  245. data/app/serializers/decidim/exporters/open_data_metric_serializer.rb +22 -0
  246. data/app/serializers/decidim/exporters/open_data_moderation_serializer.rb +30 -0
  247. data/app/serializers/decidim/exporters/open_data_taxonomy_serializer.rb +30 -0
  248. data/app/serializers/decidim/exporters/open_data_user_group_serializer.rb +38 -0
  249. data/app/serializers/decidim/exporters/open_data_user_serializer.rb +39 -0
  250. data/app/serializers/decidim/exporters/participatory_space_serializer.rb +104 -0
  251. data/app/serializers/decidim/exporters/serializer.rb +25 -0
  252. data/app/serializers/decidim/schema_org_breadcrumb_list_serializer.rb +52 -0
  253. data/app/services/decidim/action_authorizer.rb +32 -3
  254. data/app/services/decidim/base_diff_renderer.rb +1 -3
  255. data/app/services/decidim/download_your_data_exporter.rb +58 -24
  256. data/app/services/decidim/onboarding_manager.rb +272 -0
  257. data/app/services/decidim/open_data_exporter.rb +139 -13
  258. data/app/services/decidim/static_map_generator.rb +1 -1
  259. data/app/services/decidim/traceability.rb +13 -0
  260. data/app/uploaders/decidim/application_uploader.rb +1 -1
  261. data/app/validators/etiquette_validator.rb +9 -2
  262. data/app/validators/passthru_validator.rb +1 -1
  263. data/app/validators/translated_etiquette_validator.rb +32 -0
  264. data/app/views/decidim/account/_password_fields.html.erb +2 -2
  265. data/app/views/decidim/application/_accordion_section.html.erb +14 -0
  266. data/app/views/decidim/application/_collection.html.erb +30 -18
  267. data/app/views/decidim/devise/omniauth_registrations/new.html.erb +5 -1
  268. data/app/views/decidim/devise/omniauth_registrations/new_tos_fields.html.erb +29 -0
  269. data/app/views/decidim/devise/registrations/new.html.erb +10 -22
  270. data/app/views/decidim/devise/sessions/new.html.erb +24 -29
  271. data/app/views/decidim/devise/shared/_omniauth_buttons.html.erb +2 -4
  272. data/app/views/decidim/devise/shared/_tos_fields.html.erb +16 -0
  273. data/app/views/decidim/download_your_data/_export.html.erb +15 -0
  274. data/app/views/decidim/download_your_data/show.html.erb +51 -5
  275. data/app/views/decidim/endorsements/update_buttons_and_counters.js.erb +16 -19
  276. data/app/views/decidim/errors/internal_server_error.html.erb +1 -1
  277. data/app/views/decidim/errors/not_found.html.erb +1 -1
  278. data/app/views/decidim/export_mailer/download_your_data_export.html.erb +2 -2
  279. data/app/views/decidim/export_mailer/export.html.erb +5 -1
  280. data/app/views/decidim/last_activities/index.html.erb +1 -1
  281. data/app/views/decidim/messaging/conversations/_reply_form.html.erb +2 -1
  282. data/app/views/decidim/messaging/conversations/_start.html.erb +1 -1
  283. data/app/views/decidim/newsletters/unsubscribe.html.erb +4 -16
  284. data/app/views/decidim/notifications_settings/show.html.erb +22 -0
  285. data/app/views/decidim/open_data/_how_to_open_accordion_section.html.erb +15 -0
  286. data/app/views/decidim/open_data/index.html.erb +108 -0
  287. data/app/views/decidim/pages/show.html.erb +2 -1
  288. data/app/views/decidim/participatory_space_private_users/_participatory_space_private_user.html.erb +1 -0
  289. data/app/views/decidim/reported_mailer/hide.html.erb +9 -0
  290. data/app/views/decidim/reported_mailer/report.html.erb +1 -1
  291. data/app/views/decidim/searches/_count.html.erb +1 -1
  292. data/app/views/decidim/searches/_filters.html.erb +39 -76
  293. data/app/views/decidim/shared/_component_announcement.html.erb +1 -1
  294. data/app/views/decidim/shared/_confirm_modal.html.erb +5 -3
  295. data/app/views/decidim/shared/_filters.html.erb +4 -6
  296. data/app/views/decidim/shared/_login_modal.html.erb +26 -20
  297. data/app/views/decidim/shared/_orders.html.erb +2 -2
  298. data/app/views/decidim/shared/_resource_actions.html.erb +21 -0
  299. data/app/views/decidim/shared/_results_per_page.html.erb +1 -1
  300. data/app/views/decidim/shared/filters/_check_boxes_tree.html.erb +1 -2
  301. data/app/views/decidim/shared/filters/_collection.html.erb +1 -1
  302. data/app/views/decidim/shared/filters/_dropdown_label.html.erb +7 -4
  303. data/app/views/kaminari/decidim/_page.html.erb +1 -1
  304. data/app/views/kaminari/decidim/_paginator.html.erb +1 -1
  305. data/app/views/layouts/decidim/_application.html.erb +0 -1
  306. data/app/views/layouts/decidim/_logo.html.erb +2 -2
  307. data/app/views/layouts/decidim/_logo_mobile.html.erb +1 -1
  308. data/app/views/layouts/decidim/_meta_tags_config.html.erb +6 -11
  309. data/app/views/layouts/decidim/_schema_org_breadcrumb_list.html.erb +3 -0
  310. data/app/views/layouts/decidim/_wrapper.html.erb +15 -9
  311. data/app/views/layouts/decidim/footer/_main.html.erb +1 -1
  312. data/app/views/layouts/decidim/footer/_main_intro.html.erb +1 -1
  313. data/app/views/layouts/decidim/footer/_main_legal.html.erb +1 -1
  314. data/app/views/layouts/decidim/footer/_main_links.html.erb +1 -1
  315. data/app/views/layouts/decidim/footer/_mini.html.erb +2 -2
  316. data/app/views/layouts/decidim/header/_close_ephemeral_session.html.erb +25 -0
  317. data/app/views/layouts/decidim/header/_main.html.erb +14 -10
  318. data/app/views/layouts/decidim/header/_main_links_desktop.html.erb +0 -6
  319. data/app/views/layouts/decidim/header/_main_links_dropdown.html.erb +0 -2
  320. data/app/views/layouts/decidim/header/_main_links_mobile_account.html.erb +1 -1
  321. data/app/views/layouts/decidim/header/_menu_breadcrumb_items.html.erb +2 -0
  322. data/app/views/layouts/decidim/header/_menu_breadcrumb_main_dropdown_desktop.html.erb +11 -5
  323. data/app/views/layouts/decidim/header/_menu_breadcrumb_mobile_tablet.html.erb +5 -5
  324. data/app/views/layouts/decidim/header/_mobile_language_choose.html.erb +1 -1
  325. data/app/views/layouts/decidim/shared/_layout_item.html.erb +1 -1
  326. data/config/assets.rb +2 -1
  327. data/config/locales/ar.yml +38 -74
  328. data/config/locales/bg-BG.yml +2 -2
  329. data/config/locales/bg.yml +38 -74
  330. data/config/locales/bs-BA.yml +0 -2
  331. data/config/locales/ca.yml +374 -130
  332. data/config/locales/cs.yml +379 -116
  333. data/config/locales/de.yml +370 -132
  334. data/config/locales/el.yml +26 -58
  335. data/config/locales/en.yml +354 -110
  336. data/config/locales/eo.yml +0 -4
  337. data/config/locales/es-MX.yml +368 -127
  338. data/config/locales/es-PY.yml +373 -132
  339. data/config/locales/es.yml +374 -130
  340. data/config/locales/eu.yml +461 -215
  341. data/config/locales/fi-plain.yml +367 -130
  342. data/config/locales/fi.yml +372 -132
  343. data/config/locales/fr-CA.yml +180 -125
  344. data/config/locales/fr-LU.yml +3 -3
  345. data/config/locales/fr.yml +180 -122
  346. data/config/locales/ga-IE.yml +4 -25
  347. data/config/locales/gl.yml +23 -58
  348. data/config/locales/hu.yml +35 -62
  349. data/config/locales/id-ID.yml +24 -57
  350. data/config/locales/is-IS.yml +6 -25
  351. data/config/locales/it.yml +39 -218
  352. data/config/locales/ja.yml +235 -140
  353. data/config/locales/lb-LU.yml +2 -2
  354. data/config/locales/lb.yml +31 -76
  355. data/config/locales/lt.yml +29 -64
  356. data/config/locales/lv.yml +24 -58
  357. data/config/locales/nl.yml +26 -75
  358. data/config/locales/no.yml +26 -70
  359. data/config/locales/pl.yml +35 -72
  360. data/config/locales/pt-BR.yml +44 -63
  361. data/config/locales/pt.yml +26 -70
  362. data/config/locales/ro-RO.yml +118 -183
  363. data/config/locales/ru.yml +16 -43
  364. data/config/locales/sk-SK.yml +3 -3
  365. data/config/locales/sk.yml +27 -72
  366. data/config/locales/sl.yml +0 -4
  367. data/config/locales/sr-CS.yml +0 -2
  368. data/config/locales/sv.yml +141 -133
  369. data/config/locales/tr-TR.yml +32 -75
  370. data/config/locales/uk.yml +8 -29
  371. data/config/locales/zh-CN.yml +24 -68
  372. data/config/locales/zh-TW.yml +28 -62
  373. data/config/routes.rb +4 -10
  374. data/db/migrate/20171212103803_create_unique_nicknames.rb +1 -1
  375. data/db/migrate/20180221101934_fix_nickname_index.rb +1 -1
  376. data/db/migrate/20180706104107_add_nickname_to_managed_users.rb +1 -1
  377. data/db/migrate/20181001124950_move_users_groups_to_users_table.rb +1 -1
  378. data/db/migrate/20181025082245_add_timestamps_to_components.rb +2 -0
  379. data/db/migrate/20190412131728_fix_user_names.rb +1 -1
  380. data/db/migrate/20240628111905_add_visible_to_components.rb +7 -0
  381. data/db/migrate/20240704115429_create_decidim_taxonomies.rb +23 -0
  382. data/db/migrate/20240717093514_add_registered_only_to_decidim_share_tokens.rb +7 -0
  383. data/db/migrate/20240722215500_change_object_changes_on_versions.rb +39 -0
  384. data/db/migrate/20240806065417_create_decidim_taxonomy_filters.rb +23 -0
  385. data/db/migrate/20240822161348_add_deleted_at_to_decidim_components.rb +8 -0
  386. data/db/migrate/20240906162524_add_part_of_to_taxonomies.rb +26 -0
  387. data/db/migrate/20241001135825_add_role_to_participatory_space_private_users.rb +7 -0
  388. data/db/migrate/20241001140408_add_published_to_participatory_space_private_users.rb +7 -0
  389. data/db/migrate/20241022002600_create_private_exports.rb +18 -0
  390. data/db/migrate/20241028114430_add_component_counter_to_taxonomy_filters.rb +7 -0
  391. data/db/migrate/20241111104357_add_names_and_space_boolean_to_taxonomy_filters.rb +9 -0
  392. data/db/migrate/20241127093708_add_taxonomy_to_metrics.rb +7 -0
  393. data/db/migrate/20241204121445_add_participatory_space_manifests_from_taxonomy_filters.rb +9 -0
  394. data/decidim-core.gemspec +14 -17
  395. data/lib/decidim/action_authorization.rb +3 -2
  396. data/lib/decidim/amendable.rb +1 -1
  397. data/lib/decidim/api/input_filters/category_input_filter.rb +5 -3
  398. data/lib/decidim/api/input_filters/component_input_filter.rb +33 -20
  399. data/lib/decidim/api/input_filters/user_entity_input_filter.rb +53 -44
  400. data/lib/decidim/api/input_sorts/component_input_sort.rb +15 -13
  401. data/lib/decidim/api/input_sorts/user_entity_input_sort.rb +4 -4
  402. data/lib/decidim/api/interfaces/author_interface.rb +3 -2
  403. data/lib/decidim/api/interfaces/coauthorable_interface.rb +5 -5
  404. data/lib/decidim/api/interfaces/endorsable_interface.rb +2 -2
  405. data/lib/decidim/api/interfaces/participatory_space_interface.rb +5 -10
  406. data/lib/decidim/api/interfaces/taxonomizable_interface.rb +13 -0
  407. data/lib/decidim/api/types/amendment_type.rb +5 -7
  408. data/lib/decidim/api/types/area_api_type.rb +3 -3
  409. data/lib/decidim/api/types/attachment_type.rb +3 -3
  410. data/lib/decidim/api/types/category_type.rb +2 -2
  411. data/lib/decidim/api/types/decidim_type.rb +5 -1
  412. data/lib/decidim/api/types/fingerprint_type.rb +1 -1
  413. data/lib/decidim/api/types/localized_string_type.rb +1 -1
  414. data/lib/decidim/api/types/metric_history_type.rb +2 -0
  415. data/lib/decidim/api/types/metric_type.rb +1 -1
  416. data/lib/decidim/api/types/organization_type.rb +5 -0
  417. data/lib/decidim/api/types/participatory_space_link_type.rb +2 -2
  418. data/lib/decidim/api/types/participatory_space_manifest_type.rb +1 -1
  419. data/lib/decidim/api/types/quantifiable_translated_field_type.rb +1 -1
  420. data/lib/decidim/api/types/scope_api_type.rb +2 -3
  421. data/lib/decidim/api/types/session_type.rb +1 -2
  422. data/lib/decidim/api/types/taxonomy_type.rb +15 -0
  423. data/lib/decidim/api/types/trace_version_type.rb +2 -2
  424. data/lib/decidim/api/types/translated_field_type.rb +3 -5
  425. data/lib/decidim/api/types/user_group_type.rb +7 -20
  426. data/lib/decidim/api/types/user_type.rb +7 -20
  427. data/lib/decidim/asset_router/storage.rb +6 -11
  428. data/lib/decidim/assets/tailwind/tailwind.config.js.erb +3 -3
  429. data/lib/decidim/attachment_attributes.rb +1 -1
  430. data/lib/decidim/attribute_encryptor.rb +1 -1
  431. data/lib/decidim/attribute_object/nested_validator.rb +1 -1
  432. data/lib/decidim/attributes/integer_with_units.rb +27 -0
  433. data/lib/decidim/attributes/time_with_zone.rb +1 -5
  434. data/lib/decidim/attributes.rb +2 -0
  435. data/lib/decidim/authorization_form_builder.rb +0 -7
  436. data/lib/decidim/coauthorable.rb +1 -1
  437. data/lib/decidim/command.rb +3 -3
  438. data/lib/decidim/commands/destroy_resource.rb +5 -1
  439. data/lib/decidim/commands/resource_handler.rb +2 -2
  440. data/lib/decidim/commands/restore_resource.rb +45 -0
  441. data/lib/decidim/commands/soft_delete_resource.rb +63 -0
  442. data/lib/decidim/component_manifest.rb +7 -0
  443. data/lib/decidim/content_parsers/blob_parser.rb +8 -10
  444. data/lib/decidim/content_parsers/user_parser.rb +1 -1
  445. data/lib/decidim/core/api.rb +2 -0
  446. data/lib/decidim/core/engine.rb +21 -7
  447. data/lib/decidim/core/menu.rb +0 -5
  448. data/lib/decidim/core/seeds.rb +42 -2
  449. data/lib/decidim/core/test/factories.rb +107 -4
  450. data/lib/decidim/core/test/shared_examples/admin_resource_gallery_examples.rb +85 -0
  451. data/lib/decidim/core/test/shared_examples/announcements_examples.rb +0 -4
  452. data/lib/decidim/core/test/shared_examples/comments_examples.rb +393 -38
  453. data/lib/decidim/core/test/shared_examples/components_controller_hide_shared_examples.rb +11 -0
  454. data/lib/decidim/core/test/shared_examples/components_controller_reorder_shared_examples.rb +21 -0
  455. data/lib/decidim/core/test/shared_examples/download_open_data_shared_context.rb +36 -0
  456. data/lib/decidim/core/test/shared_examples/download_open_data_shared_examples.rb +45 -0
  457. data/lib/decidim/core/test/shared_examples/download_your_data_shared_examples.rb +17 -0
  458. data/lib/decidim/core/test/shared_examples/etiquette_validator_examples.rb +25 -0
  459. data/lib/decidim/core/test/shared_examples/follows_examples.rb +43 -0
  460. data/lib/decidim/core/test/shared_examples/has_taxonomies.rb +94 -0
  461. data/lib/decidim/core/test/shared_examples/manage_share_tokens_examples.rb +237 -0
  462. data/lib/decidim/core/test/shared_examples/map_examples.rb +2 -0
  463. data/lib/decidim/core/test/shared_examples/open_data_exporter_examples.rb +102 -0
  464. data/lib/decidim/core/test/shared_examples/participatory_space_members_page_examples.rb +46 -0
  465. data/lib/decidim/core/test/shared_examples/participatory_space_search_examples.rb +98 -0
  466. data/lib/decidim/core/test/shared_examples/permissions.rb +7 -7
  467. data/lib/decidim/core/test/shared_examples/preview_with_share_token_examples.rb +94 -0
  468. data/lib/decidim/core/test/shared_examples/reports_examples.rb +15 -53
  469. data/lib/decidim/core/test/shared_examples/resource_endorsed_event_examples.rb +2 -2
  470. data/lib/decidim/core/test/shared_examples/resource_search_examples.rb +75 -69
  471. data/lib/decidim/core/test/shared_examples/searchable_resources_shared_context.rb +1 -1
  472. data/lib/decidim/core/test/shared_examples/simple_event.rb +33 -19
  473. data/lib/decidim/core/test/shared_examples/social_share_examples.rb +7 -14
  474. data/lib/decidim/core/test/shared_examples/softdeleteable_components_examples.rb +173 -0
  475. data/lib/decidim/core/test/shared_examples/system_endorse_resource_examples.rb +54 -8
  476. data/lib/decidim/core/test/shared_examples/taxonomizable_interface_examples.rb +20 -0
  477. data/lib/decidim/core/test/shared_examples/taxonomizable_resource_examples.rb +37 -0
  478. data/lib/decidim/core/test/shared_examples/taxonomy_settings.rb +49 -0
  479. data/lib/decidim/core/test/shared_examples/translated_event_examples.rb +1 -1
  480. data/lib/decidim/core/test/shared_examples/uncommentable_component_examples.rb +0 -26
  481. data/lib/decidim/core/test/shared_examples/versions_controller_examples.rb +2 -28
  482. data/lib/decidim/core/test/shared_examples/with_endorsable_permissions_examples.rb +1 -1
  483. data/lib/decidim/core/test.rb +9 -5
  484. data/lib/decidim/core/version.rb +1 -1
  485. data/lib/decidim/core.rb +58 -0
  486. data/lib/decidim/download_your_data_serializers/download_your_data_identity_serializer.rb +0 -4
  487. data/lib/decidim/download_your_data_serializers/download_your_data_participatory_space_private_user_serializer.rb +3 -1
  488. data/lib/decidim/download_your_data_serializers/download_your_data_report_serializer.rb +2 -1
  489. data/lib/decidim/download_your_data_serializers/download_your_data_user_serializer.rb +6 -7
  490. data/lib/decidim/download_your_data_serializers.rb +19 -0
  491. data/lib/decidim/exporters/csv.rb +6 -0
  492. data/lib/decidim/exporters/export_manifest.rb +14 -0
  493. data/lib/decidim/exporters/pdf.rb +26 -22
  494. data/lib/decidim/filter_form_builder.rb +12 -15
  495. data/lib/decidim/form_builder.rb +6 -143
  496. data/lib/decidim/has_category.rb +5 -1
  497. data/lib/decidim/has_private_users.rb +4 -0
  498. data/lib/decidim/has_taxonomy_settings.rb +47 -0
  499. data/lib/decidim/has_upload_validations.rb +1 -1
  500. data/lib/decidim/legacy_form_builder.rb +118 -0
  501. data/lib/decidim/maintenance/import_models/application_record.rb +93 -0
  502. data/lib/decidim/maintenance/import_models/area.rb +82 -0
  503. data/lib/decidim/maintenance/import_models/area_type.rb +12 -0
  504. data/lib/decidim/maintenance/import_models/assembly_type.rb +49 -0
  505. data/lib/decidim/maintenance/import_models/categorization.rb +14 -0
  506. data/lib/decidim/maintenance/import_models/category.rb +107 -0
  507. data/lib/decidim/maintenance/import_models/participatory_process_type.rb +21 -0
  508. data/lib/decidim/maintenance/import_models/scope.rb +163 -0
  509. data/lib/decidim/maintenance/import_models.rb +19 -0
  510. data/lib/decidim/maintenance/taxonomy_importer.rb +132 -0
  511. data/lib/decidim/maintenance/taxonomy_plan.rb +78 -0
  512. data/lib/decidim/maintenance.rb +12 -0
  513. data/lib/decidim/map/autocomplete.rb +52 -8
  514. data/lib/decidim/map/dynamic_map.rb +1 -1
  515. data/lib/decidim/map/provider/dynamic_map/here.rb +40 -1
  516. data/lib/decidim/map/provider/geocoding/here.rb +9 -3
  517. data/lib/decidim/map/provider/static_map/here.rb +0 -34
  518. data/lib/decidim/map.rb +3 -6
  519. data/lib/decidim/moderation_tools.rb +16 -19
  520. data/lib/decidim/newsletter_encryptor.rb +1 -1
  521. data/lib/decidim/nicknamizable.rb +9 -6
  522. data/lib/decidim/paddable.rb +1 -1
  523. data/lib/decidim/participable.rb +10 -10
  524. data/lib/decidim/participatory_space_user.rb +10 -0
  525. data/lib/decidim/private_download_helper.rb +15 -0
  526. data/lib/decidim/record_encryptor.rb +51 -46
  527. data/lib/decidim/reportable.rb +2 -6
  528. data/lib/decidim/resourceable.rb +16 -0
  529. data/lib/decidim/seeds.rb +18 -20
  530. data/lib/decidim/settings_manifest.rb +34 -1
  531. data/lib/decidim/soft_deletable.rb +17 -0
  532. data/lib/decidim/taxonomizable.rb +72 -0
  533. data/lib/decidim/translatable_attributes.rb +1 -5
  534. data/lib/decidim/view_model.rb +0 -1
  535. data/lib/tasks/decidim_download_your_data_tasks.rake +2 -4
  536. data/lib/tasks/decidim_procfile.rake +6 -0
  537. data/lib/tasks/decidim_tasks.rake +1 -0
  538. data/lib/tasks/decidim_taxonomies.rake +155 -0
  539. data/lib/tasks/upgrade/{decidim_fix_categorization.rake → clean.rake} +25 -18
  540. data/lib/tasks/upgrade/decidim_active_storage_migration_tasks.rake +1 -1
  541. data/lib/tasks/upgrade/decidim_fix_nickname_uniqueness.rake +20 -23
  542. data/lib/tasks/upgrade/migrations.rake +91 -0
  543. metadata +201 -113
  544. data/app/cells/decidim/amendable/amenders_list/show.erb +0 -0
  545. data/app/cells/decidim/content_blocks/base/content.erb +0 -0
  546. data/app/cells/decidim/endorsers_list/full_endorsers_list.erb +0 -3
  547. data/app/cells/decidim/endorsers_list_button/content.erb +0 -1
  548. data/app/cells/decidim/endorsers_list_button_cell.rb +0 -15
  549. data/app/cells/decidim/report_user_button/already_reported_modal.erb +0 -11
  550. data/app/cells/decidim/report_user_button/flag_modal.erb +0 -47
  551. data/app/cells/decidim/report_user_button/show.erb +0 -2
  552. data/app/cells/decidim/report_user_button_cell.rb +0 -59
  553. data/app/cells/decidim/scopes_picker/scope_picker_prompt.erb +0 -3
  554. data/app/cells/decidim/scopes_picker/scope_picker_values.erb +0 -5
  555. data/app/cells/decidim/scopes_picker/show.erb +0 -14
  556. data/app/cells/decidim/scopes_picker_cell.rb +0 -92
  557. data/app/commands/decidim/update_user_interests.rb +0 -41
  558. data/app/controllers/decidim/scopes_controller.rb +0 -84
  559. data/app/controllers/decidim/user_interests_controller.rb +0 -30
  560. data/app/forms/decidim/user_interest_scope_form.rb +0 -25
  561. data/app/forms/decidim/user_interests_form.rb +0 -17
  562. data/app/helpers/decidim/categories_helper.rb +0 -26
  563. data/app/helpers/decidim/scopes_helper.rb +0 -105
  564. data/app/jobs/decidim/hide_child_resources_job.rb +0 -24
  565. data/app/packs/images/decidim/vendor/leaflet/layers-2x.png +0 -0
  566. data/app/packs/images/decidim/vendor/leaflet/layers.png +0 -0
  567. data/app/packs/images/decidim/vendor/leaflet/marker-icon-2x.png +0 -0
  568. data/app/packs/images/decidim/vendor/leaflet/marker-icon.png +0 -0
  569. data/app/packs/images/decidim/vendor/leaflet/marker-shadow.png +0 -0
  570. data/app/packs/src/decidim/dropdown_menu.js +0 -18
  571. data/app/packs/stylesheets/decidim/_hashtags.scss +0 -5
  572. data/app/packs/stylesheets/decidim/legacy/MarkerCluster.Default.scss +0 -67
  573. data/app/packs/stylesheets/decidim/legacy/MarkerCluster.scss +0 -18
  574. data/app/packs/stylesheets/decidim/legacy/leaflet.scss +0 -705
  575. data/app/validators/scope_belongs_to_component_validator.rb +0 -16
  576. data/app/views/decidim/account/_user_groups.html.erb +0 -0
  577. data/app/views/decidim/reported_mailer/hidden_automatically.html.erb +0 -25
  578. data/app/views/decidim/reported_mailer/hidden_manually.html.erb +0 -25
  579. data/app/views/decidim/scopes/_scopes_picker_input.html.erb +0 -19
  580. data/app/views/decidim/scopes/picker.html.erb +0 -53
  581. data/app/views/decidim/shared/_comments.html.erb +0 -0
  582. data/app/views/decidim/shared/_share_modal.html.erb +0 -26
  583. data/app/views/decidim/shared/_tags.html.erb +0 -1
  584. data/app/views/decidim/user_interests/_areas.html.erb +0 -14
  585. data/app/views/decidim/user_interests/_scopes.html.erb +0 -22
  586. data/app/views/decidim/user_interests/show.html.erb +0 -22
  587. data/config/initializers/foundation_rails_helper.rb +0 -4
  588. data/config/locales/ca-IT.yml +0 -2146
  589. data/lib/decidim/core/test/shared_examples/has_category.rb +0 -38
  590. data/lib/decidim/core/test/shared_examples/has_scope.rb +0 -11
  591. data/lib/decidim/core/test/shared_examples/manage_component_share_tokens.rb +0 -83
  592. data/lib/decidim/core/test/shared_examples/preview_component_with_share_token_examples.rb +0 -49
  593. data/lib/decidim/core/test/shared_examples/scope_helper_examples.rb +0 -93
  594. data/lib/decidim/seven_zip_wrapper.rb +0 -29
  595. data/lib/tasks/upgrade/clean_hidden_resources.rake +0 -33
@@ -34,7 +34,7 @@ module Decidim
34
34
  send_report_notification_to_moderators
35
35
 
36
36
  if hideable?
37
- @tool.hide!
37
+ hide!
38
38
  send_hide_notification_to_moderators
39
39
  end
40
40
 
@@ -53,7 +53,7 @@ module Decidim
53
53
  end
54
54
 
55
55
  def participatory_space_moderators
56
- @participatory_space_moderators ||= participatory_space.moderators
56
+ @participatory_space_moderators ||= participatory_space.respond_to?(:moderators) ? participatory_space.moderators : []
57
57
  end
58
58
 
59
59
  def send_report_notification_to_moderators
@@ -72,20 +72,17 @@ module Decidim
72
72
  hidden_by_admin? || (!@reportable.hidden? && moderation.report_count >= Decidim.max_reports_before_hiding)
73
73
  end
74
74
 
75
+ def hide!
76
+ @tool.hide!
77
+ @tool.send_notification_to_author
78
+ end
79
+
75
80
  def send_hide_notification_to_moderators
76
81
  participatory_space_moderators.each do |moderator|
77
82
  next unless moderator.email_on_moderations
78
83
 
79
- if hidden_by_admin?
80
- ReportedMailer.hidden_manually(moderator, @report, current_user).deliver_later
81
- else
82
- ReportedMailer.hidden_automatically(moderator, @report).deliver_later
83
- end
84
+ ReportedMailer.hide(moderator, @report).deliver_later
84
85
  end
85
86
  end
86
-
87
- def participatory_space
88
- @participatory_space ||= @reportable.component&.participatory_space || @reportable.try(:participatory_space)
89
- end
90
87
  end
91
88
  end
@@ -19,7 +19,7 @@ module Decidim
19
19
  def call
20
20
  return broadcast(:invalid) if form.invalid?
21
21
 
22
- transaction do
22
+ with_events(with_transaction: true) do
23
23
  create_user_group
24
24
  create_membership
25
25
  end
@@ -30,7 +30,11 @@ module Decidim
30
30
 
31
31
  private
32
32
 
33
- attr_reader :form
33
+ attr_reader :form, :user_group
34
+
35
+ def event_arguments
36
+ { resource: user_group }
37
+ end
34
38
 
35
39
  def create_user_group
36
40
  @user_group = UserGroup.create!(
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ # A command with all the business logic to create an ephemeral user.
5
+ class DestroyEphemeralUser < Decidim::Command
6
+ # Public: Initializes the command.
7
+ #
8
+ # user - An ephemeral user.
9
+ def initialize(user)
10
+ @user = user
11
+ end
12
+
13
+ # Executes the command. Broadcasts these events:
14
+ #
15
+ # - :ok when everything is valid.
16
+ # - :invalid if the user is not ephemeral
17
+ #
18
+ # Returns nothing.
19
+ def call
20
+ return broadcast(:invalid) unless user.ephemeral?
21
+
22
+ destroy_pending_authorizations!
23
+ destroy_account!
24
+
25
+ broadcast(:ok)
26
+ rescue ActiveRecord::RecordInvalid
27
+ broadcast(:invalid)
28
+ end
29
+
30
+ private
31
+
32
+ attr_reader :user
33
+
34
+ def destroy_pending_authorizations!
35
+ Decidim::Authorization.where(user:, granted_at: nil).destroy_all
36
+ end
37
+
38
+ def destroy_account!
39
+ user.invalidate_all_sessions!
40
+
41
+ user.delete_reason = "Ephemeral user session expired"
42
+ user.deleted_at = Time.current
43
+ user.skip_reconfirmation!
44
+ user.save!
45
+ end
46
+ end
47
+ end
@@ -41,7 +41,7 @@ module Decidim
41
41
  @user = Decidim::User.new(
42
42
  name: form.name,
43
43
  email: form.email.downcase,
44
- nickname: UserBaseEntity.nicknamize(form.name, form.organization.id),
44
+ nickname: UserBaseEntity.nicknamize(form.name, organization: form.organization),
45
45
  organization: form.organization,
46
46
  admin: form.role == "admin",
47
47
  roles: form.role == "admin" ? [] : [form.role].compact
@@ -37,12 +37,6 @@ module Decidim
37
37
  klass.order_by_id_list(result_ids.take(HIGHLIGHTED_RESULTS_COUNT))
38
38
  end
39
39
 
40
- uncommentable_resources = uncommentable_resources(results) if results.present?
41
- if uncommentable_resources.present?
42
- results -= uncommentable_resources
43
- results_count -= uncommentable_resources.count
44
- end
45
-
46
40
  results_by_type.update(class_name => {
47
41
  count: results_count,
48
42
  results:
@@ -95,13 +89,5 @@ module Decidim
95
89
  query = query.global_search(I18n.transliterate(term)) if term.present?
96
90
  query
97
91
  end
98
-
99
- def uncommentable_resources(results)
100
- results.where(id: results.select { |obj| related_uncommentable_resources?(obj) }.map(&:id))
101
- end
102
-
103
- def related_uncommentable_resources?(object)
104
- object.respond_to?(:commentable) && !object.commentable.commentable?
105
- end
106
92
  end
107
93
  end
@@ -20,10 +20,12 @@ module Decidim
20
20
  update_password
21
21
 
22
22
  if current_user.valid?
23
- changes = current_user.changed
24
- current_user.save!
23
+ with_events do
24
+ changes = current_user.changed
25
+ current_user.save!
26
+ send_update_summary!(changes)
27
+ end
25
28
  notify_followers
26
- send_update_summary!(changes)
27
29
  broadcast(:ok, current_user.unconfirmed_email.present?)
28
30
  else
29
31
  [:avatar, :password].each do |key|
@@ -33,6 +35,12 @@ module Decidim
33
35
  end
34
36
  end
35
37
 
38
+ protected
39
+
40
+ def event_arguments
41
+ { resource: current_user }
42
+ end
43
+
36
44
  private
37
45
 
38
46
  attr_reader :form
@@ -30,6 +30,7 @@ module Decidim
30
30
  current_user.notification_types = @form.notification_types
31
31
  current_user.direct_message_types = @form.direct_message_types
32
32
  current_user.email_on_moderations = @form.email_on_moderations
33
+ current_user.email_on_assigned_proposals = @form.email_on_assigned_proposals
33
34
  current_user.notification_settings = current_user.notification_settings.merge(@form.notification_settings)
34
35
  current_user.notifications_sending_frequency = @form.notifications_sending_frequency
35
36
  end
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ # A command with all the business logic when an admin batch updates taxonomies on several resources.
5
+ class UpdateResourcesTaxonomies < Decidim::Command
6
+ # Public: Initializes the command.
7
+ #
8
+ # taxonomy_ids - the taxonomy ids to update
9
+ # resources - an ApplicationRecord collection of resources to update.
10
+ def initialize(taxonomy_ids, resources, organization)
11
+ @organization = organization
12
+ @taxonomies = Decidim::Taxonomy.non_roots.where(organization:, id: taxonomy_ids)
13
+ @resources = resources
14
+ @response = { taxonomies: [], successful: [], errored: [] }
15
+ end
16
+
17
+ # Executes the command. Broadcasts these events:
18
+ #
19
+ # - :update_resources_taxonomies - when everything is ok, returns @response.
20
+ # - :invalid_taxonomies - if the taxonomy is blank.
21
+ # - :invalid_resources - if the resource_ids is blank.
22
+ #
23
+ # Returns @response hash:
24
+ #
25
+ # - :taxonomies - Array of the updated taxonomies
26
+ # - :successful - Array of the updated resources
27
+ # - :errored - Array of the resources not updated because they already had the taxonomies assigned
28
+ def call
29
+ return broadcast(:invalid_taxonomies) if @taxonomies.blank?
30
+ return broadcast(:invalid_resources) if @resources.blank? || !@resources.respond_to?(:find_each)
31
+
32
+ update_resources_taxonomies
33
+
34
+ broadcast(:update_resources_taxonomies, @response)
35
+ end
36
+
37
+ # Useful for running any code that you may want to execute before updating taxonomies on each resource.
38
+ def run_before_hooks(resource); end
39
+
40
+ # Useful for running any code that you may want to execute after updating taxonomies on each resource.
41
+ def run_after_hooks(resource); end
42
+
43
+ private
44
+
45
+ attr_reader :taxonomies, :resources, :organization
46
+
47
+ def update_resources_taxonomies
48
+ @response[:taxonomies] = taxonomies
49
+ resources.find_each do |resource|
50
+ if taxonomies == resource.taxonomies
51
+ @response[:errored] << resource
52
+ else
53
+ update_resource_taxonomies!(resource)
54
+ @response[:successful] << resource
55
+ end
56
+ end
57
+ end
58
+
59
+ def update_resource_taxonomies!(resource)
60
+ transaction do
61
+ run_before_hooks(resource)
62
+ resource.update!(taxonomies:)
63
+ run_after_hooks(resource)
64
+ end
65
+ end
66
+ end
67
+ end
@@ -22,7 +22,9 @@ module Decidim
22
22
  return broadcast(:invalid) if form.invalid?
23
23
 
24
24
  was_verified = user_group.verified?
25
- update_user_group
25
+ with_events do
26
+ update_user_group
27
+ end
26
28
  notify_admins if was_verified
27
29
 
28
30
  broadcast(:ok, user_group)
@@ -32,6 +34,10 @@ module Decidim
32
34
 
33
35
  attr_reader :form, :user_group
34
36
 
37
+ def event_arguments
38
+ { resource: user_group }
39
+ end
40
+
35
41
  def update_user_group
36
42
  user_group_attributes = attributes
37
43
  user_group_attributes.delete(:avatar) if form.avatar.blank?
@@ -33,7 +33,7 @@ module Decidim
33
33
  end
34
34
 
35
35
  def detect_current_component(params)
36
- @participatory_space.components.find do |component|
36
+ @participatory_space.components.with_deleted.find do |component|
37
37
  params["component_id"] == component.id.to_s && component.manifest_name == @manifest.name.to_s
38
38
  end
39
39
  end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/concern"
4
+
5
+ module Decidim
6
+ module AjaxPermissionHandler
7
+ extend ActiveSupport::Concern
8
+
9
+ included do
10
+ rescue_from Decidim::ActionForbidden, with: :ajax_user_has_no_permission
11
+ end
12
+
13
+ private
14
+
15
+ def ajax_user_has_no_permission
16
+ return user_has_no_permission unless request.xhr?
17
+
18
+ render json: { message: I18n.t("actions.unauthorized", scope: "decidim.core") }, status: :unprocessable_entity
19
+ end
20
+ end
21
+ end
@@ -6,6 +6,7 @@ module Decidim
6
6
  module DeviseAuthenticationMethods
7
7
  extend ActiveSupport::Concern
8
8
  include Decidim::UserBlockedChecker
9
+ include Decidim::OnboardingActionMethods
9
10
 
10
11
  included do
11
12
  def after_sign_in_path_for(user)
@@ -13,8 +14,8 @@ module Decidim
13
14
  check_user_block_status(user)
14
15
  elsif user.needs_password_update?
15
16
  decidim.change_password_path
16
- elsif first_login_and_not_authorized?(user) && !user.admin? && !pending_redirect?(user)
17
- decidim_verifications.first_login_authorizations_path
17
+ elsif pending_onboarding_action?(user)
18
+ decidim_verifications.onboarding_pending_authorizations_path
18
19
  else
19
20
  super
20
21
  end
@@ -27,10 +28,6 @@ module Decidim
27
28
  def pending_redirect?(user)
28
29
  store_location_for(user, stored_location_for(user))
29
30
  end
30
-
31
- def first_login_and_not_authorized?(user)
32
- user.is_a?(User) && user.sign_in_count == 1 && current_organization.available_authorizations.any? && user.verifiable?
33
- end
34
31
  end
35
32
  end
36
33
  end
@@ -22,6 +22,7 @@ module Decidim
22
22
  include NeedsSnippets
23
23
  include UserBlockedChecker
24
24
  include ActiveStorage::SetCurrent
25
+ include Decidim::OnboardingActionMethods
25
26
 
26
27
  helper Decidim::TranslationsHelper
27
28
  helper Decidim::MetaTagsHelper
@@ -36,6 +37,7 @@ module Decidim
36
37
  helper Decidim::SocialShareButtonHelper
37
38
  helper Decidim::SanitizeHelper
38
39
  helper Decidim::ApplicationHelper
40
+ helper Decidim::OnboardingActionHelper
39
41
 
40
42
  layout "layouts/decidim/application"
41
43
 
@@ -8,7 +8,7 @@ module Decidim
8
8
 
9
9
  included do
10
10
  def redirect_back(fallback_location:, allow_other_host: true, **args) # rubocop:disable Lint/UnusedMethodArgument
11
- super fallback_location:, allow_other_host: Decidim.allow_open_redirects, **args
11
+ super(fallback_location:, allow_other_host: Decidim.allow_open_redirects, **args)
12
12
  end
13
13
  end
14
14
  end
@@ -0,0 +1,87 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/concern"
4
+
5
+ module Decidim
6
+ module EphemeralSessionChecker
7
+ extend ActiveSupport::Concern
8
+
9
+ included do
10
+ before_action :check_ephemeral_user_session, if: :ephemeral_user_signed_in?
11
+
12
+ helper_method :onboarding_manager
13
+ end
14
+
15
+ private
16
+
17
+ def ephemeral_user_signed_in?
18
+ user_signed_in? && current_user.ephemeral?
19
+ end
20
+
21
+ def onboarding_manager
22
+ @onboarding_manager ||= Decidim::OnboardingManager.new(current_user)
23
+ end
24
+
25
+ def check_ephemeral_user_session
26
+ return true unless request.format.html?
27
+
28
+ return destroy_ephemeral_session && redirect_to(decidim.root_path) if onboarding_manager.expired?
29
+
30
+ if onboarding_manager.valid?
31
+ authorizations = action_authorized_to(onboarding_manager.action, **onboarding_manager.action_authorized_resources)
32
+
33
+ return redirect_to decidim_verifications.onboarding_pending_authorizations_path unless authorizations_permitted_paths?(authorizations, onboarding_manager)
34
+
35
+ if authorizations.global_code == :unauthorized
36
+ flash[:alert] = t("unauthorized", scope: "decidim.core.actions")
37
+ return destroy_ephemeral_session && redirect_to(decidim.root_path)
38
+ end
39
+ end
40
+
41
+ return true
42
+ end
43
+
44
+ def destroy_ephemeral_session
45
+ Decidim::DestroyEphemeralUser.call(current_user) do
46
+ on(:ok) do
47
+ sign_out(current_user)
48
+ flash[:notice] = t("ephemeral_session_closed", scope: "decidim.devise.sessions.user")
49
+ end
50
+
51
+ on(:invalid) do
52
+ flash[:alert] = t("account.destroy.error", scope: "decidim")
53
+ end
54
+ end
55
+ end
56
+
57
+ # This method determines which paths are allowed to the user based on the
58
+ # onboarding manager data and the associated authorizations. In all cases
59
+ # the user is allowed to visit the onboarding pending and the terms of
60
+ # service pages. In addition:
61
+ # * If the user is pending to complete an authorization is also allowed to
62
+ # navigate in the pages to complete the authorizations and the
63
+ # authorizations path to send the request.
64
+ # * If the user is authorized is also allowed to visit the paths determined
65
+ # by the onboarding manager after finishing the authorization flow and
66
+ # the associated component.
67
+ # The method checks the request path and checks if the path starts with one
68
+ # of the paths of the allowlist
69
+ def authorizations_permitted_paths?(authorizations, onboarding_manager)
70
+ paths_list = if authorizations.user_pending?
71
+ authorizations.statuses.map(&:current_path).compact.prepend(
72
+ decidim_verifications.authorizations_path
73
+ )
74
+ elsif authorizations.ok?
75
+ [onboarding_manager.finished_redirect_path, onboarding_manager.component_path].compact
76
+ else
77
+ []
78
+ end
79
+ paths_list.prepend(
80
+ decidim_verifications.onboarding_pending_authorizations_path,
81
+ decidim.page_path(terms_of_service_page)
82
+ )
83
+
84
+ paths_list.find { |el| /\A#{URI.parse(el).path}/.match?(request.path) }
85
+ end
86
+ end
87
+ end
@@ -16,11 +16,13 @@ module Decidim
16
16
  end
17
17
 
18
18
  def method_missing(method_name, *_arguments)
19
- @filter.present? && @filter.has_key?(method_name) ? @filter[method_name] : super
19
+ method = method_name.to_s.gsub(/\[[0-9]+\]$/, "").to_sym
20
+ @filter.present? && @filter.has_key?(method) ? @filter[method] : super
20
21
  end
21
22
 
22
23
  def respond_to_missing?(method_name, include_private = false)
23
- (@filter.present? && @filter.has_key?(method_name)) || super
24
+ method = method_name.to_s.gsub(/\[[0-9]+\]$/, "").to_sym
25
+ (@filter.present? && @filter.has_key?(method)) || super
24
26
  end
25
27
  end
26
28
 
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/concern"
4
+
5
+ module Decidim
6
+ module HasMembersPage
7
+ extend ActiveSupport::Concern
8
+
9
+ included do
10
+ helper_method :collection
11
+
12
+ private
13
+
14
+ def can_visit_index?
15
+ current_user_can_visit_space? && current_participatory_space.members_public_page?
16
+ end
17
+
18
+ def members
19
+ @members ||= current_participatory_space.participatory_space_private_users.published
20
+ end
21
+
22
+ alias_method :collection, :members
23
+ end
24
+ end
25
+ end
@@ -46,14 +46,14 @@ module Decidim
46
46
  #
47
47
  # Returns an Array of Strings.
48
48
  def available_locales
49
- @available_locales ||= (current_organization || Decidim).public_send(:available_locales)
49
+ @available_locales ||= (current_organization || Decidim).available_locales
50
50
  end
51
51
 
52
52
  # The default locale of this organization.
53
53
  #
54
54
  # Returns a String with the default locale.
55
55
  def default_locale
56
- @default_locale ||= (current_organization || Decidim).public_send(:default_locale)
56
+ @default_locale ||= (current_organization || Decidim).default_locale
57
57
  end
58
58
 
59
59
  # Detects the locale priority: query string, user saved, session, browser
@@ -28,7 +28,6 @@ module Decidim
28
28
  decidim.accept_tos_path,
29
29
  decidim.download_your_data_path,
30
30
  decidim.export_download_your_data_path,
31
- decidim.download_file_download_your_data_path,
32
31
  decidim.change_password_path].compact
33
32
  # ensure that path with or without query string pass
34
33
  permitted_paths.find { |el| el.split("?").first == target_path }
@@ -40,7 +40,8 @@ module Decidim
40
40
  current_settings: try(:current_settings),
41
41
  component_settings: try(:component_settings),
42
42
  current_organization: try(:current_organization),
43
- current_component: try(:current_component)
43
+ current_component: try(:current_component),
44
+ share_token: try(:store_share_token)
44
45
  }
45
46
  end
46
47
 
@@ -15,7 +15,7 @@ module Decidim
15
15
  def tos_accepted_by_user
16
16
  return true unless request.format.html?
17
17
  return true unless current_user
18
- return if current_user.tos_accepted?
18
+ return if current_user.tos_accepted? || current_user.ephemeral?
19
19
  return if permitted_paths?
20
20
 
21
21
  redirect_to_tos
@@ -33,12 +33,11 @@ module Decidim
33
33
  end
34
34
 
35
35
  def permitted_paths?
36
+ return true if request.path.starts_with?(decidim.download_your_data_path)
37
+
36
38
  permitted_paths = [tos_path,
37
39
  decidim.delete_account_path,
38
- decidim.accept_tos_path,
39
- decidim.download_your_data_path,
40
- decidim.export_download_your_data_path,
41
- decidim.download_file_download_your_data_path]
40
+ decidim.accept_tos_path]
42
41
  # ensure that path with or without query string pass
43
42
  permitted_paths.find { |el| el.split("?").first == request.path }
44
43
  end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/concern"
4
+
5
+ module Decidim
6
+ module OnboardingActionMethods
7
+ extend ActiveSupport::Concern
8
+
9
+ included do
10
+ helper_method :pending_onboarding_action?
11
+
12
+ # Returns true if there is a pending onboarding action for the user.
13
+ # The check if skipped for admins, users that are not verifiable of
14
+ # organizations that have no available authorizations.
15
+ def pending_onboarding_action?(user)
16
+ return false if user.blank?
17
+ return false if user.admin?
18
+ return false unless user.verifiable?
19
+ return false if current_organization.available_authorizations.empty?
20
+
21
+ OnboardingManager.new(user).pending_action?
22
+ end
23
+
24
+ def store_onboarding_cookie_data!(user)
25
+ data = onboarding_cookie_data
26
+ return if data.nil?
27
+
28
+ if data.present?
29
+ user.extended_data = user.extended_data.merge(data)
30
+ user.save!
31
+ end
32
+ cookies.delete(OnboardingManager::DATA_KEY)
33
+ end
34
+
35
+ def onboarding_cookie_data
36
+ data_key = OnboardingManager::DATA_KEY
37
+ return unless cookies[data_key]
38
+
39
+ { data_key => JSON.parse(cookies[data_key]).transform_keys(&:underscore) }
40
+ rescue JSON::ParserError
41
+ {}
42
+ end
43
+
44
+ def clear_onboarding_data!(user)
45
+ return if user.ephemeral?
46
+
47
+ user.extended_data = user.extended_data.except(OnboardingManager::DATA_KEY)
48
+ user.save!
49
+ end
50
+ end
51
+ end
52
+ end
@@ -9,7 +9,6 @@ module Decidim
9
9
 
10
10
  included do
11
11
  include Decidim::NeedsOrganization
12
- include Decidim::UserRoleChecker
13
12
 
14
13
  helper ParticipatorySpaceHelpers, IconHelper, ContextualHelpHelper
15
14
  helper_method :current_participatory_space
@@ -82,10 +81,8 @@ module Decidim
82
81
  return true unless current_participatory_space.try(:private_space?) &&
83
82
  !current_participatory_space.try(:is_transparent?)
84
83
  return false unless current_user
85
- return true if current_user.admin?
86
- return true if user_has_any_role?(current_user, current_participatory_space, broad_check: true)
87
84
 
88
- current_participatory_space.users.include?(current_user)
85
+ current_user.admin || current_participatory_space.users.include?(current_user)
89
86
  end
90
87
 
91
88
  def help_section
@@ -107,7 +107,7 @@ module Decidim
107
107
  end
108
108
 
109
109
  def reject
110
- enforce_permission_to :reject, :amendment, amendable:, current_component: amendable.component
110
+ enforce_permission_to :reject, :amendment, current_component: amendable.component
111
111
 
112
112
  @form = form(Decidim::Amendable::RejectForm).from_model(amendment)
113
113
 
@@ -143,13 +143,13 @@ module Decidim
143
143
  end
144
144
 
145
145
  def review
146
- enforce_permission_to :accept, :amendment, amendable:, current_component: amendable.component
146
+ enforce_permission_to :accept, :amendment, current_component: amendable.component
147
147
 
148
148
  @form = form(Decidim::Amendable::ReviewForm).from_params(params)
149
149
  end
150
150
 
151
151
  def accept
152
- enforce_permission_to :accept, :amendment, amendable:, current_component: amendable.component
152
+ enforce_permission_to :accept, :amendment, current_component: amendable.component
153
153
 
154
154
  @form = form(Decidim::Amendable::ReviewForm).from_params(params)
155
155