decidim-core 0.29.4 → 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 (562) hide show
  1. checksums.yaml +4 -4
  2. data/app/cells/decidim/address/show.erb +3 -3
  3. data/app/cells/decidim/amendable/amend_button_card/show.erb +6 -4
  4. data/app/cells/decidim/amendable/amend_button_card_cell.rb +8 -0
  5. data/app/cells/decidim/amendable/amendments/show.erb +1 -1
  6. data/app/cells/decidim/amendable/promote_button_card/show.erb +2 -0
  7. data/app/cells/decidim/author/flag.erb +6 -0
  8. data/app/cells/decidim/author/flag_user.erb +14 -0
  9. data/app/cells/decidim/author/show.erb +4 -2
  10. data/app/cells/decidim/author_cell.rb +1 -1
  11. data/app/cells/decidim/card_l/extra_data.erb +1 -0
  12. data/app/cells/decidim/card_metadata_cell.rb +9 -16
  13. data/app/cells/decidim/comments_button_cell.rb +14 -2
  14. data/app/cells/decidim/content_blocks/highlighted_elements_cell.rb +2 -0
  15. data/app/cells/decidim/content_blocks/highlighted_elements_with_cell_for_list_cell.rb +1 -1
  16. data/app/cells/decidim/content_blocks/participatory_space_extra_data/extra_data.erb +2 -2
  17. data/app/cells/decidim/endorsement_block/show.erb +0 -1
  18. data/app/cells/decidim/endorsement_block_cell.rb +6 -0
  19. data/app/cells/decidim/endorsement_buttons/button_content.erb +1 -1
  20. data/app/cells/decidim/endorsement_buttons/select_identity_button.erb +1 -1
  21. data/app/cells/decidim/endorsement_buttons/show.erb +7 -7
  22. data/app/cells/decidim/endorsement_buttons/verification_modal.erb +4 -2
  23. data/app/cells/decidim/endorsers_list/empty.erb +3 -0
  24. data/app/cells/decidim/endorsers_list/full.erb +17 -5
  25. data/app/cells/decidim/endorsers_list/show.erb +19 -10
  26. data/app/cells/decidim/endorsers_list_cell.rb +19 -6
  27. data/app/cells/decidim/flag_modal/flag_user.erb +34 -0
  28. data/app/cells/decidim/flag_modal/show.erb +52 -0
  29. data/app/cells/decidim/flag_modal_cell.rb +56 -0
  30. data/app/cells/decidim/follow_button/show.erb +1 -2
  31. data/app/cells/decidim/follow_button_cell.rb +5 -0
  32. data/app/cells/decidim/map/show.erb +3 -0
  33. data/app/cells/decidim/map/template.erb +14 -0
  34. data/app/cells/decidim/map_cell.rb +39 -0
  35. data/app/cells/decidim/notification_actions/buttons_cell.rb +1 -1
  36. data/app/cells/decidim/onboarding_action_message/show.erb +15 -0
  37. data/app/cells/decidim/onboarding_action_message_cell.rb +81 -0
  38. data/app/cells/decidim/participatory_space_dropdown_metadata/metadata.erb +4 -4
  39. data/app/cells/decidim/participatory_space_dropdown_metadata/show.erb +3 -5
  40. data/app/cells/decidim/participatory_space_private_user/show.erb +23 -0
  41. data/app/cells/decidim/participatory_space_private_user_cell.rb +21 -0
  42. data/app/cells/decidim/profile_actions/show.erb +1 -1
  43. data/app/cells/decidim/profile_sidebar/show.erb +167 -0
  44. data/app/cells/decidim/profile_sidebar_cell.rb +68 -0
  45. data/app/cells/decidim/progress_bar/show.erb +2 -2
  46. data/app/cells/decidim/report_button/already_reported_modal.erb +2 -2
  47. data/app/cells/decidim/report_button/flag_modal.erb +27 -13
  48. data/app/cells/decidim/report_button_cell.rb +9 -2
  49. data/app/cells/decidim/resource_history/show.erb +20 -0
  50. data/app/cells/decidim/resource_history_cell.rb +66 -0
  51. data/app/cells/decidim/resource_types_filter/show.erb +1 -1
  52. data/app/cells/decidim/resource_types_filter_cell.rb +6 -6
  53. data/app/cells/decidim/share_button_cell.rb +0 -4
  54. data/app/cells/decidim/share_widget/modal.erb +26 -0
  55. data/app/cells/decidim/share_widget/show.erb +2 -0
  56. data/app/cells/decidim/share_widget_cell.rb +20 -0
  57. data/app/cells/decidim/tags/show.erb +7 -4
  58. data/app/cells/decidim/tags_cell.rb +11 -72
  59. data/app/cells/decidim/user_activity/show.erb +1 -1
  60. data/app/commands/decidim/amendable/create_draft.rb +2 -2
  61. data/app/commands/decidim/create_ephemeral_user.rb +52 -0
  62. data/app/commands/decidim/create_omniauth_registration.rb +21 -17
  63. data/app/commands/decidim/create_report.rb +8 -11
  64. data/app/commands/decidim/create_user_group.rb +6 -2
  65. data/app/commands/decidim/destroy_ephemeral_user.rb +47 -0
  66. data/app/commands/decidim/invite_user.rb +1 -1
  67. data/app/commands/decidim/search.rb +0 -14
  68. data/app/commands/decidim/update_account.rb +11 -3
  69. data/app/commands/decidim/update_notifications_settings.rb +1 -0
  70. data/app/commands/decidim/update_resources_taxonomies.rb +67 -0
  71. data/app/commands/decidim/update_user_group.rb +7 -1
  72. data/app/constraints/decidim/current_component.rb +1 -1
  73. data/app/controllers/concerns/decidim/ajax_permission_handler.rb +21 -0
  74. data/app/controllers/concerns/decidim/devise_authentication_methods.rb +3 -6
  75. data/app/controllers/concerns/decidim/devise_controllers.rb +2 -0
  76. data/app/controllers/concerns/decidim/disable_redirection_to_external_host.rb +1 -1
  77. data/app/controllers/concerns/decidim/ephemeral_session_checker.rb +87 -0
  78. data/app/controllers/concerns/decidim/filter_resource.rb +4 -2
  79. data/app/controllers/concerns/decidim/has_members_page.rb +25 -0
  80. data/app/controllers/concerns/decidim/headers/browser_feature_permissions.rb +50 -0
  81. data/app/controllers/concerns/decidim/locale_switcher.rb +2 -2
  82. data/app/controllers/concerns/decidim/needs_password_change.rb +0 -1
  83. data/app/controllers/concerns/decidim/needs_permission.rb +2 -1
  84. data/app/controllers/concerns/decidim/needs_tos_accepted.rb +4 -5
  85. data/app/controllers/concerns/decidim/onboarding_action_methods.rb +52 -0
  86. data/app/controllers/concerns/decidim/participatory_space_context.rb +1 -4
  87. data/app/controllers/decidim/application_controller.rb +10 -0
  88. data/app/controllers/decidim/authorization_modals_controller.rb +8 -2
  89. data/app/controllers/decidim/components/base_controller.rb +3 -7
  90. data/app/controllers/decidim/devise/confirmations_controller.rb +4 -0
  91. data/app/controllers/decidim/devise/omniauth_registrations_controller.rb +8 -1
  92. data/app/controllers/decidim/devise/registrations_controller.rb +1 -1
  93. data/app/controllers/decidim/devise/sessions_controller.rb +2 -0
  94. data/app/controllers/decidim/download_your_data_controller.rb +33 -2
  95. data/app/controllers/decidim/editor_images_controller.rb +1 -11
  96. data/app/controllers/decidim/follows_controller.rb +1 -1
  97. data/app/controllers/decidim/geolocation_controller.rb +19 -0
  98. data/app/controllers/decidim/homepage_controller.rb +0 -1
  99. data/app/controllers/decidim/open_data_controller.rb +33 -8
  100. data/app/controllers/decidim/profiles_controller.rb +2 -2
  101. data/app/controllers/decidim/reports_controller.rb +2 -7
  102. data/app/controllers/decidim/user_activities_controller.rb +1 -1
  103. data/app/controllers/decidim/user_conversations_controller.rb +1 -11
  104. data/app/events/decidim/soft_delete_resource_event.rb +15 -0
  105. data/app/forms/decidim/account_form.rb +2 -5
  106. data/app/forms/decidim/amendable/form.rb +4 -2
  107. data/app/forms/decidim/ephemeral_user_form.rb +22 -0
  108. data/app/forms/decidim/notifications_settings_form.rb +1 -0
  109. data/app/forms/decidim/omniauth_registration_form.rb +15 -2
  110. data/app/forms/decidim/registration_form.rb +1 -1
  111. data/app/helpers/concerns/decidim/flash_helper_extensions.rb +17 -2
  112. data/app/helpers/decidim/action_authorization_helper.rb +75 -14
  113. data/app/helpers/decidim/amendments_helper.rb +0 -9
  114. data/app/helpers/decidim/application_helper.rb +6 -2
  115. data/app/helpers/decidim/breadcrumb_helper.rb +6 -0
  116. data/app/helpers/decidim/cache_helper.rb +1 -1
  117. data/app/helpers/decidim/check_boxes_tree_helper.rb +25 -53
  118. data/app/helpers/decidim/decidim_form_helper.rb +0 -44
  119. data/app/helpers/decidim/endorsable_helper.rb +0 -10
  120. data/app/helpers/decidim/layout_helper.rb +6 -0
  121. data/app/helpers/decidim/menu_helper.rb +2 -2
  122. data/app/helpers/decidim/messaging/conversation_helper.rb +2 -3
  123. data/app/helpers/decidim/meta_tags_helper.rb +32 -23
  124. data/app/helpers/decidim/modal_helper.rb +23 -0
  125. data/app/helpers/decidim/omniauth_helper.rb +5 -5
  126. data/app/helpers/decidim/onboarding_action_helper.rb +13 -0
  127. data/app/helpers/decidim/orders_helper.rb +1 -2
  128. data/app/helpers/decidim/paginate_helper.rb +1 -1
  129. data/app/helpers/decidim/participatory_space_helpers.rb +1 -1
  130. data/app/helpers/decidim/passwords_helper.rb +2 -2
  131. data/app/helpers/decidim/taxonomies_helper.rb +40 -0
  132. data/app/helpers/decidim/tooltip_helper.rb +1 -4
  133. data/app/jobs/decidim/download_your_data_export_job.rb +2 -19
  134. data/app/jobs/decidim/event_publisher_job.rb +18 -9
  135. data/app/jobs/decidim/export_job.rb +5 -1
  136. data/app/jobs/decidim/export_participatory_space_job.rb +4 -1
  137. data/app/jobs/decidim/open_data_job.rb +4 -4
  138. data/app/mailers/decidim/export_mailer.rb +7 -12
  139. data/app/mailers/decidim/notifications_digest_mailer.rb +1 -7
  140. data/app/mailers/decidim/reported_mailer.rb +2 -18
  141. data/app/models/decidim/action_log.rb +20 -1
  142. data/app/models/decidim/category.rb +4 -0
  143. data/app/models/decidim/component.rb +25 -3
  144. data/app/models/decidim/metric.rb +2 -1
  145. data/app/models/decidim/moderation.rb +16 -0
  146. data/app/models/decidim/newsletter.rb +12 -8
  147. data/app/models/decidim/organization.rb +7 -3
  148. data/app/models/decidim/participatory_space_private_user.rb +20 -0
  149. data/app/models/decidim/private_export.rb +24 -0
  150. data/app/models/decidim/push_notification_message.rb +1 -1
  151. data/app/models/decidim/report.rb +1 -1
  152. data/app/models/decidim/scope.rb +4 -0
  153. data/app/models/decidim/share_token.rb +36 -10
  154. data/app/models/decidim/taxonomization.rb +23 -0
  155. data/app/models/decidim/taxonomy.rb +139 -0
  156. data/app/models/decidim/taxonomy_filter.rb +130 -0
  157. data/app/models/decidim/taxonomy_filter_item.rb +33 -0
  158. data/app/models/decidim/user.rb +13 -23
  159. data/app/models/decidim/user_base_entity.rb +12 -4
  160. data/app/models/decidim/user_moderation.rb +9 -0
  161. data/app/models/decidim/user_report.rb +4 -0
  162. data/app/packs/entrypoints/decidim_core.js +1 -0
  163. data/app/packs/entrypoints/decidim_geocoding.js +2 -0
  164. data/app/packs/images/decidim/brands/facebook.svg +10 -0
  165. data/app/packs/images/decidim/brands/google.svg +7 -1
  166. data/app/packs/images/decidim/brands/twitter-x.svg +3 -0
  167. data/app/packs/src/decidim/check_boxes_tree.js +0 -1
  168. data/app/packs/src/decidim/clipboard.js +18 -9
  169. data/app/packs/src/decidim/confirm.js +79 -59
  170. data/app/packs/src/decidim/datepicker/datepicker_functions.js +3 -3
  171. data/app/packs/src/decidim/decidim_application.js +1 -0
  172. data/app/packs/src/decidim/form_remote.js +1 -1
  173. data/app/packs/src/decidim/geocoding/reverse_geocoding.js +60 -0
  174. data/app/packs/src/decidim/impersonation.js +1 -1
  175. data/app/packs/src/decidim/index.js +13 -5
  176. data/app/packs/src/decidim/input_character_counter.js +1 -1
  177. data/app/packs/src/decidim/map/provider/here.js +1 -1
  178. data/app/packs/src/decidim/onboarding_pending_action.js +24 -0
  179. data/app/packs/src/decidim/session_timeouter.js +1 -1
  180. data/app/packs/src/decidim/sticky_footer.js +29 -0
  181. data/app/packs/src/decidim/sticky_header.js +6 -31
  182. data/app/packs/src/decidim/user_registrations.js +13 -0
  183. data/app/packs/src/decidim/utilities/dom.js +148 -0
  184. data/app/packs/src/decidim/vendor/leaflet-tilelayer-here.js +212 -0
  185. data/app/packs/stylesheets/decidim/_accordion.scss +30 -0
  186. data/app/packs/stylesheets/decidim/_buttons.scss +19 -0
  187. data/app/packs/stylesheets/decidim/_cards.scss +1 -1
  188. data/app/packs/stylesheets/decidim/_content_blocks.scss +0 -4
  189. data/app/packs/stylesheets/decidim/_dropdown.scss +1 -1
  190. data/app/packs/stylesheets/decidim/_endorsers_list.scss +26 -20
  191. data/app/packs/stylesheets/decidim/_forms.scss +2 -2
  192. data/app/packs/stylesheets/decidim/_header.scss +37 -60
  193. data/app/packs/stylesheets/decidim/_layout.scss +32 -2
  194. data/app/packs/stylesheets/decidim/_login.scss +53 -6
  195. data/app/packs/stylesheets/decidim/_modal.scss +42 -0
  196. data/app/packs/stylesheets/decidim/_modal_tos_refuse.scss +4 -0
  197. data/app/packs/stylesheets/decidim/_participatory_spaces.scss +46 -0
  198. data/app/packs/stylesheets/decidim/_profile.scss +1 -1
  199. data/app/packs/stylesheets/decidim/_success_image.scss +64 -0
  200. data/app/packs/stylesheets/decidim/_tribute.scss +36 -0
  201. data/app/packs/stylesheets/decidim/application.scss +1 -1
  202. data/app/packs/stylesheets/decidim/geocoding_addons.scss +5 -0
  203. data/app/packs/stylesheets/decidim/map.scss +7 -10
  204. data/app/packs/stylesheets/decidim/resource_history.scss +31 -0
  205. data/app/permissions/decidim/default_permissions.rb +0 -2
  206. data/app/permissions/decidim/permissions.rb +8 -2
  207. data/app/presenters/decidim/admin_log/base_user_presenter.rb +67 -0
  208. data/app/presenters/decidim/admin_log/component_presenter.rb +32 -3
  209. data/app/presenters/decidim/admin_log/moderation_presenter.rb +30 -3
  210. data/app/presenters/decidim/admin_log/share_token_presenter.rb +39 -0
  211. data/app/presenters/decidim/admin_log/taxonomy_filter_presenter.rb +57 -0
  212. data/app/presenters/decidim/admin_log/taxonomy_presenter.rb +48 -0
  213. data/app/presenters/decidim/admin_log/user_group_presenter.rb +6 -6
  214. data/app/presenters/decidim/admin_log/user_presenter.rb +4 -18
  215. data/app/presenters/decidim/log/user_presenter.rb +0 -1
  216. data/app/presenters/decidim/log/value_types/date_presenter.rb +1 -0
  217. data/app/presenters/decidim/log/value_types/taxonomy_presenter.rb +29 -0
  218. data/app/presenters/decidim/notification_to_mailer_presenter.rb +3 -7
  219. data/app/presenters/decidim/participatory_space_private_user_presenter.rb +50 -0
  220. data/app/presenters/decidim/taxonomy_filter_presenter.rb +19 -0
  221. data/app/presenters/decidim/taxonomy_presenter.rb +14 -0
  222. data/app/presenters/decidim/user_presenter.rb +1 -1
  223. data/app/queries/decidim/last_activity.rb +0 -25
  224. data/app/queries/decidim/metrics/blocked_users_metric_manage.rb +2 -2
  225. data/app/queries/decidim/metrics/users_metric_manage.rb +2 -2
  226. data/app/queries/decidim/public_activities.rb +1 -12
  227. data/app/queries/decidim/stats_users_count.rb +2 -2
  228. data/app/resolvers/decidim/meta_image_url_resolver.rb +128 -0
  229. data/app/serializers/decidim/exporters/open_data_blocked_user_serializer.rb +25 -0
  230. data/app/serializers/decidim/exporters/open_data_metric_serializer.rb +22 -0
  231. data/app/serializers/decidim/exporters/open_data_moderation_serializer.rb +30 -0
  232. data/app/serializers/decidim/exporters/open_data_taxonomy_serializer.rb +30 -0
  233. data/app/serializers/decidim/exporters/open_data_user_group_serializer.rb +38 -0
  234. data/app/serializers/decidim/exporters/open_data_user_serializer.rb +39 -0
  235. data/app/serializers/decidim/exporters/participatory_space_serializer.rb +104 -0
  236. data/app/serializers/decidim/exporters/serializer.rb +25 -0
  237. data/app/serializers/decidim/schema_org_breadcrumb_list_serializer.rb +52 -0
  238. data/app/services/decidim/action_authorizer.rb +32 -3
  239. data/app/services/decidim/base_diff_renderer.rb +1 -3
  240. data/app/services/decidim/download_your_data_exporter.rb +58 -24
  241. data/app/services/decidim/onboarding_manager.rb +272 -0
  242. data/app/services/decidim/open_data_exporter.rb +139 -13
  243. data/app/services/decidim/static_map_generator.rb +1 -1
  244. data/app/services/decidim/traceability.rb +13 -0
  245. data/app/uploaders/decidim/application_uploader.rb +1 -1
  246. data/app/validators/etiquette_validator.rb +9 -2
  247. data/app/validators/passthru_validator.rb +1 -1
  248. data/app/validators/translated_etiquette_validator.rb +32 -0
  249. data/app/views/decidim/account/_password_fields.html.erb +2 -2
  250. data/app/views/decidim/application/_accordion_section.html.erb +14 -0
  251. data/app/views/decidim/application/_collection.html.erb +30 -18
  252. data/app/views/decidim/devise/omniauth_registrations/new.html.erb +5 -1
  253. data/app/views/decidim/devise/omniauth_registrations/new_tos_fields.html.erb +29 -0
  254. data/app/views/decidim/devise/registrations/new.html.erb +10 -22
  255. data/app/views/decidim/devise/sessions/new.html.erb +24 -29
  256. data/app/views/decidim/devise/shared/_omniauth_buttons.html.erb +2 -4
  257. data/app/views/decidim/devise/shared/_tos_fields.html.erb +16 -0
  258. data/app/views/decidim/download_your_data/_export.html.erb +15 -0
  259. data/app/views/decidim/download_your_data/show.html.erb +51 -5
  260. data/app/views/decidim/endorsements/update_buttons_and_counters.js.erb +16 -19
  261. data/app/views/decidim/export_mailer/download_your_data_export.html.erb +2 -2
  262. data/app/views/decidim/export_mailer/export.html.erb +5 -1
  263. data/app/views/decidim/last_activities/index.html.erb +1 -1
  264. data/app/views/decidim/messaging/conversations/_reply_form.html.erb +2 -1
  265. data/app/views/decidim/messaging/conversations/_start.html.erb +1 -1
  266. data/app/views/decidim/notifications_settings/show.html.erb +22 -0
  267. data/app/views/decidim/open_data/_how_to_open_accordion_section.html.erb +15 -0
  268. data/app/views/decidim/open_data/index.html.erb +108 -0
  269. data/app/views/decidim/pages/show.html.erb +2 -1
  270. data/app/views/decidim/participatory_space_private_users/_participatory_space_private_user.html.erb +1 -0
  271. data/app/views/decidim/reported_mailer/hide.html.erb +9 -0
  272. data/app/views/decidim/reported_mailer/report.html.erb +1 -1
  273. data/app/views/decidim/searches/_count.html.erb +1 -1
  274. data/app/views/decidim/searches/_filters.html.erb +38 -40
  275. data/app/views/decidim/shared/_login_modal.html.erb +26 -20
  276. data/app/views/decidim/shared/_orders.html.erb +2 -2
  277. data/app/views/decidim/shared/_resource_actions.html.erb +21 -0
  278. data/app/views/decidim/shared/_results_per_page.html.erb +1 -1
  279. data/app/views/decidim/shared/filters/_check_boxes_tree.html.erb +1 -2
  280. data/app/views/decidim/shared/filters/_collection.html.erb +1 -1
  281. data/app/views/decidim/shared/filters/_dropdown_label.html.erb +7 -4
  282. data/app/views/kaminari/decidim/_page.html.erb +1 -1
  283. data/app/views/kaminari/decidim/_paginator.html.erb +1 -1
  284. data/app/views/layouts/decidim/_application.html.erb +0 -1
  285. data/app/views/layouts/decidim/_js_configuration.html.erb +1 -0
  286. data/app/views/layouts/decidim/_logo.html.erb +2 -2
  287. data/app/views/layouts/decidim/_logo_mobile.html.erb +1 -1
  288. data/app/views/layouts/decidim/_meta_tags_config.html.erb +6 -11
  289. data/app/views/layouts/decidim/_schema_org_breadcrumb_list.html.erb +3 -0
  290. data/app/views/layouts/decidim/_wrapper.html.erb +15 -9
  291. data/app/views/layouts/decidim/footer/_main_legal.html.erb +1 -1
  292. data/app/views/layouts/decidim/footer/_main_links.html.erb +1 -1
  293. data/app/views/layouts/decidim/header/_close_ephemeral_session.html.erb +25 -0
  294. data/app/views/layouts/decidim/header/_main.html.erb +14 -10
  295. data/app/views/layouts/decidim/header/_menu_breadcrumb_items.html.erb +2 -0
  296. data/app/views/layouts/decidim/header/_menu_breadcrumb_main_dropdown_desktop.html.erb +11 -5
  297. data/app/views/layouts/decidim/header/_menu_breadcrumb_mobile_tablet.html.erb +5 -5
  298. data/app/views/layouts/decidim/shared/_layout_item.html.erb +1 -1
  299. data/config/assets.rb +2 -1
  300. data/config/locales/ar.yml +35 -74
  301. data/config/locales/bg.yml +33 -74
  302. data/config/locales/bs-BA.yml +0 -2
  303. data/config/locales/ca.yml +370 -102
  304. data/config/locales/cs.yml +374 -102
  305. data/config/locales/de.yml +350 -88
  306. data/config/locales/el.yml +22 -58
  307. data/config/locales/en.yml +350 -82
  308. data/config/locales/eo.yml +0 -4
  309. data/config/locales/es-MX.yml +364 -99
  310. data/config/locales/es-PY.yml +369 -104
  311. data/config/locales/es.yml +370 -102
  312. data/config/locales/eu.yml +426 -156
  313. data/config/locales/fi-plain.yml +366 -76
  314. data/config/locales/fi.yml +370 -77
  315. data/config/locales/fr-CA.yml +176 -97
  316. data/config/locales/fr.yml +176 -94
  317. data/config/locales/ga-IE.yml +4 -25
  318. data/config/locales/gl.yml +20 -58
  319. data/config/locales/hu.yml +30 -62
  320. data/config/locales/id-ID.yml +21 -57
  321. data/config/locales/is-IS.yml +5 -25
  322. data/config/locales/it.yml +36 -94
  323. data/config/locales/ja.yml +231 -112
  324. data/config/locales/lb.yml +28 -76
  325. data/config/locales/lt.yml +24 -64
  326. data/config/locales/lv.yml +21 -58
  327. data/config/locales/nl.yml +23 -75
  328. data/config/locales/no.yml +23 -70
  329. data/config/locales/pl.yml +30 -72
  330. data/config/locales/pt-BR.yml +41 -63
  331. data/config/locales/pt.yml +23 -70
  332. data/config/locales/ro-RO.yml +115 -184
  333. data/config/locales/ru.yml +13 -43
  334. data/config/locales/sk.yml +24 -70
  335. data/config/locales/sl.yml +0 -4
  336. data/config/locales/sr-CS.yml +0 -2
  337. data/config/locales/sv.yml +138 -106
  338. data/config/locales/tr-TR.yml +29 -75
  339. data/config/locales/uk.yml +6 -29
  340. data/config/locales/zh-CN.yml +21 -68
  341. data/config/locales/zh-TW.yml +23 -62
  342. data/config/routes.rb +4 -10
  343. data/db/migrate/20171212103803_create_unique_nicknames.rb +1 -1
  344. data/db/migrate/20180221101934_fix_nickname_index.rb +1 -1
  345. data/db/migrate/20180706104107_add_nickname_to_managed_users.rb +1 -1
  346. data/db/migrate/20181001124950_move_users_groups_to_users_table.rb +1 -1
  347. data/db/migrate/20181025082245_add_timestamps_to_components.rb +2 -0
  348. data/db/migrate/20190412131728_fix_user_names.rb +1 -1
  349. data/db/migrate/20240628111905_add_visible_to_components.rb +7 -0
  350. data/db/migrate/20240704115429_create_decidim_taxonomies.rb +23 -0
  351. data/db/migrate/20240717093514_add_registered_only_to_decidim_share_tokens.rb +7 -0
  352. data/db/migrate/20240722215500_change_object_changes_on_versions.rb +39 -0
  353. data/db/migrate/20240806065417_create_decidim_taxonomy_filters.rb +23 -0
  354. data/db/migrate/20240822161348_add_deleted_at_to_decidim_components.rb +8 -0
  355. data/db/migrate/20240906162524_add_part_of_to_taxonomies.rb +26 -0
  356. data/db/migrate/20241001135825_add_role_to_participatory_space_private_users.rb +7 -0
  357. data/db/migrate/20241001140408_add_published_to_participatory_space_private_users.rb +7 -0
  358. data/db/migrate/20241022002600_create_private_exports.rb +18 -0
  359. data/db/migrate/20241028114430_add_component_counter_to_taxonomy_filters.rb +7 -0
  360. data/db/migrate/20241111104357_add_names_and_space_boolean_to_taxonomy_filters.rb +9 -0
  361. data/db/migrate/20241127093708_add_taxonomy_to_metrics.rb +7 -0
  362. data/db/migrate/20241204121445_add_participatory_space_manifests_from_taxonomy_filters.rb +9 -0
  363. data/decidim-core.gemspec +14 -17
  364. data/lib/decidim/action_authorization.rb +3 -2
  365. data/lib/decidim/amendable.rb +1 -1
  366. data/lib/decidim/api/input_filters/category_input_filter.rb +5 -3
  367. data/lib/decidim/api/input_filters/component_input_filter.rb +33 -20
  368. data/lib/decidim/api/input_filters/user_entity_input_filter.rb +53 -44
  369. data/lib/decidim/api/input_sorts/component_input_sort.rb +15 -13
  370. data/lib/decidim/api/input_sorts/user_entity_input_sort.rb +4 -4
  371. data/lib/decidim/api/interfaces/author_interface.rb +3 -2
  372. data/lib/decidim/api/interfaces/coauthorable_interface.rb +5 -5
  373. data/lib/decidim/api/interfaces/endorsable_interface.rb +2 -2
  374. data/lib/decidim/api/interfaces/participatory_space_interface.rb +5 -10
  375. data/lib/decidim/api/interfaces/taxonomizable_interface.rb +13 -0
  376. data/lib/decidim/api/types/amendment_type.rb +5 -7
  377. data/lib/decidim/api/types/area_api_type.rb +3 -3
  378. data/lib/decidim/api/types/attachment_type.rb +3 -3
  379. data/lib/decidim/api/types/category_type.rb +2 -2
  380. data/lib/decidim/api/types/decidim_type.rb +5 -1
  381. data/lib/decidim/api/types/fingerprint_type.rb +1 -1
  382. data/lib/decidim/api/types/localized_string_type.rb +1 -1
  383. data/lib/decidim/api/types/metric_history_type.rb +2 -0
  384. data/lib/decidim/api/types/metric_type.rb +1 -1
  385. data/lib/decidim/api/types/organization_type.rb +5 -0
  386. data/lib/decidim/api/types/participatory_space_link_type.rb +2 -2
  387. data/lib/decidim/api/types/participatory_space_manifest_type.rb +1 -1
  388. data/lib/decidim/api/types/quantifiable_translated_field_type.rb +1 -1
  389. data/lib/decidim/api/types/scope_api_type.rb +2 -3
  390. data/lib/decidim/api/types/session_type.rb +1 -2
  391. data/lib/decidim/api/types/taxonomy_type.rb +15 -0
  392. data/lib/decidim/api/types/trace_version_type.rb +2 -2
  393. data/lib/decidim/api/types/translated_field_type.rb +3 -5
  394. data/lib/decidim/api/types/user_group_type.rb +7 -20
  395. data/lib/decidim/api/types/user_type.rb +7 -20
  396. data/lib/decidim/asset_router/storage.rb +6 -11
  397. data/lib/decidim/assets/tailwind/tailwind.config.js.erb +2 -1
  398. data/lib/decidim/attachment_attributes.rb +1 -1
  399. data/lib/decidim/attribute_encryptor.rb +1 -1
  400. data/lib/decidim/attribute_object/nested_validator.rb +1 -1
  401. data/lib/decidim/attributes/integer_with_units.rb +27 -0
  402. data/lib/decidim/attributes/time_with_zone.rb +1 -5
  403. data/lib/decidim/attributes.rb +2 -0
  404. data/lib/decidim/authorization_form_builder.rb +0 -7
  405. data/lib/decidim/coauthorable.rb +1 -1
  406. data/lib/decidim/command.rb +3 -3
  407. data/lib/decidim/commands/destroy_resource.rb +5 -1
  408. data/lib/decidim/commands/resource_handler.rb +2 -2
  409. data/lib/decidim/commands/restore_resource.rb +45 -0
  410. data/lib/decidim/commands/soft_delete_resource.rb +63 -0
  411. data/lib/decidim/component_manifest.rb +7 -0
  412. data/lib/decidim/content_parsers/blob_parser.rb +8 -10
  413. data/lib/decidim/content_parsers/user_parser.rb +1 -1
  414. data/lib/decidim/core/api.rb +2 -0
  415. data/lib/decidim/core/engine.rb +21 -7
  416. data/lib/decidim/core/menu.rb +0 -5
  417. data/lib/decidim/core/seeds.rb +42 -2
  418. data/lib/decidim/core/test/factories.rb +105 -2
  419. data/lib/decidim/core/test/shared_examples/admin_resource_gallery_examples.rb +85 -0
  420. data/lib/decidim/core/test/shared_examples/comments_examples.rb +393 -38
  421. data/lib/decidim/core/test/shared_examples/components_controller_hide_shared_examples.rb +11 -0
  422. data/lib/decidim/core/test/shared_examples/components_controller_reorder_shared_examples.rb +21 -0
  423. data/lib/decidim/core/test/shared_examples/download_open_data_shared_context.rb +36 -0
  424. data/lib/decidim/core/test/shared_examples/download_open_data_shared_examples.rb +45 -0
  425. data/lib/decidim/core/test/shared_examples/download_your_data_shared_examples.rb +17 -0
  426. data/lib/decidim/core/test/shared_examples/etiquette_validator_examples.rb +25 -0
  427. data/lib/decidim/core/test/shared_examples/follows_examples.rb +43 -0
  428. data/lib/decidim/core/test/shared_examples/has_taxonomies.rb +94 -0
  429. data/lib/decidim/core/test/shared_examples/manage_share_tokens_examples.rb +237 -0
  430. data/lib/decidim/core/test/shared_examples/map_examples.rb +2 -0
  431. data/lib/decidim/core/test/shared_examples/open_data_exporter_examples.rb +102 -0
  432. data/lib/decidim/core/test/shared_examples/participatory_space_members_page_examples.rb +46 -0
  433. data/lib/decidim/core/test/shared_examples/participatory_space_search_examples.rb +98 -0
  434. data/lib/decidim/core/test/shared_examples/permissions.rb +7 -7
  435. data/lib/decidim/core/test/shared_examples/preview_with_share_token_examples.rb +94 -0
  436. data/lib/decidim/core/test/shared_examples/reports_examples.rb +15 -53
  437. data/lib/decidim/core/test/shared_examples/resource_endorsed_event_examples.rb +2 -2
  438. data/lib/decidim/core/test/shared_examples/resource_search_examples.rb +75 -69
  439. data/lib/decidim/core/test/shared_examples/searchable_resources_shared_context.rb +1 -1
  440. data/lib/decidim/core/test/shared_examples/simple_event.rb +33 -19
  441. data/lib/decidim/core/test/shared_examples/social_share_examples.rb +7 -14
  442. data/lib/decidim/core/test/shared_examples/softdeleteable_components_examples.rb +173 -0
  443. data/lib/decidim/core/test/shared_examples/system_endorse_resource_examples.rb +54 -8
  444. data/lib/decidim/core/test/shared_examples/taxonomizable_interface_examples.rb +20 -0
  445. data/lib/decidim/core/test/shared_examples/taxonomizable_resource_examples.rb +37 -0
  446. data/lib/decidim/core/test/shared_examples/taxonomy_settings.rb +49 -0
  447. data/lib/decidim/core/test/shared_examples/translated_event_examples.rb +1 -1
  448. data/lib/decidim/core/test/shared_examples/uncommentable_component_examples.rb +0 -26
  449. data/lib/decidim/core/test/shared_examples/versions_controller_examples.rb +2 -28
  450. data/lib/decidim/core/test/shared_examples/with_endorsable_permissions_examples.rb +1 -1
  451. data/lib/decidim/core/test.rb +9 -5
  452. data/lib/decidim/core/version.rb +1 -1
  453. data/lib/decidim/core.rb +58 -0
  454. data/lib/decidim/download_your_data_serializers/download_your_data_identity_serializer.rb +0 -4
  455. data/lib/decidim/download_your_data_serializers/download_your_data_participatory_space_private_user_serializer.rb +3 -1
  456. data/lib/decidim/download_your_data_serializers/download_your_data_report_serializer.rb +2 -1
  457. data/lib/decidim/download_your_data_serializers/download_your_data_user_serializer.rb +6 -7
  458. data/lib/decidim/download_your_data_serializers.rb +19 -0
  459. data/lib/decidim/exporters/csv.rb +6 -0
  460. data/lib/decidim/exporters/export_manifest.rb +14 -0
  461. data/lib/decidim/exporters/pdf.rb +26 -22
  462. data/lib/decidim/filter_form_builder.rb +12 -15
  463. data/lib/decidim/form_builder.rb +6 -129
  464. data/lib/decidim/has_category.rb +5 -1
  465. data/lib/decidim/has_private_users.rb +4 -0
  466. data/lib/decidim/has_taxonomy_settings.rb +47 -0
  467. data/lib/decidim/has_upload_validations.rb +1 -1
  468. data/lib/decidim/legacy_form_builder.rb +118 -0
  469. data/lib/decidim/maintenance/import_models/application_record.rb +93 -0
  470. data/lib/decidim/maintenance/import_models/area.rb +82 -0
  471. data/lib/decidim/maintenance/import_models/area_type.rb +12 -0
  472. data/lib/decidim/maintenance/import_models/assembly_type.rb +49 -0
  473. data/lib/decidim/maintenance/import_models/categorization.rb +14 -0
  474. data/lib/decidim/maintenance/import_models/category.rb +107 -0
  475. data/lib/decidim/maintenance/import_models/participatory_process_type.rb +21 -0
  476. data/lib/decidim/maintenance/import_models/scope.rb +163 -0
  477. data/lib/decidim/maintenance/import_models.rb +19 -0
  478. data/lib/decidim/maintenance/taxonomy_importer.rb +132 -0
  479. data/lib/decidim/maintenance/taxonomy_plan.rb +78 -0
  480. data/lib/decidim/maintenance.rb +12 -0
  481. data/lib/decidim/map/autocomplete.rb +52 -8
  482. data/lib/decidim/map/dynamic_map.rb +1 -1
  483. data/lib/decidim/map/provider/dynamic_map/here.rb +40 -1
  484. data/lib/decidim/map/provider/geocoding/here.rb +9 -3
  485. data/lib/decidim/map/provider/static_map/here.rb +0 -34
  486. data/lib/decidim/map.rb +3 -6
  487. data/lib/decidim/moderation_tools.rb +16 -19
  488. data/lib/decidim/newsletter_encryptor.rb +1 -1
  489. data/lib/decidim/nicknamizable.rb +9 -6
  490. data/lib/decidim/paddable.rb +1 -1
  491. data/lib/decidim/participable.rb +10 -10
  492. data/lib/decidim/participatory_space_user.rb +10 -0
  493. data/lib/decidim/private_download_helper.rb +15 -0
  494. data/lib/decidim/record_encryptor.rb +51 -46
  495. data/lib/decidim/reportable.rb +2 -6
  496. data/lib/decidim/resourceable.rb +16 -0
  497. data/lib/decidim/seeds.rb +18 -20
  498. data/lib/decidim/settings_manifest.rb +34 -1
  499. data/lib/decidim/soft_deletable.rb +17 -0
  500. data/lib/decidim/taxonomizable.rb +72 -0
  501. data/lib/decidim/translatable_attributes.rb +1 -5
  502. data/lib/decidim/view_model.rb +0 -1
  503. data/lib/tasks/decidim_download_your_data_tasks.rake +2 -4
  504. data/lib/tasks/decidim_procfile.rake +6 -0
  505. data/lib/tasks/decidim_tasks.rake +1 -0
  506. data/lib/tasks/decidim_taxonomies.rake +155 -0
  507. data/lib/tasks/upgrade/{decidim_fix_categorization.rake → clean.rake} +25 -18
  508. data/lib/tasks/upgrade/decidim_active_storage_migration_tasks.rake +1 -1
  509. data/lib/tasks/upgrade/decidim_fix_nickname_uniqueness.rake +20 -23
  510. data/lib/tasks/upgrade/migrations.rake +91 -0
  511. metadata +203 -112
  512. data/app/cells/decidim/amendable/amenders_list/show.erb +0 -0
  513. data/app/cells/decidim/content_blocks/base/content.erb +0 -0
  514. data/app/cells/decidim/endorsers_list/full_endorsers_list.erb +0 -3
  515. data/app/cells/decidim/endorsers_list_button/content.erb +0 -1
  516. data/app/cells/decidim/endorsers_list_button_cell.rb +0 -15
  517. data/app/cells/decidim/report_user_button/already_reported_modal.erb +0 -11
  518. data/app/cells/decidim/report_user_button/flag_modal.erb +0 -46
  519. data/app/cells/decidim/report_user_button/show.erb +0 -2
  520. data/app/cells/decidim/report_user_button_cell.rb +0 -59
  521. data/app/cells/decidim/scopes_picker/scope_picker_prompt.erb +0 -3
  522. data/app/cells/decidim/scopes_picker/scope_picker_values.erb +0 -5
  523. data/app/cells/decidim/scopes_picker/show.erb +0 -14
  524. data/app/cells/decidim/scopes_picker_cell.rb +0 -92
  525. data/app/commands/decidim/update_user_interests.rb +0 -41
  526. data/app/controllers/decidim/scopes_controller.rb +0 -84
  527. data/app/controllers/decidim/user_interests_controller.rb +0 -30
  528. data/app/forms/decidim/user_interest_scope_form.rb +0 -25
  529. data/app/forms/decidim/user_interests_form.rb +0 -17
  530. data/app/helpers/decidim/categories_helper.rb +0 -26
  531. data/app/helpers/decidim/scopes_helper.rb +0 -105
  532. data/app/jobs/decidim/hide_child_resources_job.rb +0 -24
  533. data/app/packs/images/decidim/vendor/leaflet/layers-2x.png +0 -0
  534. data/app/packs/images/decidim/vendor/leaflet/layers.png +0 -0
  535. data/app/packs/images/decidim/vendor/leaflet/marker-icon-2x.png +0 -0
  536. data/app/packs/images/decidim/vendor/leaflet/marker-icon.png +0 -0
  537. data/app/packs/images/decidim/vendor/leaflet/marker-shadow.png +0 -0
  538. data/app/packs/stylesheets/decidim/_hashtags.scss +0 -5
  539. data/app/packs/stylesheets/decidim/legacy/MarkerCluster.Default.scss +0 -67
  540. data/app/packs/stylesheets/decidim/legacy/MarkerCluster.scss +0 -18
  541. data/app/packs/stylesheets/decidim/legacy/leaflet.scss +0 -705
  542. data/app/validators/scope_belongs_to_component_validator.rb +0 -16
  543. data/app/views/decidim/account/_user_groups.html.erb +0 -0
  544. data/app/views/decidim/reported_mailer/hidden_automatically.html.erb +0 -25
  545. data/app/views/decidim/reported_mailer/hidden_manually.html.erb +0 -25
  546. data/app/views/decidim/scopes/_scopes_picker_input.html.erb +0 -19
  547. data/app/views/decidim/scopes/picker.html.erb +0 -53
  548. data/app/views/decidim/shared/_comments.html.erb +0 -0
  549. data/app/views/decidim/shared/_share_modal.html.erb +0 -26
  550. data/app/views/decidim/shared/_tags.html.erb +0 -1
  551. data/app/views/decidim/user_interests/_areas.html.erb +0 -14
  552. data/app/views/decidim/user_interests/_scopes.html.erb +0 -22
  553. data/app/views/decidim/user_interests/show.html.erb +0 -22
  554. data/config/initializers/foundation_rails_helper.rb +0 -4
  555. data/config/locales/ca-IT.yml +0 -2122
  556. data/lib/decidim/core/test/shared_examples/has_category.rb +0 -38
  557. data/lib/decidim/core/test/shared_examples/has_scope.rb +0 -11
  558. data/lib/decidim/core/test/shared_examples/manage_component_share_tokens.rb +0 -83
  559. data/lib/decidim/core/test/shared_examples/preview_component_with_share_token_examples.rb +0 -49
  560. data/lib/decidim/core/test/shared_examples/scope_helper_examples.rb +0 -93
  561. data/lib/decidim/seven_zip_wrapper.rb +0 -29
  562. data/lib/tasks/upgrade/clean_hidden_resources.rake +0 -33
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Exporters
5
+ class OpenDataMetricSerializer < Decidim::Exporters::Serializer
6
+ # Public: Initializes the serializer with a resource
7
+ def initialize(resource)
8
+ @resource = resource
9
+ end
10
+
11
+ # Public: Exports a hash with the serialized data for this resource.
12
+ def serialize
13
+ {
14
+ day: resource.day,
15
+ metric_type: resource.metric_type,
16
+ cumulative: resource.cumulative,
17
+ quantity: resource.quantity
18
+ }
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Exporters
5
+ class OpenDataModerationSerializer < Decidim::Exporters::Serializer
6
+ # Public: Initializes the serializer with a resource
7
+ def initialize(resource)
8
+ @resource = resource
9
+ end
10
+
11
+ # Public: Exports a hash with the serialized data for this resource.
12
+ def serialize
13
+ {
14
+ id: resource.id,
15
+ hidden_at: resource.hidden_at,
16
+ report_count: resource.report_count,
17
+ reported_url: resource.reportable.reported_content_url,
18
+ reportable_type: resource.decidim_reportable_type,
19
+ reportable_id: resource.decidim_reportable_id,
20
+ reported_content: resource.reported_content,
21
+ reports: {
22
+ reasons: resource.reports.map(&:reason),
23
+ locale: resource.reports.map(&:locale),
24
+ details: resource.reports.map(&:details)
25
+ }
26
+ }
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Exporters
5
+ class OpenDataTaxonomySerializer < Decidim::Exporters::Serializer
6
+ # Public: Initializes the serializer with a resource
7
+ def initialize(resource)
8
+ @resource = resource
9
+ end
10
+
11
+ # Public: Exports a hash with the serialized data for this resource.
12
+ def serialize
13
+ {
14
+ id: resource.id,
15
+ name: resource.name,
16
+ parent_id: resource.parent_id,
17
+ weight: resource.weight,
18
+ children_count: resource.children_count,
19
+ taxonomizations_count: resource.taxonomizations_count,
20
+ created_at: resource.created_at,
21
+ updated_at: resource.updated_at,
22
+ filters_count: resource.filters_count,
23
+ filter_items_count: resource.filter_items_count,
24
+ part_of: resource.part_of,
25
+ is_root: resource.root?
26
+ }
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Exporters
5
+ class OpenDataUserGroupSerializer < Decidim::Exporters::Serializer
6
+ # Public: Initializes the serializer with a resource
7
+ def initialize(resource)
8
+ @resource = resource
9
+ end
10
+
11
+ # Public: Exports a hash with the serialized data for this resource.
12
+ def serialize
13
+ {
14
+ id: resource.id,
15
+ name: presented.name,
16
+ nickname: presented.nickname,
17
+ avatar_url: presented.avatar_url(:thumb),
18
+ profile_url: presented.profile_url,
19
+ deleted: presented.deleted?,
20
+ badge: presented.badge,
21
+ members_count: resource.accepted_memberships.count,
22
+ members: {
23
+ id: resource.accepted_users.collect(&:id),
24
+ name: resource.accepted_users.collect(&:name)
25
+ }
26
+ }
27
+ end
28
+
29
+ private
30
+
31
+ attr_reader :resource
32
+
33
+ def presented
34
+ @presented ||= resource.presenter
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Exporters
5
+ class OpenDataUserSerializer < Decidim::Exporters::Serializer
6
+ # Public: Initializes the serializer with a resource
7
+ def initialize(resource)
8
+ @resource = resource
9
+ end
10
+
11
+ # Public: Exports a hash with the serialized data for this resource.
12
+ def serialize
13
+ {
14
+ id: resource.id,
15
+ name: presented.name,
16
+ nickname: presented.nickname,
17
+ about: presented.about,
18
+ avatar_url: presented.avatar_url(:thumb),
19
+ profile_url: presented.profile_url,
20
+ direct_messages_enabled: (resource.direct_message_types != "followed-only"),
21
+ deleted: presented.deleted?,
22
+ badge: presented.badge,
23
+ groups: {
24
+ id: resource.accepted_user_groups.collect(&:id),
25
+ name: resource.accepted_user_groups.collect(&:name)
26
+ }
27
+ }
28
+ end
29
+
30
+ private
31
+
32
+ attr_reader :resource
33
+
34
+ def presented
35
+ @presented ||= resource.presenter
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,104 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Exporters
5
+ # This class serves as the base class for the serializers that export
6
+ # participatory spaces.
7
+ class ParticipatorySpaceSerializer < Decidim::Exporters::Serializer
8
+ include Decidim::ApplicationHelper
9
+ include Decidim::ResourceHelper
10
+ include Decidim::TranslationsHelper
11
+
12
+ # Public: Initializes the serializer with a resource
13
+ def initialize(resource)
14
+ @resource = resource
15
+ end
16
+
17
+ # Public: Exports a hash with the serialized data for this resource.
18
+ def serialize
19
+ {
20
+ id: resource.id,
21
+ title: resource.title,
22
+ slug: resource.slug,
23
+ reference: resource.reference,
24
+ created_at: resource.created_at,
25
+ updated_at: resource.updated_at,
26
+ published_at: resource.published_at,
27
+ follows_count: resource.follows_count,
28
+ hashtag: resource.hashtag,
29
+ short_description: resource.short_description,
30
+ description: resource.description,
31
+ promoted: resource.promoted
32
+ }
33
+ end
34
+
35
+ private
36
+
37
+ attr_reader :resource
38
+
39
+ def serialize_categories
40
+ return unless resource.categories.first_class.any?
41
+
42
+ resource.categories.first_class.map do |category|
43
+ {
44
+ id: category.try(:id),
45
+ name: category.try(:name),
46
+ description: category.try(:description),
47
+ parent_id: category.try(:parent_id),
48
+ subcategories: serialize_subcategories(category.subcategories)
49
+ }
50
+ end
51
+ end
52
+
53
+ def serialize_subcategories(subcategories)
54
+ return unless subcategories.any?
55
+
56
+ subcategories.map do |subcategory|
57
+ {
58
+ id: subcategory.try(:id),
59
+ name: subcategory.try(:name),
60
+ description: subcategory.try(:description),
61
+ parent_id: subcategory.try(:parent_id)
62
+ }
63
+ end
64
+ end
65
+
66
+ def serialize_attachment_collections
67
+ return unless resource.attachment_collections.any?
68
+
69
+ resource.attachment_collections.map do |collection|
70
+ {
71
+ id: collection.try(:id),
72
+ name: collection.try(:name),
73
+ weight: collection.try(:weight),
74
+ description: collection.try(:description)
75
+ }
76
+ end
77
+ end
78
+
79
+ def serialize_attachments
80
+ return unless resource.attachments.any?
81
+
82
+ resource.attachments.map do |attachment|
83
+ {
84
+ id: attachment.try(:id),
85
+ title: attachment.try(:title),
86
+ weight: attachment.try(:weight),
87
+ description: attachment.try(:description),
88
+ attachment_collection: {
89
+ name: attachment.attachment_collection.try(:name),
90
+ weight: attachment.attachment_collection.try(:weight),
91
+ description: attachment.attachment_collection.try(:description)
92
+ },
93
+ remote_file_url: Decidim::AttachmentPresenter.new(attachment).attachment_file_url
94
+ }
95
+ end
96
+ end
97
+
98
+ def serialize_components
99
+ serializer = Decidim::Exporters::ParticipatorySpaceComponentsSerializer.new(resource)
100
+ serializer.run
101
+ end
102
+ end
103
+ end
104
+ end
@@ -54,6 +54,31 @@ module Decidim
54
54
  def event_name
55
55
  ActiveSupport::Inflector.underscore(self.class.to_s).sub("/", ".serialize.").gsub("/", ".")
56
56
  end
57
+
58
+ protected
59
+
60
+ delegate :component, to: :resource
61
+
62
+ def profile_url(user)
63
+ return "" if user.respond_to?(:deleted?) && user.deleted?
64
+
65
+ EngineRouter.new("decidim", { host: }).profile_url(user.nickname)
66
+ end
67
+
68
+ def root_url
69
+ Decidim::Core::Engine.routes.url_helpers.root_url(host:)
70
+ end
71
+
72
+ def host
73
+ resource.organization.host
74
+ end
75
+
76
+ # helper method to serialize taxonomies for any resource
77
+ def taxonomies
78
+ {
79
+ ids: resource.taxonomies.map(&:id)
80
+ }.merge(resource.taxonomies.to_h { |taxonomy| [taxonomy.id, taxonomy.name] })
81
+ end
57
82
  end
58
83
  end
59
84
  end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "uri"
4
+
5
+ module Decidim
6
+ class SchemaOrgBreadcrumbListSerializer < Decidim::Exporters::Serializer
7
+ include Decidim::SanitizeHelper
8
+
9
+ # Public: Initializes the serializer with a list of breadcrumb items.
10
+ def initialize(options)
11
+ @breadcrumb_items = options[:breadcrumb_items]
12
+ @base_url = options[:base_url]
13
+ @organization_name = options[:organization_name]
14
+ end
15
+
16
+ # Serializes a breadcrumb items list for the Schema.org BreadcrumbList type
17
+ #
18
+ # @see https://schema.org/BreadcrumbList
19
+ # @see https://developers.google.com/search/docs/appearance/structured-data/breadcrumb?hl=en
20
+ def serialize
21
+ return {} if breadcrumb_items.none? { |item| item.has_key?(:url) }
22
+
23
+ {
24
+ "@context": "https://schema.org",
25
+ "@type": "BreadcrumbList",
26
+ name: "#{organization_name} breadcrumb",
27
+ itemListElement: breadcrumb_items_serialized
28
+ }
29
+ end
30
+
31
+ private
32
+
33
+ attr_reader :breadcrumb_items, :base_url, :organization_name
34
+
35
+ def breadcrumb_items_serialized
36
+ all_items = []
37
+
38
+ breadcrumb_items.each_with_index do |item, index|
39
+ next if item.empty?
40
+
41
+ all_items << {
42
+ "@type": "ListItem",
43
+ position: index + 1,
44
+ name: decidim_sanitize_translated(item[:label]),
45
+ item: URI.join(base_url, item[:url]).to_s
46
+ }
47
+ end
48
+
49
+ all_items
50
+ end
51
+ end
52
+ end
@@ -88,23 +88,32 @@ module Decidim
88
88
  def unauthorized?
89
89
  @code == :unauthorized
90
90
  end
91
+
92
+ def ephemeral?
93
+ @authorization_handler.ephemeral?
94
+ end
91
95
  end
92
96
 
93
97
  class AuthorizationStatusCollection
94
98
  attr_reader :statuses
95
99
 
96
100
  def initialize(authorization_handlers, user, component, resource)
101
+ @ephemeral_user = user&.ephemeral?
97
102
  @authorization_handlers = authorization_handlers
98
- @statuses = authorization_handlers&.map do |name, opts|
103
+ @statuses = authorization_handlers&.filter_map do |name, opts|
99
104
  handler = Verifications::Adapter.from_element(name)
105
+ next if @ephemeral_user && !handler.ephemeral?
106
+
100
107
  authorization = user ? Verifications::Authorizations.new(organization: user.organization, user:, name:).first : nil
101
108
  status_code, data = handler.authorize(authorization, opts["options"], component, resource)
102
109
  AuthorizationStatus.new(status_code, handler, data)
103
- end
110
+ end || []
104
111
  end
105
112
 
106
113
  def ok?
107
- return true if statuses.blank?
114
+ # When no statuses are present for the action ephemeral users
115
+ # are not allowed to perform the action
116
+ return !@ephemeral_user if statuses.blank?
108
117
 
109
118
  statuses.all?(&:ok?)
110
119
  end
@@ -126,6 +135,26 @@ module Decidim
126
135
  def codes
127
136
  @codes ||= statuses.map(&:code)
128
137
  end
138
+
139
+ def pending_authorizations_count
140
+ return 0 if @statuses.blank?
141
+
142
+ @statuses.count
143
+ end
144
+
145
+ def single_authorization_required?
146
+ pending_authorizations_count == 1 && [:ok, :unauthorized].exclude?(global_code)
147
+ end
148
+
149
+ def ephemeral?
150
+ return if statuses.blank?
151
+
152
+ statuses.all?(&:ephemeral?)
153
+ end
154
+
155
+ def user_pending?
156
+ !global_code && statuses.any? { |status| [:missing, :expired, :incomplete].include?(status.code) }
157
+ end
129
158
  end
130
159
 
131
160
  class AuthorizationError < StandardError; end
@@ -41,14 +41,12 @@ module Decidim
41
41
  end
42
42
 
43
43
  def parse_i18n_changeset(attribute, values, type, diff)
44
- return diff unless values.last.is_a?(Hash)
45
-
46
44
  (values.last.keys - ["machine_translations"]).each do |locale, _value|
47
45
  first_value = values.first.try(:[], locale)
48
46
  last_value = values.last.try(:[], locale)
49
47
  next if first_value == last_value
50
48
 
51
- attribute_locale = "#{attribute}_#{locale}".to_sym
49
+ attribute_locale = :"#{attribute}_#{locale}"
52
50
  diff.update(
53
51
  attribute_locale => {
54
52
  type:,
@@ -1,41 +1,52 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "decidim/seven_zip_wrapper"
4
-
5
3
  module Decidim
6
- # Public: Generates a 7z(seven zip) file with data files ready to be persisted
4
+ # Public: Generates a zip archive with data files ready to be persisted
7
5
  # somewhere so users can download their data.
8
6
  #
9
- # In fact, the 7z file wraps a ZIP file which finally contains the data files.
10
7
  class DownloadYourDataExporter
11
8
  DEFAULT_EXPORT_FORMAT = "CSV"
12
9
  ZIP_FILE_NAME = "download-your-data.zip"
13
10
 
11
+ include Decidim::TranslatableAttributes
12
+
14
13
  # Public: Initializes the class.
15
14
  #
16
15
  # user - The user to export the data from.
17
- # path - The String path where to write the zip file.
18
- # password - The password to protect the zip file.
16
+ # name - The name of the export in private area
19
17
  # export_format - The format of the data files inside the zip file. (CSV by default)
20
- def initialize(user, path, password, export_format = DEFAULT_EXPORT_FORMAT)
18
+ def initialize(user, name, export_format = DEFAULT_EXPORT_FORMAT)
21
19
  @user = user
22
- @path = File.expand_path path
23
20
  @export_format = export_format
24
- @password = password
21
+ @name = name
25
22
  end
26
23
 
24
+ # i18n-tasks-use t("decidim.download_your_data.show.download_your_data")
27
25
  def export
28
- tmpdir = Dir.mktmpdir("temporary-download-your-data-dir")
29
- user_data, user_attachments = data_and_attachments_for_user
30
- save_user_data(tmpdir, user_data)
31
- save_user_attachments(tmpdir, user_attachments)
32
-
33
- SevenZipWrapper.compress_and_encrypt(filename: @path, password: @password, input_directory: tmpdir)
26
+ user_export = user.private_exports.build
27
+ user_export.export_type = name
28
+ user_export.file.attach(io: data, filename: "#{name}.zip", content_type: "application/zip")
29
+ user_export.expires_at = Decidim.download_your_data_expiry_time.from_now
30
+ user_export.metadata = {}
31
+ user_export.save!
32
+ user_export
34
33
  end
35
34
 
36
35
  private
37
36
 
38
- attr_reader :user, :export_format
37
+ attr_reader :user, :export_format, :name
38
+
39
+ def data
40
+ user_data, user_attachments = data_and_attachments_for_user
41
+ buffer = Zip::OutputStream.write_buffer do |out|
42
+ save_user_data(out, user_data)
43
+ save_user_attachments(out, user_attachments)
44
+ save_readme(out)
45
+ end
46
+
47
+ buffer.rewind
48
+ buffer
49
+ end
39
50
 
40
51
  def data_and_attachments_for_user
41
52
  export_data = []
@@ -43,7 +54,8 @@ module Decidim
43
54
 
44
55
  download_your_data_entities.each do |object|
45
56
  klass = Object.const_get(object)
46
- export_data << [klass.model_name.name.parameterize.pluralize, Exporters.find_exporter(export_format).new(klass.user_collection(user), klass.export_serializer).export]
57
+ exporter = Exporters.find_exporter(export_format).new(klass.user_collection(user), klass.export_serializer)
58
+ export_data << [klass.model_name.name.parameterize.pluralize, exporter.export]
47
59
  attachments = klass.download_your_data_images(user)
48
60
  export_attachments << [klass.model_name.name.parameterize.pluralize, attachments.flatten] unless attachments.nil?
49
61
  end
@@ -55,30 +67,52 @@ module Decidim
55
67
  @download_your_data_entities ||= DownloadYourDataSerializers.data_entities
56
68
  end
57
69
 
58
- def save_user_data(tmpdir, user_data)
70
+ def save_user_data(output, user_data)
59
71
  user_data.each do |entity, exporter_data|
60
72
  next if exporter_data.read == "\n"
61
73
 
62
- file_name = File.join(tmpdir, "#{entity}-#{exporter_data.filename}")
63
- File.write(file_name, exporter_data.read)
74
+ output.put_next_entry("#{entity}-#{exporter_data.filename}")
75
+ output.write exporter_data.read
64
76
  end
65
77
  end
66
78
 
67
- def save_user_attachments(tmpdir, user_attachments)
79
+ def save_user_attachments(output, user_attachments)
68
80
  user_attachments.each do |entity, attachment_block|
69
81
  attachment_block.each do |attachment|
70
82
  next unless attachment.attached?
71
83
 
72
84
  blobs = attachment.is_a?(ActiveStorage::Attached::One) ? [attachment.blob] : attachment.blobs
73
85
  blobs.each do |blob|
74
- Dir.mkdir(File.join(tmpdir, entity.parameterize))
75
- file_name = File.join(tmpdir, entity.parameterize, blob.filename.to_s)
76
86
  blob.open do |blob_file|
77
- File.write(file_name, blob_file.read.force_encoding("UTF-8"))
87
+ output.put_next_entry("#{entity.parameterize}/#{blob.filename}")
88
+ output.write blob_file.read.force_encoding("UTF-8")
78
89
  end
79
90
  end
80
91
  end
81
92
  end
82
93
  end
94
+
95
+ def save_readme(output)
96
+ output.put_next_entry("README.md")
97
+ output.write readme
98
+ end
99
+
100
+ def readme
101
+ readme_file = "# #{I18n.t("decidim.download_your_data.help.core.title", organization: translated_attribute(user.organization.name))}\n\n"
102
+ readme_file << "#{I18n.t("decidim.download_your_data.help.core.description", user_name: "#{user.name} (#{user.nickname})")}\n\n"
103
+ help_definition = DownloadYourDataSerializers.help_definitions_for(user)
104
+
105
+ help_definition.each do |entity, headers|
106
+ next if headers.empty?
107
+
108
+ readme_file << "\n\n## #{entity}\n\n"
109
+
110
+ headers.each do |header, help_value|
111
+ readme_file << "* #{header}: #{help_value}\n"
112
+ end
113
+ end
114
+
115
+ readme_file
116
+ end
83
117
  end
84
118
  end