decidim-core 0.29.2 → 0.30.0.rc2

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 (484) hide show
  1. checksums.yaml +4 -4
  2. data/app/cells/decidim/amendable/amend_button_card/show.erb +6 -4
  3. data/app/cells/decidim/amendable/amend_button_card_cell.rb +8 -0
  4. data/app/cells/decidim/amendable/amendments/show.erb +1 -1
  5. data/app/cells/decidim/amendable/promote_button_card/show.erb +2 -0
  6. data/app/cells/decidim/author_cell.rb +1 -1
  7. data/app/cells/decidim/card_l/extra_data.erb +1 -0
  8. data/app/cells/decidim/card_metadata_cell.rb +9 -16
  9. data/app/cells/decidim/comments_button_cell.rb +14 -2
  10. data/app/cells/decidim/content_blocks/highlighted_elements_cell.rb +2 -0
  11. data/app/cells/decidim/content_blocks/highlighted_elements_with_cell_for_list_cell.rb +1 -1
  12. data/app/cells/decidim/endorsement_block/show.erb +0 -1
  13. data/app/cells/decidim/endorsement_block_cell.rb +6 -0
  14. data/app/cells/decidim/endorsement_buttons/button_content.erb +1 -1
  15. data/app/cells/decidim/endorsement_buttons/select_identity_button.erb +1 -1
  16. data/app/cells/decidim/endorsement_buttons/show.erb +7 -7
  17. data/app/cells/decidim/endorsement_buttons/verification_modal.erb +4 -2
  18. data/app/cells/decidim/endorsers_list/empty.erb +3 -0
  19. data/app/cells/decidim/endorsers_list/full.erb +17 -5
  20. data/app/cells/decidim/endorsers_list/show.erb +19 -10
  21. data/app/cells/decidim/endorsers_list_cell.rb +19 -6
  22. data/app/cells/decidim/follow_button/show.erb +1 -2
  23. data/app/cells/decidim/follow_button_cell.rb +5 -0
  24. data/app/cells/decidim/map/show.erb +3 -0
  25. data/app/cells/decidim/map/template.erb +14 -0
  26. data/app/cells/decidim/map_cell.rb +39 -0
  27. data/app/cells/decidim/notification_actions/buttons_cell.rb +1 -1
  28. data/app/cells/decidim/onboarding_action_message/show.erb +15 -0
  29. data/app/cells/decidim/onboarding_action_message_cell.rb +81 -0
  30. data/app/cells/decidim/participatory_space_private_user/show.erb +23 -0
  31. data/app/cells/decidim/participatory_space_private_user_cell.rb +21 -0
  32. data/app/cells/decidim/progress_bar/show.erb +2 -2
  33. data/app/cells/decidim/report_button_cell.rb +1 -0
  34. data/app/cells/decidim/resource_history/show.erb +20 -0
  35. data/app/cells/decidim/resource_history_cell.rb +66 -0
  36. data/app/cells/decidim/share_button_cell.rb +0 -4
  37. data/app/cells/decidim/share_widget/modal.erb +26 -0
  38. data/app/cells/decidim/share_widget/show.erb +2 -0
  39. data/app/cells/decidim/share_widget_cell.rb +20 -0
  40. data/app/cells/decidim/tags/show.erb +7 -4
  41. data/app/cells/decidim/tags_cell.rb +11 -72
  42. data/app/commands/decidim/amendable/create_draft.rb +2 -2
  43. data/app/commands/decidim/create_ephemeral_user.rb +52 -0
  44. data/app/commands/decidim/create_omniauth_registration.rb +13 -3
  45. data/app/commands/decidim/create_report.rb +1 -5
  46. data/app/commands/decidim/create_user_group.rb +6 -2
  47. data/app/commands/decidim/destroy_ephemeral_user.rb +47 -0
  48. data/app/commands/decidim/update_account.rb +11 -3
  49. data/app/commands/decidim/update_notifications_settings.rb +1 -0
  50. data/app/commands/decidim/update_resources_taxonomies.rb +67 -0
  51. data/app/commands/decidim/update_user_group.rb +7 -1
  52. data/app/constraints/decidim/current_component.rb +1 -1
  53. data/app/controllers/concerns/decidim/ajax_permission_handler.rb +21 -0
  54. data/app/controllers/concerns/decidim/devise_authentication_methods.rb +3 -6
  55. data/app/controllers/concerns/decidim/devise_controllers.rb +2 -0
  56. data/app/controllers/concerns/decidim/disable_redirection_to_external_host.rb +1 -1
  57. data/app/controllers/concerns/decidim/ephemeral_session_checker.rb +87 -0
  58. data/app/controllers/concerns/decidim/filter_resource.rb +4 -2
  59. data/app/controllers/concerns/decidim/has_members_page.rb +25 -0
  60. data/app/controllers/concerns/decidim/headers/browser_feature_permissions.rb +50 -0
  61. data/app/controllers/concerns/decidim/locale_switcher.rb +2 -2
  62. data/app/controllers/concerns/decidim/needs_password_change.rb +0 -1
  63. data/app/controllers/concerns/decidim/needs_permission.rb +2 -1
  64. data/app/controllers/concerns/decidim/needs_tos_accepted.rb +4 -5
  65. data/app/controllers/concerns/decidim/onboarding_action_methods.rb +52 -0
  66. data/app/controllers/decidim/application_controller.rb +10 -0
  67. data/app/controllers/decidim/authorization_modals_controller.rb +8 -2
  68. data/app/controllers/decidim/components/base_controller.rb +3 -7
  69. data/app/controllers/decidim/devise/confirmations_controller.rb +4 -0
  70. data/app/controllers/decidim/devise/omniauth_registrations_controller.rb +8 -1
  71. data/app/controllers/decidim/devise/registrations_controller.rb +1 -1
  72. data/app/controllers/decidim/devise/sessions_controller.rb +2 -0
  73. data/app/controllers/decidim/download_your_data_controller.rb +33 -2
  74. data/app/controllers/decidim/editor_images_controller.rb +1 -11
  75. data/app/controllers/decidim/follows_controller.rb +1 -1
  76. data/app/controllers/decidim/geolocation_controller.rb +19 -0
  77. data/app/controllers/decidim/homepage_controller.rb +0 -1
  78. data/app/controllers/decidim/open_data_controller.rb +33 -8
  79. data/app/controllers/decidim/user_conversations_controller.rb +1 -11
  80. data/app/events/decidim/soft_delete_resource_event.rb +15 -0
  81. data/app/forms/decidim/amendable/form.rb +4 -2
  82. data/app/forms/decidim/ephemeral_user_form.rb +22 -0
  83. data/app/forms/decidim/notifications_settings_form.rb +1 -0
  84. data/app/forms/decidim/omniauth_registration_form.rb +14 -1
  85. data/app/helpers/concerns/decidim/flash_helper_extensions.rb +17 -2
  86. data/app/helpers/decidim/action_authorization_helper.rb +75 -14
  87. data/app/helpers/decidim/amendments_helper.rb +0 -9
  88. data/app/helpers/decidim/application_helper.rb +6 -2
  89. data/app/helpers/decidim/breadcrumb_helper.rb +6 -0
  90. data/app/helpers/decidim/cache_helper.rb +1 -1
  91. data/app/helpers/decidim/check_boxes_tree_helper.rb +25 -53
  92. data/app/helpers/decidim/decidim_form_helper.rb +0 -44
  93. data/app/helpers/decidim/endorsable_helper.rb +0 -10
  94. data/app/helpers/decidim/layout_helper.rb +6 -0
  95. data/app/helpers/decidim/messaging/conversation_helper.rb +2 -3
  96. data/app/helpers/decidim/meta_tags_helper.rb +32 -23
  97. data/app/helpers/decidim/modal_helper.rb +23 -0
  98. data/app/helpers/decidim/omniauth_helper.rb +5 -5
  99. data/app/helpers/decidim/onboarding_action_helper.rb +13 -0
  100. data/app/helpers/decidim/orders_helper.rb +2 -1
  101. data/app/helpers/decidim/participatory_space_helpers.rb +1 -1
  102. data/app/helpers/decidim/passwords_helper.rb +2 -2
  103. data/app/helpers/decidim/taxonomies_helper.rb +40 -0
  104. data/app/jobs/decidim/download_your_data_export_job.rb +2 -19
  105. data/app/jobs/decidim/event_publisher_job.rb +18 -9
  106. data/app/jobs/decidim/export_job.rb +5 -1
  107. data/app/jobs/decidim/export_participatory_space_job.rb +4 -1
  108. data/app/jobs/decidim/hide_child_resources_job.rb +24 -0
  109. data/app/jobs/decidim/open_data_job.rb +4 -4
  110. data/app/mailers/decidim/export_mailer.rb +7 -12
  111. data/app/models/decidim/action_log.rb +11 -0
  112. data/app/models/decidim/category.rb +4 -0
  113. data/app/models/decidim/component.rb +25 -3
  114. data/app/models/decidim/metric.rb +2 -1
  115. data/app/models/decidim/moderation.rb +16 -0
  116. data/app/models/decidim/newsletter.rb +12 -8
  117. data/app/models/decidim/organization.rb +7 -3
  118. data/app/models/decidim/participatory_space_private_user.rb +20 -0
  119. data/app/models/decidim/private_export.rb +24 -0
  120. data/app/models/decidim/push_notification_message.rb +1 -1
  121. data/app/models/decidim/report.rb +1 -1
  122. data/app/models/decidim/scope.rb +4 -0
  123. data/app/models/decidim/share_token.rb +36 -10
  124. data/app/models/decidim/taxonomization.rb +23 -0
  125. data/app/models/decidim/taxonomy.rb +139 -0
  126. data/app/models/decidim/taxonomy_filter.rb +130 -0
  127. data/app/models/decidim/taxonomy_filter_item.rb +33 -0
  128. data/app/models/decidim/user.rb +9 -23
  129. data/app/models/decidim/user_base_entity.rb +12 -0
  130. data/app/models/decidim/user_moderation.rb +9 -0
  131. data/app/models/decidim/user_report.rb +4 -0
  132. data/app/packs/entrypoints/decidim_core.js +1 -0
  133. data/app/packs/entrypoints/decidim_geocoding.js +2 -0
  134. data/app/packs/images/decidim/brands/facebook.svg +10 -0
  135. data/app/packs/images/decidim/brands/google.svg +7 -1
  136. data/app/packs/images/decidim/brands/twitter-x.svg +3 -0
  137. data/app/packs/src/decidim/check_boxes_tree.js +0 -1
  138. data/app/packs/src/decidim/clipboard.js +18 -9
  139. data/app/packs/src/decidim/confirm.js +79 -59
  140. data/app/packs/src/decidim/decidim_application.js +1 -0
  141. data/app/packs/src/decidim/form_remote.js +1 -1
  142. data/app/packs/src/decidim/geocoding/reverse_geocoding.js +60 -0
  143. data/app/packs/src/decidim/impersonation.js +1 -1
  144. data/app/packs/src/decidim/index.js +11 -1
  145. data/app/packs/src/decidim/map/provider/here.js +1 -1
  146. data/app/packs/src/decidim/onboarding_pending_action.js +24 -0
  147. data/app/packs/src/decidim/session_timeouter.js +1 -1
  148. data/app/packs/src/decidim/sticky_footer.js +29 -0
  149. data/app/packs/src/decidim/sticky_header.js +6 -31
  150. data/app/packs/src/decidim/user_registrations.js +13 -0
  151. data/app/packs/src/decidim/utilities/dom.js +148 -0
  152. data/app/packs/stylesheets/decidim/_accordion.scss +30 -0
  153. data/app/packs/stylesheets/decidim/_buttons.scss +19 -0
  154. data/app/packs/stylesheets/decidim/_dropdown.scss +1 -1
  155. data/app/packs/stylesheets/decidim/_endorsers_list.scss +26 -20
  156. data/app/packs/stylesheets/decidim/_forms.scss +2 -2
  157. data/app/packs/stylesheets/decidim/_hashtags.scss +5 -0
  158. data/app/packs/stylesheets/decidim/_header.scss +5 -3
  159. data/app/packs/stylesheets/decidim/_layout.scss +32 -2
  160. data/app/packs/stylesheets/decidim/_login.scss +53 -6
  161. data/app/packs/stylesheets/decidim/_modal.scss +42 -0
  162. data/app/packs/stylesheets/decidim/_modal_tos_refuse.scss +4 -0
  163. data/app/packs/stylesheets/decidim/_participatory_spaces.scss +46 -0
  164. data/app/packs/stylesheets/decidim/_profile.scss +1 -1
  165. data/app/packs/stylesheets/decidim/_success_image.scss +64 -0
  166. data/app/packs/stylesheets/decidim/_tribute.scss +36 -0
  167. data/app/packs/stylesheets/decidim/application.scss +2 -0
  168. data/app/packs/stylesheets/decidim/geocoding_addons.scss +5 -0
  169. data/app/packs/stylesheets/decidim/map.scss +7 -10
  170. data/app/packs/stylesheets/decidim/resource_history.scss +31 -0
  171. data/app/permissions/decidim/permissions.rb +8 -2
  172. data/app/presenters/decidim/admin_log/base_user_presenter.rb +67 -0
  173. data/app/presenters/decidim/admin_log/component_presenter.rb +32 -3
  174. data/app/presenters/decidim/admin_log/moderation_presenter.rb +30 -3
  175. data/app/presenters/decidim/admin_log/share_token_presenter.rb +39 -0
  176. data/app/presenters/decidim/admin_log/taxonomy_filter_presenter.rb +57 -0
  177. data/app/presenters/decidim/admin_log/taxonomy_presenter.rb +48 -0
  178. data/app/presenters/decidim/admin_log/user_group_presenter.rb +6 -6
  179. data/app/presenters/decidim/admin_log/user_presenter.rb +4 -18
  180. data/app/presenters/decidim/log/value_types/date_presenter.rb +1 -0
  181. data/app/presenters/decidim/log/value_types/taxonomy_presenter.rb +29 -0
  182. data/app/presenters/decidim/participatory_space_private_user_presenter.rb +50 -0
  183. data/app/presenters/decidim/taxonomy_filter_presenter.rb +19 -0
  184. data/app/presenters/decidim/taxonomy_presenter.rb +14 -0
  185. data/app/queries/decidim/metrics/blocked_users_metric_manage.rb +2 -2
  186. data/app/queries/decidim/metrics/users_metric_manage.rb +2 -2
  187. data/app/queries/decidim/public_activities.rb +1 -12
  188. data/app/queries/decidim/stats_users_count.rb +2 -2
  189. data/app/resolvers/decidim/meta_image_url_resolver.rb +128 -0
  190. data/app/serializers/decidim/exporters/open_data_blocked_user_serializer.rb +25 -0
  191. data/app/serializers/decidim/exporters/open_data_metric_serializer.rb +22 -0
  192. data/app/serializers/decidim/exporters/open_data_moderation_serializer.rb +30 -0
  193. data/app/serializers/decidim/exporters/open_data_taxonomy_serializer.rb +30 -0
  194. data/app/serializers/decidim/exporters/open_data_user_group_serializer.rb +38 -0
  195. data/app/serializers/decidim/exporters/open_data_user_serializer.rb +39 -0
  196. data/app/serializers/decidim/exporters/participatory_space_serializer.rb +104 -0
  197. data/app/serializers/decidim/exporters/serializer.rb +25 -0
  198. data/app/serializers/decidim/schema_org_breadcrumb_list_serializer.rb +52 -0
  199. data/app/services/decidim/action_authorizer.rb +32 -3
  200. data/app/services/decidim/base_diff_renderer.rb +1 -1
  201. data/app/services/decidim/download_your_data_exporter.rb +58 -24
  202. data/app/services/decidim/onboarding_manager.rb +272 -0
  203. data/app/services/decidim/open_data_exporter.rb +139 -13
  204. data/app/services/decidim/traceability.rb +13 -0
  205. data/app/uploaders/decidim/application_uploader.rb +1 -1
  206. data/app/validators/etiquette_validator.rb +9 -2
  207. data/app/validators/passthru_validator.rb +1 -1
  208. data/app/validators/translated_etiquette_validator.rb +32 -0
  209. data/app/views/decidim/account/_password_fields.html.erb +2 -2
  210. data/app/views/decidim/application/_accordion_section.html.erb +14 -0
  211. data/app/views/decidim/application/_collection.html.erb +30 -18
  212. data/app/views/decidim/devise/omniauth_registrations/new.html.erb +5 -1
  213. data/app/views/decidim/devise/omniauth_registrations/new_tos_fields.html.erb +29 -0
  214. data/app/views/decidim/devise/registrations/new.html.erb +10 -22
  215. data/app/views/decidim/devise/sessions/new.html.erb +24 -29
  216. data/app/views/decidim/devise/shared/_omniauth_buttons.html.erb +2 -4
  217. data/app/views/decidim/devise/shared/_tos_fields.html.erb +16 -0
  218. data/app/views/decidim/download_your_data/_export.html.erb +15 -0
  219. data/app/views/decidim/download_your_data/show.html.erb +51 -5
  220. data/app/views/decidim/endorsements/update_buttons_and_counters.js.erb +16 -19
  221. data/app/views/decidim/export_mailer/download_your_data_export.html.erb +2 -2
  222. data/app/views/decidim/export_mailer/export.html.erb +5 -1
  223. data/app/views/decidim/notifications_settings/show.html.erb +22 -0
  224. data/app/views/decidim/open_data/_how_to_open_accordion_section.html.erb +15 -0
  225. data/app/views/decidim/open_data/index.html.erb +108 -0
  226. data/app/views/decidim/pages/show.html.erb +2 -1
  227. data/app/views/decidim/participatory_space_private_users/_participatory_space_private_user.html.erb +1 -0
  228. data/app/views/decidim/shared/_login_modal.html.erb +26 -20
  229. data/app/views/decidim/shared/_orders.html.erb +2 -2
  230. data/app/views/decidim/shared/_resource_actions.html.erb +21 -0
  231. data/app/views/decidim/shared/filters/_check_boxes_tree.html.erb +1 -2
  232. data/app/views/decidim/shared/filters/_collection.html.erb +1 -1
  233. data/app/views/decidim/shared/filters/_dropdown_label.html.erb +7 -4
  234. data/app/views/layouts/decidim/_application.html.erb +0 -1
  235. data/app/views/layouts/decidim/_js_configuration.html.erb +1 -0
  236. data/app/views/layouts/decidim/_logo.html.erb +1 -1
  237. data/app/views/layouts/decidim/_logo_mobile.html.erb +1 -1
  238. data/app/views/layouts/decidim/_meta_tags_config.html.erb +6 -11
  239. data/app/views/layouts/decidim/_schema_org_breadcrumb_list.html.erb +3 -0
  240. data/app/views/layouts/decidim/_wrapper.html.erb +15 -9
  241. data/app/views/layouts/decidim/footer/_main_links.html.erb +1 -1
  242. data/app/views/layouts/decidim/header/_close_ephemeral_session.html.erb +25 -0
  243. data/app/views/layouts/decidim/header/_main.html.erb +14 -10
  244. data/app/views/layouts/decidim/header/_menu_breadcrumb_items.html.erb +2 -0
  245. data/app/views/layouts/decidim/shared/_layout_item.html.erb +1 -1
  246. data/config/assets.rb +2 -1
  247. data/config/locales/ar.yml +27 -59
  248. data/config/locales/bg.yml +3 -64
  249. data/config/locales/ca.yml +370 -61
  250. data/config/locales/cs.yml +371 -54
  251. data/config/locales/de.yml +365 -54
  252. data/config/locales/el.yml +1 -48
  253. data/config/locales/en.yml +363 -54
  254. data/config/locales/eo.yml +0 -2
  255. data/config/locales/es-MX.yml +363 -57
  256. data/config/locales/es-PY.yml +363 -57
  257. data/config/locales/es.yml +367 -58
  258. data/config/locales/eu.yml +373 -65
  259. data/config/locales/fi-plain.yml +365 -57
  260. data/config/locales/fi.yml +370 -59
  261. data/config/locales/fr-CA.yml +178 -54
  262. data/config/locales/fr.yml +179 -52
  263. data/config/locales/ga-IE.yml +0 -21
  264. data/config/locales/gl.yml +1 -34
  265. data/config/locales/hu.yml +1 -53
  266. data/config/locales/id-ID.yml +1 -34
  267. data/config/locales/is-IS.yml +0 -16
  268. data/config/locales/it.yml +5 -60
  269. data/config/locales/ja.yml +215 -56
  270. data/config/locales/lb.yml +1 -52
  271. data/config/locales/lt.yml +1 -59
  272. data/config/locales/lv.yml +1 -40
  273. data/config/locales/nl.yml +1 -53
  274. data/config/locales/no.yml +2 -52
  275. data/config/locales/pl.yml +4 -66
  276. data/config/locales/pt-BR.yml +11 -52
  277. data/config/locales/pt.yml +2 -52
  278. data/config/locales/ro-RO.yml +219 -117
  279. data/config/locales/ru.yml +0 -20
  280. data/config/locales/sk.yml +1 -41
  281. data/config/locales/sv.yml +138 -59
  282. data/config/locales/tr-TR.yml +1 -50
  283. data/config/locales/uk.yml +0 -18
  284. data/config/locales/zh-CN.yml +1 -50
  285. data/config/locales/zh-TW.yml +1 -54
  286. data/config/routes.rb +4 -10
  287. data/db/migrate/20181025082245_add_timestamps_to_components.rb +2 -0
  288. data/db/migrate/20240628111905_add_visible_to_components.rb +7 -0
  289. data/db/migrate/20240704115429_create_decidim_taxonomies.rb +23 -0
  290. data/db/migrate/20240717093514_add_registered_only_to_decidim_share_tokens.rb +7 -0
  291. data/db/migrate/20240722215500_change_object_changes_on_versions.rb +39 -0
  292. data/db/migrate/20240806065417_create_decidim_taxonomy_filters.rb +23 -0
  293. data/db/migrate/20240822161348_add_deleted_at_to_decidim_components.rb +8 -0
  294. data/db/migrate/20240906162524_add_part_of_to_taxonomies.rb +26 -0
  295. data/db/migrate/20241001135825_add_role_to_participatory_space_private_users.rb +7 -0
  296. data/db/migrate/20241001140408_add_published_to_participatory_space_private_users.rb +7 -0
  297. data/db/migrate/20241022002600_create_private_exports.rb +18 -0
  298. data/db/migrate/20241028114430_add_component_counter_to_taxonomy_filters.rb +7 -0
  299. data/db/migrate/20241111104357_add_names_and_space_boolean_to_taxonomy_filters.rb +9 -0
  300. data/db/migrate/20241127093708_add_taxonomy_to_metrics.rb +7 -0
  301. data/db/migrate/20241204121445_add_participatory_space_manifests_from_taxonomy_filters.rb +9 -0
  302. data/decidim-core.gemspec +14 -17
  303. data/lib/decidim/action_authorization.rb +3 -2
  304. data/lib/decidim/amendable.rb +1 -1
  305. data/lib/decidim/api/input_filters/category_input_filter.rb +5 -3
  306. data/lib/decidim/api/input_filters/component_input_filter.rb +33 -20
  307. data/lib/decidim/api/input_filters/user_entity_input_filter.rb +53 -44
  308. data/lib/decidim/api/input_sorts/component_input_sort.rb +15 -13
  309. data/lib/decidim/api/input_sorts/user_entity_input_sort.rb +4 -4
  310. data/lib/decidim/api/interfaces/author_interface.rb +3 -2
  311. data/lib/decidim/api/interfaces/coauthorable_interface.rb +5 -5
  312. data/lib/decidim/api/interfaces/endorsable_interface.rb +2 -2
  313. data/lib/decidim/api/interfaces/participatory_space_interface.rb +5 -10
  314. data/lib/decidim/api/interfaces/taxonomizable_interface.rb +13 -0
  315. data/lib/decidim/api/types/amendment_type.rb +5 -7
  316. data/lib/decidim/api/types/area_api_type.rb +3 -3
  317. data/lib/decidim/api/types/attachment_type.rb +3 -3
  318. data/lib/decidim/api/types/category_type.rb +2 -2
  319. data/lib/decidim/api/types/decidim_type.rb +5 -1
  320. data/lib/decidim/api/types/fingerprint_type.rb +1 -1
  321. data/lib/decidim/api/types/localized_string_type.rb +1 -1
  322. data/lib/decidim/api/types/metric_history_type.rb +2 -0
  323. data/lib/decidim/api/types/metric_type.rb +1 -1
  324. data/lib/decidim/api/types/organization_type.rb +5 -0
  325. data/lib/decidim/api/types/participatory_space_link_type.rb +2 -2
  326. data/lib/decidim/api/types/participatory_space_manifest_type.rb +1 -1
  327. data/lib/decidim/api/types/quantifiable_translated_field_type.rb +1 -1
  328. data/lib/decidim/api/types/scope_api_type.rb +2 -3
  329. data/lib/decidim/api/types/session_type.rb +1 -2
  330. data/lib/decidim/api/types/taxonomy_type.rb +15 -0
  331. data/lib/decidim/api/types/trace_version_type.rb +2 -2
  332. data/lib/decidim/api/types/translated_field_type.rb +3 -5
  333. data/lib/decidim/api/types/user_group_type.rb +7 -20
  334. data/lib/decidim/api/types/user_type.rb +7 -20
  335. data/lib/decidim/asset_router/storage.rb +4 -4
  336. data/lib/decidim/assets/tailwind/tailwind.config.js.erb +2 -1
  337. data/lib/decidim/attachment_attributes.rb +1 -1
  338. data/lib/decidim/attribute_encryptor.rb +1 -1
  339. data/lib/decidim/attribute_object/nested_validator.rb +1 -1
  340. data/lib/decidim/attributes/integer_with_units.rb +27 -0
  341. data/lib/decidim/attributes.rb +2 -0
  342. data/lib/decidim/authorization_form_builder.rb +0 -7
  343. data/lib/decidim/coauthorable.rb +1 -1
  344. data/lib/decidim/command.rb +3 -3
  345. data/lib/decidim/commands/destroy_resource.rb +5 -1
  346. data/lib/decidim/commands/resource_handler.rb +2 -2
  347. data/lib/decidim/commands/restore_resource.rb +45 -0
  348. data/lib/decidim/commands/soft_delete_resource.rb +63 -0
  349. data/lib/decidim/component_manifest.rb +7 -0
  350. data/lib/decidim/core/api.rb +2 -0
  351. data/lib/decidim/core/engine.rb +21 -7
  352. data/lib/decidim/core/menu.rb +0 -5
  353. data/lib/decidim/core/seeds.rb +42 -2
  354. data/lib/decidim/core/test/factories.rb +105 -2
  355. data/lib/decidim/core/test/shared_examples/admin_resource_gallery_examples.rb +85 -0
  356. data/lib/decidim/core/test/shared_examples/comments_examples.rb +393 -38
  357. data/lib/decidim/core/test/shared_examples/components_controller_hide_shared_examples.rb +11 -0
  358. data/lib/decidim/core/test/shared_examples/components_controller_reorder_shared_examples.rb +21 -0
  359. data/lib/decidim/core/test/shared_examples/download_open_data_shared_context.rb +36 -0
  360. data/lib/decidim/core/test/shared_examples/download_open_data_shared_examples.rb +45 -0
  361. data/lib/decidim/core/test/shared_examples/download_your_data_shared_examples.rb +17 -0
  362. data/lib/decidim/core/test/shared_examples/etiquette_validator_examples.rb +25 -0
  363. data/lib/decidim/core/test/shared_examples/follows_examples.rb +43 -0
  364. data/lib/decidim/core/test/shared_examples/has_taxonomies.rb +94 -0
  365. data/lib/decidim/core/test/shared_examples/manage_share_tokens_examples.rb +237 -0
  366. data/lib/decidim/core/test/shared_examples/map_examples.rb +2 -0
  367. data/lib/decidim/core/test/shared_examples/open_data_exporter_examples.rb +102 -0
  368. data/lib/decidim/core/test/shared_examples/participatory_space_members_page_examples.rb +46 -0
  369. data/lib/decidim/core/test/shared_examples/participatory_space_search_examples.rb +98 -0
  370. data/lib/decidim/core/test/shared_examples/permissions.rb +7 -7
  371. data/lib/decidim/core/test/shared_examples/preview_with_share_token_examples.rb +94 -0
  372. data/lib/decidim/core/test/shared_examples/reports_examples.rb +60 -5
  373. data/lib/decidim/core/test/shared_examples/resource_endorsed_event_examples.rb +2 -2
  374. data/lib/decidim/core/test/shared_examples/resource_search_examples.rb +75 -69
  375. data/lib/decidim/core/test/shared_examples/searchable_resources_shared_context.rb +1 -1
  376. data/lib/decidim/core/test/shared_examples/simple_event.rb +33 -19
  377. data/lib/decidim/core/test/shared_examples/social_share_examples.rb +46 -0
  378. data/lib/decidim/core/test/shared_examples/softdeleteable_components_examples.rb +173 -0
  379. data/lib/decidim/core/test/shared_examples/system_endorse_resource_examples.rb +54 -8
  380. data/lib/decidim/core/test/shared_examples/taxonomizable_interface_examples.rb +20 -0
  381. data/lib/decidim/core/test/shared_examples/taxonomizable_resource_examples.rb +37 -0
  382. data/lib/decidim/core/test/shared_examples/taxonomy_settings.rb +49 -0
  383. data/lib/decidim/core/test/shared_examples/translated_event_examples.rb +1 -1
  384. data/lib/decidim/core/test/shared_examples/versions_controller_examples.rb +2 -2
  385. data/lib/decidim/core/test/shared_examples/with_endorsable_permissions_examples.rb +1 -1
  386. data/lib/decidim/core/test.rb +9 -5
  387. data/lib/decidim/core/version.rb +1 -1
  388. data/lib/decidim/core.rb +58 -0
  389. data/lib/decidim/download_your_data_serializers/download_your_data_identity_serializer.rb +0 -4
  390. data/lib/decidim/download_your_data_serializers/download_your_data_participatory_space_private_user_serializer.rb +3 -1
  391. data/lib/decidim/download_your_data_serializers/download_your_data_report_serializer.rb +2 -1
  392. data/lib/decidim/download_your_data_serializers/download_your_data_user_serializer.rb +6 -7
  393. data/lib/decidim/download_your_data_serializers.rb +19 -0
  394. data/lib/decidim/exporters/csv.rb +6 -0
  395. data/lib/decidim/exporters/export_manifest.rb +14 -0
  396. data/lib/decidim/exporters/pdf.rb +26 -22
  397. data/lib/decidim/filter_form_builder.rb +12 -15
  398. data/lib/decidim/form_builder.rb +6 -129
  399. data/lib/decidim/has_category.rb +5 -1
  400. data/lib/decidim/has_private_users.rb +4 -0
  401. data/lib/decidim/has_taxonomy_settings.rb +47 -0
  402. data/lib/decidim/has_upload_validations.rb +1 -1
  403. data/lib/decidim/legacy_form_builder.rb +118 -0
  404. data/lib/decidim/maintenance/import_models/application_record.rb +93 -0
  405. data/lib/decidim/maintenance/import_models/area.rb +82 -0
  406. data/lib/decidim/maintenance/import_models/area_type.rb +12 -0
  407. data/lib/decidim/maintenance/import_models/assembly_type.rb +49 -0
  408. data/lib/decidim/maintenance/import_models/categorization.rb +14 -0
  409. data/lib/decidim/maintenance/import_models/category.rb +139 -0
  410. data/lib/decidim/maintenance/import_models/participatory_process_type.rb +21 -0
  411. data/lib/decidim/maintenance/import_models/scope.rb +163 -0
  412. data/lib/decidim/maintenance/import_models.rb +19 -0
  413. data/lib/decidim/maintenance/taxonomy_importer.rb +142 -0
  414. data/lib/decidim/maintenance/taxonomy_plan.rb +78 -0
  415. data/lib/decidim/maintenance.rb +12 -0
  416. data/lib/decidim/map/autocomplete.rb +52 -8
  417. data/lib/decidim/map/dynamic_map.rb +1 -1
  418. data/lib/decidim/map/provider/dynamic_map/here.rb +1 -40
  419. data/lib/decidim/map/provider/geocoding/here.rb +9 -3
  420. data/lib/decidim/map.rb +3 -6
  421. data/lib/decidim/moderation_tools.rb +29 -5
  422. data/lib/decidim/newsletter_encryptor.rb +1 -1
  423. data/lib/decidim/paddable.rb +1 -1
  424. data/lib/decidim/participable.rb +10 -10
  425. data/lib/decidim/participatory_space_user.rb +10 -0
  426. data/lib/decidim/private_download_helper.rb +15 -0
  427. data/lib/decidim/record_encryptor.rb +51 -46
  428. data/lib/decidim/resourceable.rb +16 -0
  429. data/lib/decidim/seeds.rb +18 -20
  430. data/lib/decidim/settings_manifest.rb +34 -1
  431. data/lib/decidim/soft_deletable.rb +17 -0
  432. data/lib/decidim/taxonomizable.rb +72 -0
  433. data/lib/decidim/view_model.rb +0 -1
  434. data/lib/tasks/decidim_download_your_data_tasks.rake +2 -4
  435. data/lib/tasks/decidim_procfile.rake +6 -0
  436. data/lib/tasks/decidim_tasks.rake +1 -0
  437. data/lib/tasks/decidim_taxonomies.rake +160 -0
  438. data/lib/tasks/upgrade/{decidim_fix_categorization.rake → clean.rake} +25 -18
  439. data/lib/tasks/upgrade/clean_hidden_resources.rake +33 -0
  440. data/lib/tasks/upgrade/decidim_active_storage_migration_tasks.rake +1 -1
  441. data/lib/tasks/upgrade/migrations.rake +94 -0
  442. metadata +198 -103
  443. data/app/cells/decidim/amendable/amenders_list/show.erb +0 -0
  444. data/app/cells/decidim/content_blocks/base/content.erb +0 -0
  445. data/app/cells/decidim/endorsers_list/full_endorsers_list.erb +0 -3
  446. data/app/cells/decidim/endorsers_list_button/content.erb +0 -1
  447. data/app/cells/decidim/endorsers_list_button_cell.rb +0 -15
  448. data/app/cells/decidim/scopes_picker/scope_picker_prompt.erb +0 -3
  449. data/app/cells/decidim/scopes_picker/scope_picker_values.erb +0 -5
  450. data/app/cells/decidim/scopes_picker/show.erb +0 -14
  451. data/app/cells/decidim/scopes_picker_cell.rb +0 -92
  452. data/app/commands/decidim/update_user_interests.rb +0 -41
  453. data/app/controllers/decidim/scopes_controller.rb +0 -84
  454. data/app/controllers/decidim/user_interests_controller.rb +0 -30
  455. data/app/forms/decidim/user_interest_scope_form.rb +0 -25
  456. data/app/forms/decidim/user_interests_form.rb +0 -17
  457. data/app/helpers/decidim/categories_helper.rb +0 -26
  458. data/app/helpers/decidim/scopes_helper.rb +0 -105
  459. data/app/packs/images/decidim/vendor/leaflet/layers-2x.png +0 -0
  460. data/app/packs/images/decidim/vendor/leaflet/layers.png +0 -0
  461. data/app/packs/images/decidim/vendor/leaflet/marker-icon-2x.png +0 -0
  462. data/app/packs/images/decidim/vendor/leaflet/marker-icon.png +0 -0
  463. data/app/packs/images/decidim/vendor/leaflet/marker-shadow.png +0 -0
  464. data/app/packs/src/decidim/vendor/leaflet-tilelayer-here.js +0 -212
  465. data/app/packs/stylesheets/decidim/legacy/MarkerCluster.Default.scss +0 -67
  466. data/app/packs/stylesheets/decidim/legacy/MarkerCluster.scss +0 -18
  467. data/app/packs/stylesheets/decidim/legacy/leaflet.scss +0 -705
  468. data/app/validators/scope_belongs_to_component_validator.rb +0 -16
  469. data/app/views/decidim/account/_user_groups.html.erb +0 -0
  470. data/app/views/decidim/scopes/_scopes_picker_input.html.erb +0 -19
  471. data/app/views/decidim/scopes/picker.html.erb +0 -53
  472. data/app/views/decidim/shared/_comments.html.erb +0 -0
  473. data/app/views/decidim/shared/_share_modal.html.erb +0 -26
  474. data/app/views/decidim/shared/_tags.html.erb +0 -1
  475. data/app/views/decidim/user_interests/_areas.html.erb +0 -14
  476. data/app/views/decidim/user_interests/_scopes.html.erb +0 -22
  477. data/app/views/decidim/user_interests/show.html.erb +0 -22
  478. data/config/initializers/foundation_rails_helper.rb +0 -4
  479. data/lib/decidim/core/test/shared_examples/has_category.rb +0 -38
  480. data/lib/decidim/core/test/shared_examples/has_scope.rb +0 -11
  481. data/lib/decidim/core/test/shared_examples/manage_component_share_tokens.rb +0 -83
  482. data/lib/decidim/core/test/shared_examples/preview_component_with_share_token_examples.rb +0 -49
  483. data/lib/decidim/core/test/shared_examples/scope_helper_examples.rb +0 -93
  484. data/lib/decidim/seven_zip_wrapper.rb +0 -29
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ class ResourceHistoryCell < Decidim::ViewModel
5
+ def show
6
+ render
7
+ end
8
+
9
+ def history_items
10
+ return @history_items if @history_items.present?
11
+
12
+ @history_items = []
13
+ linked_resources_items.each do |item|
14
+ add_linked_resources_items(item[:resources], item)
15
+ end
16
+
17
+ @history_items << creation_item if @history_items.any?
18
+
19
+ @history_items.sort_by! { |item| item[:date] }
20
+ end
21
+
22
+ # return an unique id to identify the type of history cell
23
+ def history_cell_id
24
+ raise NotImplementedError
25
+ end
26
+
27
+ # return an array of linked resources to show in the history
28
+ def linked_resources_items
29
+ raise NotImplementedError
30
+ end
31
+
32
+ # return the creation item to show in the history, it will be added only if there are linked resources
33
+ def creation_item
34
+ raise NotImplementedError
35
+ end
36
+
37
+ def render?
38
+ linked_resources_items.any? { |item| item[:resources].present? }
39
+ end
40
+
41
+ private
42
+
43
+ def add_linked_resources_items(resources, options)
44
+ return if resources.blank?
45
+
46
+ resources.each do |resource|
47
+ title = decidim_sanitize_translated(resource.title)
48
+ url = resource_locator(resource).path
49
+ link = link_to(title, url, class: "underline decoration-current text-secondary font-semibold")
50
+
51
+ @history_items << {
52
+ id: "#{options[:link_name]}_#{resource.id}",
53
+ date: resource.updated_at,
54
+ text: t(options[:text_key], scope: "activerecord.models", link:),
55
+ icon: resource_type_icon_key(options[:icon_key])
56
+ }
57
+ end
58
+ end
59
+
60
+ def history_items_contains?(link_name)
61
+ return false if @history_items.blank?
62
+
63
+ @history_items.any? { |item| item[:id].include?(link_name.to_s) }
64
+ end
65
+ end
66
+ end
@@ -4,10 +4,6 @@ module Decidim
4
4
  class ShareButtonCell < ButtonCell
5
5
  private
6
6
 
7
- def button_classes
8
- "button button__sm button__text-secondary"
9
- end
10
-
11
7
  def text
12
8
  t("decidim.shared.share_modal.share")
13
9
  end
@@ -0,0 +1,26 @@
1
+ <%= decidim_modal id: "socialShare", class: "share-modal" do %>
2
+ <div data-dialog-container>
3
+ <%= icon "share-line" %>
4
+ <h2 id="dialog-title-socialShare" tabindex="-1" data-dialog-title><%= t("share", scope: "decidim.shared.share_modal") %></h2>
5
+ <div>
6
+ <%= social_share_button_tag(decidim_page_title,
7
+ url: decidim_meta_url,
8
+ image: decidim_meta_image_url,
9
+ desc: decidim_html_escape(decidim_meta_description || ""),
10
+ via: decidim_meta_twitter_handler) %>
11
+
12
+ <div class="share-modal__input">
13
+ <input id="urlShareLink" type="text" title="<%= t("share_link" , scope: "decidim.shared.share_modal") %>" value="<%= resource_name ? short_url(route_name: resource_name, params:) : decidim_meta_url %>" readonly>
14
+ <button type="button"
15
+ class="button button__sm button__text-secondary"
16
+ data-clipboard-copy="#urlShareLink"
17
+ data-clipboard-copy-label="<%= t("copy_share_link_copied", scope: "decidim.shared.share_modal") %>"
18
+ data-clipboard-copy-message="<%= t("copy_share_link_message", scope: "decidim.shared.share_modal") %>"
19
+ title="<%= t("copy_share_link_clarification", scope: "decidim.shared.share_modal") %>">
20
+ <span><%= t("copy_share_link", scope: "decidim.shared.share_modal") %></span>
21
+ <%= icon "file-copy-line" %>
22
+ </button>
23
+ </div>
24
+ </div>
25
+ </div>
26
+ <% end %>
@@ -0,0 +1,2 @@
1
+ <%= cell("decidim/share_button", model) %>
2
+ <%= render :modal %>
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ class ShareWidgetCell < Decidim::ViewModel
5
+ include Decidim::ShortLinkHelper
6
+ include Decidim::SocialShareButtonHelper
7
+
8
+ def show
9
+ render
10
+ end
11
+
12
+ private
13
+
14
+ def resource_name
15
+ return "budget_project" if model.is_a?(Decidim::Budgets::Project)
16
+
17
+ model.class.name.demodulize.underscore
18
+ end
19
+ end
20
+ end
@@ -1,4 +1,7 @@
1
- <%= content_tag :ul, class: tags_classes, data: { tags: "" } do %>
2
- <%= content_tag :li, link_to_tag(category_path, category_name, t("decidim.tags.filter_results_for_category", resource: category_name)) if category? %>
3
- <%= content_tag :li, link_to_tag(scope_path, scope_name, t("decidim.tags.filter_results_for_scope", resource: scope_name)) if scope? %>
4
- <% end %>
1
+ <section class="layout-main__section">
2
+ <%= content_tag :ul, class: tags_classes, data: { tags: "" } do %>
3
+ <% taxonomies.each do |tax| %>
4
+ <%= content_tag :li, link_to_tag(tax[:url], tax[:name], t("decidim.tags.filter_results_for_taxonomy", resource: tax[:name])) %>
5
+ <% end %>
6
+ <% end %>
7
+ </section>
@@ -1,24 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Decidim
4
- # This cell renders the category of a resource
4
+ # This cell renders the taxonomies of a resource
5
5
  # shown with the translated name and links to
6
6
  # the resource parent `component` and `participatory space` index.
7
7
  # The context `resource` must be present
8
8
  # example use inside another `cell`:
9
- # <%= cell("decidim/category", model.category, context: {resource: model}) %>
9
+ # <%= cell("decidim/tags", model.taxonomies, context: {resource: model}) %>
10
10
  #
11
11
  class TagsCell < Decidim::ViewModel
12
12
  def show
13
- render if category? || scope?
14
- end
15
-
16
- def category
17
- render if category?
18
- end
19
-
20
- def scope
21
- render if scope?
13
+ render if taxonomies.any?
22
14
  end
23
15
 
24
16
  private
@@ -27,27 +19,14 @@ module Decidim
27
19
  (["tag-container"] + context[:extra_classes].to_a).join(" ")
28
20
  end
29
21
 
30
- def category?
31
- model.category.present?
32
- end
33
-
34
- # deprecated
35
- def link_to_category
36
- accessible_title = t("decidim.tags.filter_results_for_category", resource: category_name)
22
+ def taxonomies
23
+ return [] unless model.respond_to?(:taxonomies)
37
24
 
38
- link_to category_path, title: accessible_title, class: "tag" do
39
- sr_title = content_tag(
40
- :span,
41
- accessible_title,
42
- class: "sr-only"
43
- )
44
- display_title = content_tag(
45
- :span,
46
- category_name,
47
- "aria-hidden": true
48
- )
49
-
50
- sr_title + display_title
25
+ @taxonomies ||= model.taxonomies.map do |taxonomy|
26
+ {
27
+ name: decidim_sanitize_translated(taxonomy.name),
28
+ url: resource_locator(model).index(filter: { "with_any_taxonomies[#{taxonomy.root_taxonomy.id}]" => [taxonomy.id.to_s] })
29
+ }
51
30
  end
52
31
  end
53
32
 
@@ -68,48 +47,8 @@ module Decidim
68
47
  end
69
48
  end
70
49
 
71
- def category_name
72
- decidim_html_escape model.category.translated_name
73
- end
74
-
75
- def category_path
76
- resource_locator(model).index(filter: { filter_param(:category) => [model.category.id.to_s] })
77
- end
78
-
79
- def scope?
80
- has_visible_scopes?(model)
81
- end
82
-
83
- # deprecated
84
- def link_to_scope
85
- accessible_title = t("decidim.tags.filter_results_for_scope", resource: scope_name)
86
-
87
- link_to scope_path, title: accessible_title, class: "tag" do
88
- sr_title = content_tag(
89
- :span,
90
- accessible_title,
91
- class: "sr-only"
92
- )
93
- display_title = content_tag(
94
- :span,
95
- scope_name,
96
- "aria-hidden": true
97
- )
98
-
99
- sr_title + display_title
100
- end
101
- end
102
-
103
- def scope_name
104
- translated_attribute model.scope.name
105
- end
106
-
107
- def scope_path
108
- resource_locator(model).index(filter: { filter_param(:scope) => [model.scope.id] })
109
- end
110
-
111
50
  def filter_param(name)
112
- candidates = ["with_any_#{name}".to_sym, "with_#{name}".to_sym]
51
+ candidates = [:"with_any_#{name}", :"with_#{name}"]
113
52
  return candidates.first unless controller.respond_to?(:default_filter_params, true)
114
53
 
115
54
  available_params = controller.send(:default_filter_params)
@@ -4,7 +4,7 @@ module Decidim
4
4
  module Amendable
5
5
  # A command with all the business logic when a user starts amending a resource.
6
6
  class CreateDraft < Decidim::Command
7
- delegate :current_user, to: :form
7
+ delegate :current_user, :current_organization, to: :form
8
8
 
9
9
  # Public: Initializes the command.
10
10
  #
@@ -53,8 +53,8 @@ module Decidim
53
53
  emendation.title = { I18n.locale => form.emendation_params.with_indifferent_access[:title] }
54
54
  emendation.body = { I18n.locale => form.emendation_params.with_indifferent_access[:body] }
55
55
  emendation.component = amendable.component
56
+ emendation.taxonomies = amendable.taxonomies if amendable.respond_to?(:taxonomies)
56
57
  emendation.add_author(current_user, user_group)
57
- emendation.category = amendable.category if amendable.respond_to?(:category)
58
58
  emendation.save!
59
59
  emendation
60
60
  end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ # A command with all the business logic to create an ephemeral user.
5
+ class CreateEphemeralUser < Decidim::Command
6
+ # Public: Initializes the command.
7
+ #
8
+ # form - A form object with the params.
9
+ def initialize(form)
10
+ @form = form
11
+ end
12
+
13
+ # Executes the command. Broadcasts these events:
14
+ #
15
+ # - :ok when everything is valid.
16
+ # - :invalid if the form was not valid and we could not proceed.
17
+ #
18
+ # Returns nothing.
19
+ def call
20
+ return broadcast(:invalid) if form.invalid?
21
+
22
+ create_user!
23
+ confirm_user
24
+
25
+ broadcast(:ok, @user)
26
+ rescue ActiveRecord::RecordInvalid
27
+ broadcast(:invalid)
28
+ end
29
+
30
+ private
31
+
32
+ attr_reader :form
33
+
34
+ def create_user!
35
+ # The user is saved with tos_agreement to true but in the verification
36
+ # phase the tos_agreement will be mandatory for ephemeral users
37
+ @user = User.create!(
38
+ name: form.name,
39
+ nickname: form.nickname,
40
+ organization: form.organization,
41
+ locale: form.locale,
42
+ tos_agreement: true,
43
+ managed: true,
44
+ extended_data: { ephemeral: true, verified: form.verified }
45
+ )
46
+ end
47
+
48
+ def confirm_user
49
+ @user.confirm
50
+ end
51
+ end
52
+ end
@@ -36,6 +36,8 @@ module Decidim
36
36
  trigger_omniauth_registration
37
37
 
38
38
  broadcast(:ok, @user)
39
+ rescue NeedTosAcceptance
40
+ broadcast(:add_tos_errors, @user)
39
41
  rescue ActiveRecord::RecordInvalid => e
40
42
  broadcast(:error, e.record)
41
43
  end
@@ -73,10 +75,12 @@ module Decidim
73
75
  file = url.open
74
76
  @user.avatar.attach(io: file, filename:)
75
77
  end
78
+ @user.tos_agreement = form.tos_agreement
79
+ @user.accepted_tos_version = Time.current
80
+ raise NeedTosAcceptance if @user.tos_agreement.blank?
81
+
76
82
  @user.skip_confirmation! if verified_email
77
- @user.tos_agreement = "1"
78
83
  @user.save!
79
-
80
84
  @user.after_confirmation if verified_email
81
85
  end
82
86
  end
@@ -129,11 +133,17 @@ module Decidim
129
133
  name: form.name,
130
134
  nickname: form.normalized_nickname,
131
135
  avatar_url: form.avatar_url,
132
- raw_data: form.raw_data
136
+ raw_data: form.raw_data,
137
+ tos_agreement: form.tos_agreement,
138
+ newsletter_notifications_at: form.newsletter_at,
139
+ accepted_tos_version: form.current_organization.tos_version
133
140
  )
134
141
  end
135
142
  end
136
143
 
144
+ class NeedTosAcceptance < StandardError
145
+ end
146
+
137
147
  class InvalidOauthSignature < StandardError
138
148
  end
139
149
  end
@@ -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
@@ -84,9 +84,5 @@ module Decidim
84
84
  ReportedMailer.hide(moderator, @report).deliver_later
85
85
  end
86
86
  end
87
-
88
- def participatory_space
89
- @participatory_space ||= @reportable.component&.participatory_space || @reportable.try(:participatory_space)
90
- end
91
87
  end
92
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
@@ -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