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
@@ -8,6 +8,7 @@ module Decidim
8
8
  # the other methods to see how they work.
9
9
  #
10
10
  # @param [Hash] tags - A Hash containing the meta tag name as keys and its content as values.
11
+ # @param [Object, nil] resource - The resource object that may contain the image.
11
12
  #
12
13
  # @return [nil]
13
14
  def add_decidim_meta_tags(tags)
@@ -15,33 +16,31 @@ module Decidim
15
16
  add_decidim_meta_description(tags[:description])
16
17
  add_decidim_meta_url(tags[:url])
17
18
  add_decidim_meta_twitter_handler(tags[:twitter_handler])
18
- add_decidim_meta_image_url(add_base_url_to(tags[:image_url]))
19
+ image_url = tags[:image_url].presence || resolve_meta_image_url(tags[:resource])
20
+ add_decidim_meta_image_url(add_base_url_to(image_url)) if image_url.present?
19
21
  end
20
22
 
21
- # Add base url to path if path does not include host.
23
+ # Adds base URL to the given path if it does not include a host.
22
24
  #
23
- # @parma [String] path - A String containing path (e.g. "/proposals/1" )
25
+ # @param [String] path - A String containing the path (e.g. "/proposals/1").
24
26
  #
25
- # @return [String] - a String of URL including base URL and path, or path if it is blank.
27
+ # @return [String] - A String with the base URL and path, or the original path if it already includes a host.
26
28
  def add_base_url_to(path)
27
- return path if path.blank?
28
- return path if URI.parse(path).host.present?
29
+ return path if path.blank? || URI.parse(path).host.present?
29
30
 
30
31
  "#{resolve_base_url}#{path}"
31
32
  end
32
33
 
33
- # Resolve base url (example: https://www.decidim.org) without url params
34
+ # Resolves the base URL (example: https://www.decidim.org) without URL parameters.
34
35
  #
35
- # @return [String] - a String of base URL
36
+ # @return [String] - A String of the base URL.
36
37
  def resolve_base_url
37
38
  return request.base_url if respond_to?(:request) && request&.base_url.present?
38
39
 
39
40
  uri = URI.parse(decidim.root_url(host: current_organization.host))
40
- if uri.port.blank? || [80, 443].include?(uri.port)
41
- "#{uri.scheme}://#{uri.host}"
42
- else
43
- "#{uri.scheme}://#{uri.host}:#{uri.port}"
44
- end
41
+ port = uri.port.present? && [80, 443].exclude?(uri.port) ? ":#{uri.port}" : ""
42
+
43
+ "#{uri.scheme}://#{uri.host}#{port}"
45
44
  end
46
45
 
47
46
  # Accumulates the given `title` so that they can be chained. Since Rails views
@@ -60,22 +59,20 @@ module Decidim
60
59
  # @return [Array<String>]
61
60
  def add_decidim_page_title(title)
62
61
  @decidim_page_title ||= []
63
- return @decidim_page_title if title.blank?
64
-
65
- @decidim_page_title << title
62
+ @decidim_page_title << title if title.present?
63
+ @decidim_page_title
66
64
  end
67
65
 
68
66
  # Renders the title for a page. Use the `add_decidim_page_title` method to
69
67
  # accumulate elements for the title. Basically, it joins the elements of the title
70
68
  # array with `" - "`.
71
69
  #
72
- # @return [String]
70
+ # @return [String] - The concatenated title.
73
71
  def decidim_page_title
74
72
  (@decidim_page_title || []).join(" - ")
75
73
  end
76
74
 
77
- attr_reader :decidim_meta_description, :decidim_meta_url, :decidim_meta_image_url,
78
- :decidim_meta_twitter_handler
75
+ attr_reader :decidim_meta_description, :decidim_meta_url, :decidim_meta_image_url, :decidim_meta_twitter_handler
79
76
 
80
77
  # Sets the meta description for the current page. We want to keep the most specific
81
78
  # one, so you cannot replace the description if it is set by a view that has already
@@ -83,7 +80,7 @@ module Decidim
83
80
  # is the last one to be rendered. You can put there a basic content and override it
84
81
  # in other layers.
85
82
  #
86
- # @param [String] description - The String to be set as description
83
+ # @param [String] description - The String to be set as description.
87
84
  #
88
85
  # @return [nil]
89
86
  def add_decidim_meta_description(description)
@@ -96,7 +93,7 @@ module Decidim
96
93
  # is the last one to be rendered. You can put there a basic content and override it
97
94
  # in other layers.
98
95
  #
99
- # @param [String] twitter_handler - The String to be set as Twitter handler
96
+ # @param [String] twitter_handler - The String to be set as Twitter handler.
100
97
  #
101
98
  # @return [nil]
102
99
  def add_decidim_meta_twitter_handler(twitter_handler)
@@ -109,7 +106,7 @@ module Decidim
109
106
  # is the last one to be rendered. You can put there a basic content and override it
110
107
  # in other layers.
111
108
  #
112
- # @param [String] url - The String to be set as URL
109
+ # @param [String] url - The String to be set as URL.
113
110
  #
114
111
  # @return [nil]
115
112
  def add_decidim_meta_url(url)
@@ -122,11 +119,23 @@ module Decidim
122
119
  # is the last one to be rendered. You can put there a basic content and override it
123
120
  # in other layers.
124
121
  #
125
- # @param [String] image_url - The String to be set as image URL
122
+ # @param [String] image_url - The String to be set as image URL.
126
123
  #
127
124
  # @return [nil]
128
125
  def add_decidim_meta_image_url(image_url)
129
126
  @decidim_meta_image_url ||= image_url
130
127
  end
128
+
129
+ # Resolves the image URL to be used for meta tags.
130
+ # This method creates a new instance of MetaImageUrlResolver,
131
+ # which handles the logic for determining the most appropriate image URL.
132
+ #
133
+ # @param [Object, nil] resource - The resource object that may contain the image.
134
+ #
135
+ # @return [String, nil] - The resolved image URL, or nil if no appropriate image URL is found.
136
+ def resolve_meta_image_url(resource)
137
+ url = MetaImageUrlResolver.new(resource, current_organization).resolve
138
+ add_base_url_to(url) if url.present?
139
+ end
131
140
  end
132
141
  end
@@ -34,5 +34,28 @@ module Decidim
34
34
  end
35
35
  end
36
36
  end
37
+
38
+ def decidim_drawer(opts = {}, &)
39
+ opts[:closable] = true unless opts.has_key?(:closable)
40
+
41
+ button = if opts[:closable] == false
42
+ ""
43
+ else
44
+ content_tag(
45
+ :button,
46
+ "&times".html_safe,
47
+ type: :button,
48
+ data: { dialog_close: opts[:id] || "", dialog_closable: "" },
49
+ "aria-label": t("close_modal", scope: "decidim.shared.confirm_modal")
50
+ )
51
+ end
52
+
53
+ content = opts[:remote].nil? ? button + capture(&).html_safe : button + icon("loader-3-line")
54
+ content_tag(:div, id: opts[:id], data: { dialog: opts[:id] || "", drawer: true }.merge(opts[:data] || {})) do
55
+ content_tag(:div, id: "#{opts[:id]}-content", class: opts[:class]) do
56
+ content
57
+ end
58
+ end
59
+ end
37
60
  end
38
61
  end
@@ -13,17 +13,17 @@ module Decidim
13
13
 
14
14
  # Public: icon for omniauth buttons
15
15
  def oauth_icon(provider)
16
- info = current_organization.enabled_omniauth_providers[provider.to_sym]
16
+ provider_info = current_organization.enabled_omniauth_providers[provider.to_sym]
17
17
 
18
18
  name = normalize_provider_name(provider)
19
19
  name = "twitter-x" if provider == :twitter
20
20
  name = "#{name}-fill"
21
21
 
22
- if info
23
- icon_path = info[:icon_path]
24
- return external_icon(icon_path) if icon_path
22
+ if provider_info
23
+ icon_path = provider_info[:icon_path] || Rails.application.secrets.omniauth[provider][:icon_path].presence
24
+ return external_icon(icon_path) if icon_path.present?
25
25
 
26
- name = info[:icon] if info[:icon]
26
+ name = provider_info[:icon] if provider_info[:icon]
27
27
  end
28
28
 
29
29
  icon(name)
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ # A helper to display onboarding action message
5
+ module OnboardingActionHelper
6
+ def display_onboarding_action_message(user)
7
+ return if user.blank?
8
+ return unless pending_onboarding_action?(user)
9
+
10
+ cell("decidim/onboarding_action_message", user)
11
+ end
12
+ end
13
+ end
@@ -13,7 +13,8 @@ module Decidim
13
13
  def order_selector(orders, options = {})
14
14
  render partial: "decidim/shared/orders", locals: {
15
15
  orders:,
16
- i18n_scope: options[:i18n_scope]
16
+ i18n_scope: options[:i18n_scope],
17
+ css_class: options[:css_class]
17
18
  }
18
19
  end
19
20
 
@@ -28,7 +28,7 @@ module Decidim
28
28
  end
29
29
 
30
30
  def participatory_space_floating_help
31
- return if help_section.blank?
31
+ return if help_section.blank? || strip_tags(translated_attribute(help_section).html_safe).blank?
32
32
 
33
33
  floating_help(help_id) { translated_attribute(help_section).html_safe }
34
34
  end
@@ -30,7 +30,7 @@ module Decidim
30
30
  value: @account&.password,
31
31
  minlength: min_length,
32
32
  maxlength: ::PasswordValidator::MAX_LENGTH,
33
- placeholder: "••••••"
33
+ placeholder: "**********"
34
34
  }
35
35
  end
36
36
 
@@ -42,7 +42,7 @@ module Decidim
42
42
  required: true,
43
43
  label: false,
44
44
  help_text:,
45
- placeholder: "••••••"
45
+ placeholder: "**********"
46
46
  }
47
47
  end
48
48
 
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ # A Helper to render taxonomies for forms.
5
+ module TaxonomiesHelper
6
+ include DecidimFormHelper
7
+ include TranslatableAttributes
8
+
9
+ def filter_taxonomy_items_select_field(form, name, filter, options = {})
10
+ label = decidim_sanitize_translated(filter.name)
11
+ options = options.merge(include_blank: I18n.t("decidim.taxonomies.prompt")) unless options.has_key?(:include_blank)
12
+ options = options.merge(label:) unless options.has_key?(:label)
13
+ form.select(
14
+ name,
15
+ taxonomy_items_options_for_filter(filter),
16
+ options,
17
+ { name: "#{form.object_name}[#{name}][]", id: "#{name}-#{filter.id}" }
18
+ )
19
+ end
20
+
21
+ def taxonomy_items_options_for_filter(filter)
22
+ @taxonomy_items_options_for_filter ||= {}
23
+ @taxonomy_items_options_for_filter[filter.id] ||= begin
24
+ min_parent_count = filter.taxonomies.values.min_by { |item| item[:taxonomy].parent_ids.count }
25
+ first_parent_level = (min_parent_count && min_parent_count[:taxonomy].parent_ids.count) || 1
26
+ taxonomy_items_options_for_taxonomies_tree(filter.taxonomies, first_parent_level)
27
+ end
28
+ end
29
+
30
+ def taxonomy_items_options_for_taxonomies_tree(taxonomies_tree, first_parent_level = 1)
31
+ options = []
32
+ taxonomies_tree.each do |id, item|
33
+ name = " #{"&nbsp;" * 4 * (item[:taxonomy].parent_ids.count - first_parent_level)} #{decidim_sanitize_translated(item[:taxonomy].name)}".html_safe
34
+ options.append([name, id])
35
+ options.concat(taxonomy_items_options_for_taxonomies_tree(item[:children], first_parent_level)) if item[:children].any?
36
+ end
37
+ options
38
+ end
39
+ end
40
+ end
@@ -5,25 +5,8 @@ module Decidim
5
5
  queue_as :default
6
6
 
7
7
  def perform(user, export_format = ::Decidim::DownloadYourDataExporter::DEFAULT_EXPORT_FORMAT)
8
- filename = "#{SecureRandom.urlsafe_base64}.zip"
9
- path = Rails.root.join("tmp/#{filename}")
10
- password = SecureRandom.urlsafe_base64
11
-
12
- generate_zip_file(user, path, password, export_format)
13
- save_or_upload_file(user, path)
14
- # Deletes temporary file
15
- File.delete(path)
16
- ExportMailer.download_your_data_export(user, filename, password).deliver_later
17
- end
18
-
19
- private
20
-
21
- def generate_zip_file(user, path, password, export_format)
22
- DownloadYourDataExporter.new(user, path, password, export_format).export
23
- end
24
-
25
- def save_or_upload_file(user, path)
26
- user.download_your_data_file.attach(io: File.open(path, "rb"), filename: File.basename(path))
8
+ @export = DownloadYourDataExporter.new(user, "download_your_data", export_format).export
9
+ ExportMailer.download_your_data_export(user, @export).deliver_later
27
10
  end
28
11
  end
29
12
  end
@@ -4,21 +4,26 @@ module Decidim
4
4
  class EventPublisherJob < ApplicationJob
5
5
  queue_as :events
6
6
 
7
- attr_reader :resource
7
+ attr_reader :resource, :data
8
8
 
9
9
  def perform(event_name, data)
10
10
  @resource = data[:resource]
11
+ @data = data
11
12
 
12
13
  return unless data[:force_send] || notifiable?
13
14
 
14
- EmailNotificationGeneratorJob.perform_later(
15
- event_name,
16
- data[:event_class],
17
- data[:resource],
18
- data[:followers],
19
- data[:affected_users],
20
- data[:extra]
21
- )
15
+ if event_type.include?(:email)
16
+ EmailNotificationGeneratorJob.perform_later(
17
+ event_name,
18
+ data[:event_class],
19
+ data[:resource],
20
+ data[:followers],
21
+ data[:affected_users],
22
+ data[:extra]
23
+ )
24
+ end
25
+
26
+ return unless event_type.include?(:notification)
22
27
 
23
28
  NotificationGeneratorJob.perform_later(
24
29
  event_name,
@@ -32,6 +37,10 @@ module Decidim
32
37
 
33
38
  private
34
39
 
40
+ def event_type
41
+ (data[:event_class].presence && data[:event_class].safe_constantize&.types) || []
42
+ end
43
+
35
44
  # Whether this event should be notified or not. Useful when you want the
36
45
  # event to decide based on the params.
37
46
  #
@@ -2,6 +2,8 @@
2
2
 
3
3
  module Decidim
4
4
  class ExportJob < ApplicationJob
5
+ include Decidim::PrivateDownloadHelper
6
+
5
7
  queue_as :exports
6
8
 
7
9
  # rubocop:disable Metrics/ParameterLists
@@ -16,7 +18,9 @@ module Decidim
16
18
 
17
19
  export_data = Decidim::Exporters.find_exporter(format).new(collection, serializer).export
18
20
 
19
- ExportMailer.export(user, name, export_data).deliver_now
21
+ private_export = attach_archive(export_data, name, user)
22
+
23
+ ExportMailer.export(user, private_export).deliver_later
20
24
  end
21
25
  # rubocop:enable Metrics/ParameterLists
22
26
  end
@@ -2,6 +2,8 @@
2
2
 
3
3
  module Decidim
4
4
  class ExportParticipatorySpaceJob < ApplicationJob
5
+ include Decidim::PrivateDownloadHelper
6
+
5
7
  queue_as :exports
6
8
 
7
9
  def perform(user, participatory_space, name, format)
@@ -14,7 +16,8 @@ module Decidim
14
16
 
15
17
  export_data = Decidim::Exporters.find_exporter(format).new(collection, serializer).export
16
18
 
17
- Decidim::ExportMailer.export(user, name, export_data).deliver_now
19
+ private_export = attach_archive(export_data, name, user)
20
+ ExportMailer.export(user, private_export).deliver_later
18
21
  end
19
22
  end
20
23
  end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ class HideChildResourcesJob < ApplicationJob
5
+ queue_as :user_report
6
+
7
+ def perform(resource, _user_id)
8
+ spam_user = (resource.organization.users.find_by!(email: Decidim::Ai::SpamDetection.reporting_user_email) if Decidim.module_installed?(:ai))
9
+ spam_user = resource.organization.admins.first if spam_user.nil?
10
+
11
+ tool = Decidim::ModerationTools.new(resource, spam_user)
12
+
13
+ unless Decidim::Report.exists?("decidim_moderation_id" => tool.moderation.id, "decidim_user_id" => spam_user.id)
14
+ tool.create_report!({
15
+ reason: "parent_hidden",
16
+ details: I18n.t("report_details", scope: "decidim.reports.parent_hidden")
17
+ })
18
+ end
19
+
20
+ tool.update_report_count!
21
+ tool.hide!
22
+ end
23
+ end
24
+ end
@@ -4,13 +4,13 @@ module Decidim
4
4
  class OpenDataJob < ApplicationJob
5
5
  queue_as :exports
6
6
 
7
- def perform(organization)
8
- path = Rails.root.join("tmp/#{organization.open_data_file_path}")
7
+ def perform(organization, resource = nil)
8
+ path = Rails.root.join("tmp/#{organization.open_data_file_path(resource)}")
9
9
 
10
- exporter = OpenDataExporter.new(organization, path)
10
+ exporter = OpenDataExporter.new(organization, path, resource)
11
11
  raise "Could not generate Open Data export" unless exporter.export.positive?
12
12
 
13
- organization.open_data_file.attach(io: File.open(path, "rb"), filename: organization.open_data_file_path)
13
+ organization.open_data_files.attach(io: File.open(path, "rb"), filename: organization.open_data_file_path(resource))
14
14
  # Deletes the temporary file file
15
15
  File.delete(path)
16
16
  end
@@ -8,21 +8,16 @@ module Decidim
8
8
  # zipped file.
9
9
  #
10
10
  # user - The user to be notified.
11
- # export_name - The name of the export.
12
- # export_data - The data containing the result of the export.
11
+ # private_export - The PrivateExport instance where the export data has been attached.
13
12
  #
14
13
  # Returns nothing.
15
- def export(user, export_name, export_data)
14
+ def export(user, private_export)
16
15
  @user = user
17
16
  @organization = user.organization
18
-
19
- filename = export_data.filename(export_name)
20
- filename_without_extension = export_data.filename(export_name, extension: false)
21
-
22
- attachments["#{filename_without_extension}.zip"] = FileZipper.new(filename, export_data.read).zip
17
+ @private_export = private_export
23
18
 
24
19
  with_user(user) do
25
- mail(to: "#{user.name} <#{user.email}>", subject: I18n.t("decidim.export_mailer.subject", name: filename))
20
+ mail(to: "#{user.name} <#{user.email}>", subject: I18n.t("decidim.export_mailer.subject", name: private_export.export_type))
26
21
  end
27
22
  end
28
23
 
@@ -30,13 +25,13 @@ module Decidim
30
25
  # the result of a download_your_data export in a zipped file.
31
26
  #
32
27
  # user - The user to be notified.
28
+ # private_export - The PrivateExport instance where the export data has been attached.
33
29
  #
34
30
  # Returns nothing.
35
- def download_your_data_export(user, filename, password)
31
+ def download_your_data_export(user, private_export)
36
32
  @user = user
37
33
  @organization = user.organization
38
- @filename = filename
39
- @password = password
34
+ @private_export = private_export
40
35
 
41
36
  with_user(user) do
42
37
  mail(to: "#{user.name} <#{user.email}>", subject: I18n.t("decidim.export_mailer.subject", name: user.name))
@@ -5,6 +5,7 @@ module Decidim
5
5
  # for transparency reasons, to log all actions so all other users can
6
6
  # see the actions being performed.
7
7
  class ActionLog < ApplicationRecord
8
+ include Decidim::Taxonomizable
8
9
  include Decidim::ScopableParticipatorySpace
9
10
 
10
11
  belongs_to :organization,
@@ -175,6 +176,16 @@ module Decidim
175
176
  base + [:with_participatory_space]
176
177
  end
177
178
 
179
+ def self.ransackable_attributes(auth_object = nil)
180
+ return [] unless auth_object&.admin?
181
+
182
+ %w(created_at)
183
+ end
184
+
185
+ def self.ransackable_associations(_auth_object = nil)
186
+ %w(user)
187
+ end
188
+
178
189
  # Overwrites the method so that records cannot be modified.
179
190
  #
180
191
  # Returns a Boolean.
@@ -47,6 +47,10 @@ module Decidim
47
47
  # Allow ransacker to search for a key in a hstore column (`name`.`en`)
48
48
  ransacker_i18n :name
49
49
 
50
+ def self.ransackable_attributes(_auth_object = nil)
51
+ %w(description id name)
52
+ end
53
+
50
54
  private
51
55
 
52
56
  # This is done since we only allow one level of subcategories.
@@ -6,11 +6,14 @@ module Decidim
6
6
  # component that spans over several steps.
7
7
  class Component < ApplicationRecord
8
8
  include HasSettings
9
+ include HasTaxonomySettings
9
10
  include Publicable
10
11
  include Traceable
11
12
  include Loggable
12
13
  include Decidim::ShareableWithToken
13
14
  include ScopableComponent
15
+ include Decidim::SoftDeletable
16
+ include TranslatableAttributes
14
17
 
15
18
  belongs_to :participatory_space, polymorphic: true
16
19
 
@@ -19,7 +22,7 @@ module Decidim
19
22
 
20
23
  default_scope { registered_component_manifests.registered_space_manifests.order(arel_table[:weight].asc, arel_table[:manifest_name].asc) }
21
24
 
22
- delegate :organization, :categories, to: :participatory_space
25
+ delegate :organization, to: :participatory_space
23
26
 
24
27
  def self.log_presenter_class_for(_log)
25
28
  Decidim::AdminLog::ComponentPresenter
@@ -61,7 +64,7 @@ module Decidim
61
64
  {
62
65
  :host => organization.host,
63
66
  :component_id => id,
64
- "#{participatory_space.underscored_name}_slug".to_sym => participatory_space.slug
67
+ :"#{participatory_space.underscored_name}_slug" => participatory_space.slug
65
68
  }
66
69
  end
67
70
 
@@ -82,6 +85,14 @@ module Decidim
82
85
  name
83
86
  end
84
87
 
88
+ def hierarchy_title
89
+ [
90
+ I18n.t("decidim.admin.menu.#{participatory_space.class.name.demodulize.underscore.pluralize}"),
91
+ translated_attribute(participatory_space.title),
92
+ translated_attribute(name)
93
+ ].join(" / ")
94
+ end
95
+
85
96
  # Public: Returns an empty description
86
97
  def resource_description; end
87
98
 
@@ -92,9 +103,20 @@ module Decidim
92
103
  participatory_space.can_participate?(user)
93
104
  end
94
105
 
106
+ def private_non_transparent_space?
107
+ return false unless participatory_space.respond_to?(:private_space?)
108
+ return false unless participatory_space.private_space?
109
+
110
+ if participatory_space.respond_to?(:is_transparent?)
111
+ !participatory_space.is_transparent?
112
+ else
113
+ true
114
+ end
115
+ end
116
+
95
117
  # Public: Public URL for component with given share token as query parameter
96
118
  def shareable_url(share_token)
97
- EngineRouter.main_proxy(self).root_path(self, share_token: share_token.token)
119
+ EngineRouter.main_proxy(self).root_url(self, share_token: share_token.token)
98
120
  end
99
121
 
100
122
  delegate :serializes_specific_data?, to: :manifest
@@ -9,6 +9,7 @@ module Decidim
9
9
  belongs_to :participatory_space, foreign_type: "participatory_space_type", polymorphic: true, optional: true
10
10
  belongs_to :related_object, foreign_type: "related_object_type", polymorphic: true, optional: true
11
11
  belongs_to :category, foreign_key: "decidim_category_id", class_name: "Decidim::Category", optional: true
12
+ belongs_to :taxonomy, foreign_key: "decidim_taxonomy_id", class_name: "Decidim::Taxonomy", optional: true
12
13
 
13
14
  validates :day, uniqueness: { scope:
14
15
  [
@@ -18,7 +19,7 @@ module Decidim
18
19
  :participatory_space_id,
19
20
  :related_object_type,
20
21
  :related_object_id,
21
- :decidim_category_id
22
+ :decidim_taxonomy_id
22
23
  ] }
23
24
  end
24
25
  end
@@ -30,5 +30,21 @@ module Decidim
30
30
  ransacker :reportable_type_string do
31
31
  Arel.sql(%{cast("decidim_moderations"."decidim_reportable_type" as text)})
32
32
  end
33
+
34
+ def self.ransackable_attributes(_auth_object = nil)
35
+ %w(reported_id_string reported_content created_at)
36
+ end
37
+
38
+ def self.ransackable_associations(_auth_object = nil)
39
+ []
40
+ end
41
+
42
+ def title
43
+ return reportable.reported_title if reportable.respond_to?(:reported_title)
44
+ return reportable.title if reportable.respond_to?(:title)
45
+ return reportable.name if reportable.respond_to?(:name)
46
+
47
+ reportable.id.to_s
48
+ end
33
49
  end
34
50
  end