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,118 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright (c) 2015 Sébastien Gruhier (http://xilinus.com/) - MIT LICENSE
4
+ #
5
+ # This file has been copied and modified from https://github.com/sgruhier/foundation_rails_helper/blob/master/lib/foundation_rails_helper/form_builder.rb
6
+ # We have done this so we can decouple Decidim from this dependency, which is not updated to Rails 7.1
7
+ # We also plan to fully remove Foundation CSS legacy code in the future
8
+
9
+ module Decidim
10
+ class LegacyFormBuilder < ActionView::Helpers::FormBuilder
11
+ include ActionView::Helpers::TagHelper
12
+ include ActionView::Helpers::OutputSafetyHelper
13
+ %w(file_field email_field text_field text_area url_field
14
+ number_field date_field datetime_field search_field color_field)
15
+ .each do |method_name|
16
+ define_method(method_name) do |*args|
17
+ attribute = args[0]
18
+ options = args[1] || {}
19
+ field(attribute, options) do |opts|
20
+ super(attribute, opts)
21
+ end
22
+ end
23
+ end
24
+
25
+ def label(attribute, text = nil, options = {})
26
+ if error?(attribute)
27
+ options[:class] ||= ""
28
+ options[:class] += " is-invalid-label"
29
+ end
30
+
31
+ super(attribute, (text || "").html_safe, options)
32
+ end
33
+
34
+ def radio_button(attribute, tag_value, options = {})
35
+ options[:label_options] ||= {}
36
+ label_options = options.delete(:label_options)&.merge!(value: tag_value)
37
+ label_text = options.delete(:label)
38
+ l = label(attribute, label_text, label_options) unless label_text == false
39
+ r = @template.radio_button(@object_name, attribute, tag_value,
40
+ objectify_options(options))
41
+
42
+ "#{r}#{l}".html_safe
43
+ end
44
+
45
+ def datetime_select(attribute, options = {}, html_options = {})
46
+ field attribute, options, html_options do |html_opts|
47
+ super(attribute, options, html_opts.merge(autocomplete: :off))
48
+ end
49
+ end
50
+
51
+ def date_select(attribute, options = {}, html_options = {})
52
+ field attribute, options, html_options do |html_opts|
53
+ super(attribute, options, html_opts.merge(autocomplete: :off))
54
+ end
55
+ end
56
+
57
+ def time_zone_select(attribute, priorities = nil, options = {}, html_options = {})
58
+ field attribute, options, html_options do |html_opts|
59
+ super(attribute, priorities, options,
60
+ html_opts.merge(autocomplete: :off))
61
+ end
62
+ end
63
+
64
+ def select(attribute, choices, options = {}, html_options = {})
65
+ field attribute, options, html_options do |html_opts|
66
+ html_options[:autocomplete] ||= :off
67
+ super(attribute, choices, options, html_opts)
68
+ end
69
+ end
70
+
71
+ # rubocop:disable Metrics/ParameterLists
72
+ def collection_select(attribute, collection, value_method, text_method, options = {}, html_options = {})
73
+ field attribute, options, html_options do |html_opts|
74
+ html_options[:autocomplete] ||= :off
75
+ super(attribute, collection, value_method, text_method, options,
76
+ html_opts)
77
+ end
78
+ end
79
+ # rubocop:enable Metrics/ParameterLists
80
+
81
+ def autocomplete(attribute, url, options = {})
82
+ field attribute, options do |opts|
83
+ opts.merge!(update_elements: opts[:update_elements],
84
+ min_length: 0, value: object.send(attribute))
85
+ autocomplete_field(attribute, url, opts)
86
+ end
87
+ end
88
+
89
+ def submit(value = nil, options = {})
90
+ options[:class] ||= "button"
91
+ super
92
+ end
93
+
94
+ def error_for(attribute, options = {})
95
+ return unless error?(attribute)
96
+
97
+ class_name = "form-error is-visible"
98
+ class_name += " #{options[:class]}" if options[:class]
99
+
100
+ error_messages = object.errors[attribute].join(", ")
101
+ error_messages = error_messages.html_safe if options[:html_safe_errors]
102
+ content_tag(:small, error_messages,
103
+ class: class_name.sub("is-invalid-input", ""))
104
+ end
105
+
106
+ private
107
+
108
+ def error?(attribute)
109
+ object.respond_to?(:errors) && object.errors[attribute].present?
110
+ end
111
+
112
+ def default_label_text(object, attribute)
113
+ return object.class.human_attribute_name(attribute) if object.class.respond_to?(:human_attribute_name)
114
+
115
+ attribute.to_s.humanize
116
+ end
117
+ end
118
+ end
@@ -0,0 +1,93 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Maintenance
5
+ module ImportModels
6
+ class ApplicationRecord < ActiveRecord::Base
7
+ self.abstract_class = true
8
+ @resource_classes = []
9
+ @participatory_space_classes = []
10
+
11
+ def self.with(organization)
12
+ @organization = organization
13
+ self
14
+ end
15
+
16
+ class << self
17
+ attr_reader :organization
18
+ end
19
+
20
+ attr_reader :organization
21
+
22
+ def self.all_in_org
23
+ where(decidim_organization_id: @organization.id)
24
+ end
25
+
26
+ def self.participatory_space_classes
27
+ @participatory_space_classes.map(&:safe_constantize).compact_blank
28
+ end
29
+
30
+ def self.participatory_space_models(classes)
31
+ @participatory_space_classes = classes
32
+ end
33
+
34
+ def self.resource_classes
35
+ @resource_classes.map(&:safe_constantize).compact_blank
36
+ end
37
+
38
+ def self.resource_models(classes)
39
+ @resource_classes = classes
40
+ end
41
+
42
+ def self.add_resource_class(klass)
43
+ @resource_classes ||= []
44
+ @resource_classes << klass
45
+ end
46
+
47
+ def resource_title(resource)
48
+ if resource.respond_to?(:full_name)
49
+ resource.full_name
50
+ elsif resource.respond_to?(:title)
51
+ resource.title
52
+ elsif resource.respond_to?(:name)
53
+ resource.name
54
+ else
55
+ resource.to_s
56
+ end
57
+ end
58
+
59
+ def resource_name(resource)
60
+ title = resource_title(resource)
61
+ if title.is_a?(Hash)
62
+ title[I18n.locale.to_s]
63
+ else
64
+ title
65
+ end
66
+ end
67
+
68
+ def self.all_taxonomies
69
+ raise NotImplementedError
70
+ end
71
+
72
+ def self.all_filters
73
+ raise NotImplementedError
74
+ end
75
+
76
+ def self.to_taxonomies
77
+ return [] unless all_taxonomies.any?
78
+
79
+ {
80
+ root_taxonomy_name => to_h
81
+ }
82
+ end
83
+
84
+ def self.to_h
85
+ {
86
+ taxonomies: all_taxonomies,
87
+ filters: all_filters
88
+ }
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,82 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Maintenance
5
+ module ImportModels
6
+ class Area < ApplicationRecord
7
+ resource_models ["Decidim::Assembly", "Decidim::ParticipatoryProcess", "Decidim::Initiative", "Decidim::ActionLog"]
8
+ participatory_space_models ["Decidim::Assembly", "Decidim::ParticipatoryProcess", "Decidim::Initiative"]
9
+
10
+ self.table_name = "decidim_areas"
11
+ belongs_to :area_type, class_name: "Decidim::Maintenance::ImportModels::AreaType", inverse_of: :areas, optional: true
12
+
13
+ def self.root_taxonomy_name = "~ #{I18n.t("decidim.admin.titles.areas")}"
14
+
15
+ def resources
16
+ Area.resource_classes.each_with_object({}) do |klass, hash|
17
+ items = klass.where(decidim_area_id: id)
18
+ hash.merge!(items.to_h { |resource| [resource.to_global_id.to_s, resource_name(resource)] })
19
+ end
20
+ end
21
+
22
+ def taxonomies
23
+ {
24
+ name:,
25
+ origin: to_global_id.to_s,
26
+ children: {},
27
+ resources:
28
+ }
29
+ end
30
+
31
+ def self.filter_item_for_space_manifest(participatory_space_manifests)
32
+ items = all_in_org.map do |area|
33
+ if area.area_type
34
+ [
35
+ area.area_type.name[I18n.locale.to_s],
36
+ area.name[I18n.locale.to_s]
37
+ ]
38
+ else
39
+ [area.name[I18n.locale.to_s]]
40
+ end
41
+ end
42
+
43
+ {
44
+ participatory_space_manifests:,
45
+ name: root_taxonomy_name,
46
+ items:,
47
+ components: []
48
+ }
49
+ end
50
+
51
+ def self.plain_areas
52
+ all_in_org.where(area_type_id: nil).to_h { |area| [area.name[I18n.locale.to_s], area.taxonomies] }
53
+ end
54
+
55
+ def self.areas_with_type
56
+ AreaType.with(organization).all_in_org.to_h do |type|
57
+ [
58
+ type.plural[I18n.locale.to_s],
59
+ {
60
+ name: type.plural,
61
+ origin: type.to_global_id.to_s,
62
+ children: type.areas.to_h { |area| [area.name[I18n.locale.to_s], area.taxonomies] },
63
+ resources: {}
64
+ }
65
+ ]
66
+ end
67
+ end
68
+
69
+ def self.all_taxonomies
70
+ plain_areas.merge(areas_with_type)
71
+ end
72
+
73
+ def self.all_filters
74
+ manifests = Area.participatory_space_classes.map do |space_class|
75
+ space_class.to_s.split("::").last.underscore.pluralize
76
+ end
77
+ [filter_item_for_space_manifest(manifests)]
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Maintenance
5
+ module ImportModels
6
+ class AreaType < ApplicationRecord
7
+ self.table_name = "decidim_area_types"
8
+ has_many :areas, class_name: "Decidim::Maintenance::ImportModels::Area", inverse_of: :area_type, dependent: :nullify
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Maintenance
5
+ module ImportModels
6
+ class AssemblyType < ApplicationRecord
7
+ self.table_name = "decidim_assemblies_types"
8
+
9
+ def self.root_taxonomy_name = "~ #{I18n.t("decidim.admin.titles.assemblies_types")}"
10
+
11
+ def self.participatory_space_manifests = ["assemblies"]
12
+
13
+ def name
14
+ title
15
+ end
16
+
17
+ def taxonomies
18
+ {
19
+ name:,
20
+ origin: to_global_id.to_s,
21
+ children: {},
22
+ resources:
23
+ }
24
+ end
25
+
26
+ def resources
27
+ Decidim::Assembly.where(decidim_assemblies_type_id: id).to_h do |process|
28
+ [process.to_global_id.to_s, process.title[I18n.locale.to_s]]
29
+ end
30
+ end
31
+
32
+ def self.all_taxonomies
33
+ all_in_org.to_h { |type| [type.name[I18n.locale.to_s], type.taxonomies] }
34
+ end
35
+
36
+ def self.all_filters
37
+ [
38
+ {
39
+ name: root_taxonomy_name,
40
+ participatory_space_manifests:,
41
+ items: all_in_org.map { |type| [type.name[I18n.locale.to_s]] },
42
+ components: []
43
+ }
44
+ ]
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Maintenance
5
+ module ImportModels
6
+ class Categorization < ApplicationRecord
7
+ self.table_name = "decidim_categorizations"
8
+
9
+ belongs_to :category, foreign_key: :decidim_category_id
10
+ belongs_to :categorizable, polymorphic: true
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,107 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Maintenance
5
+ module ImportModels
6
+ class Category < ApplicationRecord
7
+ resource_models []
8
+ participatory_space_models ["Decidim::Assembly", "Decidim::ParticipatoryProcess", "Decidim::Conference", "Decidim::Initiative"]
9
+
10
+ self.table_name = "decidim_categories"
11
+ belongs_to :participatory_space, foreign_key: "decidim_participatory_space_id", foreign_type: "decidim_participatory_space_type", polymorphic: true
12
+ has_many :subcategories, foreign_key: "parent_id", class_name: "Decidim::Maintenance::ImportModels::Category", dependent: :destroy, inverse_of: :parent
13
+ belongs_to :parent, class_name: "Decidim::Maintenance::ImportModels::Category", inverse_of: :subcategories, optional: true
14
+ has_many :categorizations, foreign_key: "decidim_category_id", class_name: "Decidim::Maintenance::ImportModels::Categorization", dependent: :destroy
15
+
16
+ def self.root_taxonomy_name = "~ #{I18n.t("decidim.admin.categories.index.categories_title")}"
17
+
18
+ def invalid_categorization?(categorization)
19
+ return true if categorization.categorizable.nil?
20
+
21
+ return categorization.categorizable.participatory_space != participatory_space if categorization.categorizable.respond_to?(:participatory_space)
22
+ return categorization.categorizable.component.participatory_space != participatory_space if categorization.categorizable.respond_to?(:component)
23
+
24
+ false
25
+ end
26
+
27
+ def resources
28
+ categorizations.filter_map do |categorization|
29
+ next if invalid_categorization?(categorization)
30
+
31
+ [categorization.categorizable.to_global_id.to_s, resource_name(categorization.categorizable)]
32
+ end.to_h
33
+ end
34
+
35
+ def taxonomies
36
+ {
37
+ name:,
38
+ origin: to_global_id.to_s,
39
+ children: subcategories.to_h do |subcategory|
40
+ [
41
+ subcategory.name[I18n.locale.to_s],
42
+ subcategory.taxonomies
43
+ ]
44
+ end,
45
+ resources:
46
+ }
47
+ end
48
+
49
+ def self.children_taxonomies(participatory_space)
50
+ Category.where(participatory_space:, parent_id: nil).to_h do |category|
51
+ [
52
+ category.name[I18n.locale.to_s],
53
+ category.taxonomies
54
+ ]
55
+ end
56
+ end
57
+
58
+ def self.children_components(participatory_space)
59
+ participatory_space.components.filter_map do |component|
60
+ # skip components without taxonomies in settings
61
+ next unless component.settings.respond_to?(:taxonomy_filters)
62
+
63
+ component.to_global_id.to_s
64
+ end
65
+ end
66
+
67
+ def self.all_taxonomies
68
+ participatory_space_classes.each_with_object({}) do |klass, hash|
69
+ klass.where(organization:).each do |participatory_space|
70
+ next unless Category.where(participatory_space:, parent_id: nil).any?
71
+
72
+ name = "#{klass.model_name.human}: #{participatory_space.title[I18n.locale.to_s]}"
73
+ hash.merge!(name => {
74
+ name: { I18n.locale.to_s => name },
75
+ origin: participatory_space.to_global_id.to_s,
76
+ resources: {},
77
+ children: children_taxonomies(participatory_space)
78
+ })
79
+ end
80
+ end
81
+ end
82
+
83
+ def self.all_filters
84
+ participatory_space_classes.each_with_object([]) do |klass, list|
85
+ klass.where(organization:).each do |participatory_space|
86
+ name = "#{klass.model_name.human}: #{participatory_space.title[I18n.locale.to_s]}"
87
+ components = children_components(participatory_space)
88
+ next unless components.any?
89
+
90
+ list << {
91
+ name: root_taxonomy_name,
92
+ internal_name: name,
93
+ items: Category.where(participatory_space:).map do |category|
94
+ names = [name]
95
+ names << category.parent.name[I18n.locale.to_s] if category.parent
96
+ names << category.name[I18n.locale.to_s]
97
+ names
98
+ end,
99
+ components:
100
+ }
101
+ end
102
+ end
103
+ end
104
+ end
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Maintenance
5
+ module ImportModels
6
+ class ParticipatoryProcessType < AssemblyType
7
+ self.table_name = "decidim_participatory_process_types"
8
+
9
+ def self.root_taxonomy_name = "~ #{I18n.t("decidim.admin.titles.participatory_process_types")}"
10
+
11
+ def self.participatory_space_manifests = ["participatory_processes"]
12
+
13
+ def resources
14
+ Decidim::ParticipatoryProcess.where(decidim_participatory_process_type_id: id).to_h do |process|
15
+ [process.to_global_id.to_s, process.title[I18n.locale.to_s]]
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,163 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Maintenance
5
+ module ImportModels
6
+ class Scope < ApplicationRecord
7
+ resource_models [
8
+ "Decidim::Assembly", "Decidim::ParticipatoryProcess", "Decidim::Conference", "Decidim::InitiativesTypeScope",
9
+ "Decidim::ActionLog",
10
+ "Decidim::Accountability::Result",
11
+ "Decidim::Budgets::Budget", "Decidim::Budgets::Project",
12
+ "Decidim::Debates::Debate",
13
+ "Decidim::Meetings::Meeting",
14
+ "Decidim::Proposals::CollaborativeDraft", "Decidim::Proposals::Proposal"
15
+ ]
16
+ participatory_space_models ["Decidim::Assembly", "Decidim::ParticipatoryProcess", "Decidim::Conference", "Decidim::Initiative"]
17
+
18
+ self.table_name = "decidim_scopes"
19
+
20
+ def self.root_taxonomy_name = "~ #{I18n.t("decidim.admin.titles.scopes")}"
21
+
22
+ belongs_to :parent,
23
+ class_name: "Decidim::Maintenance::ImportModels::Scope",
24
+ inverse_of: :children,
25
+ optional: true
26
+
27
+ has_many :children,
28
+ foreign_key: "parent_id",
29
+ class_name: "Decidim::Maintenance::ImportModels::Scope",
30
+ inverse_of: :parent
31
+
32
+ attr_writer :full_name
33
+
34
+ def full_name
35
+ return @full_name if defined?(@full_name)
36
+
37
+ @full_name ||= name.dup
38
+ @full_name[I18n.locale.to_s] = "#{parent.full_name[I18n.locale.to_s]} > #{@full_name[I18n.locale.to_s]}" if parent_ids.count > 2
39
+ @full_name
40
+ end
41
+
42
+ def parent_ids
43
+ @parent_ids ||= parent_id ? parent.parent_ids + [parent_id] : []
44
+ end
45
+
46
+ def all_names
47
+ names = parent_ids.map do |id|
48
+ Scope.find_by(id:).name[I18n.locale.to_s]
49
+ end + [name[I18n.locale.to_s]]
50
+
51
+ return names if names.count < 4
52
+
53
+ names[0..1] + [names[2..].join(" > ")]
54
+ end
55
+
56
+ def all_children
57
+ @all_children ||= children.map do |child|
58
+ [child] + child.all_children
59
+ end.flatten
60
+ end
61
+
62
+ def children_taxonomies
63
+ # next level is going to be too deep, we transform the children into siblings
64
+ return sibling_taxonomies if parent_ids.count.positive?
65
+
66
+ children.to_h { |child| [child.full_name[I18n.locale.to_s], child.taxonomies] }
67
+ end
68
+
69
+ def sibling_taxonomies
70
+ all_children.to_h do |child|
71
+ [
72
+ child.full_name[I18n.locale.to_s],
73
+ {
74
+ name: child.full_name,
75
+ origin: child.to_global_id.to_s,
76
+ children: {},
77
+ resources: child.resources
78
+ }
79
+ ]
80
+ end
81
+ end
82
+
83
+ def taxonomies
84
+ {
85
+ name:,
86
+ origin: to_global_id.to_s,
87
+ children: children_taxonomies,
88
+ resources:
89
+ }
90
+ end
91
+
92
+ def resources
93
+ Scope.resource_classes.each_with_object({}) do |klass, hash|
94
+ items = if klass.to_s == "Decidim::InitiativesTypeScope"
95
+ klass.where(decidim_scopes_id: id)
96
+ else
97
+ klass.where(decidim_scope_id: id)
98
+ end
99
+ hash.merge!(items.to_h { |resource| [resource.to_global_id.to_s, resource_name(resource)] })
100
+ end
101
+ end
102
+
103
+ def self.filter_item_for_space_manifest(participatory_space_manifests)
104
+ items = []
105
+ all_in_org.where(parent_id: nil).find_each do |scope|
106
+ items << [scope.name[I18n.locale.to_s]]
107
+ scope.all_children.map(&:all_names).each do |names|
108
+ items << names
109
+ end
110
+ end
111
+
112
+ {
113
+ participatory_space_manifests:,
114
+ name: root_taxonomy_name,
115
+ items:,
116
+ components: []
117
+ }
118
+ end
119
+
120
+ def self.filter_item_for_component(component, space)
121
+ return unless component.settings.respond_to?(:taxonomy_filters)
122
+
123
+ scopes_enabled = component.attributes.dig("settings", "global", "scopes_enabled")
124
+ scope_id = component.attributes.dig("settings", "global", "scope_id")
125
+ return unless scopes_enabled
126
+
127
+ scope = find_by(id: scope_id) || (space.scopes_enabled? && find_by(id: space.decidim_scope_id))
128
+ list = scope ? [scope] + scope.all_children : all
129
+
130
+ {
131
+ name: root_taxonomy_name,
132
+ internal_name: "#{root_taxonomy_name}: #{component.name[I18n.locale.to_s]}",
133
+ items: list.map(&:all_names),
134
+ components: [component.to_global_id.to_s]
135
+ }
136
+ end
137
+
138
+ def self.all_filters
139
+ manifests = []
140
+ filters = []
141
+ Scope.participatory_space_classes.each do |space_class|
142
+ manifests << space_class.to_s.split("::").last.underscore.pluralize
143
+ # 1 filter per participatory space as space_filter=true
144
+ # 1 filter per component as space_filter=false on those with scopes, suffix: "Component Name"
145
+ # Only for components with scopes
146
+ space_class.where(organization:).each do |space|
147
+ space.components.each do |component|
148
+ component_filter = filter_item_for_component(component, space)
149
+ filters << component_filter if component_filter
150
+ end
151
+ end
152
+ end
153
+ filters << filter_item_for_space_manifest(manifests)
154
+ filters
155
+ end
156
+
157
+ def self.all_taxonomies
158
+ all_in_org.where(parent_id: nil).to_h { |scope| [scope.name[I18n.locale.to_s], scope.taxonomies] }
159
+ end
160
+ end
161
+ end
162
+ end
163
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ # This class should not be imported automatically by the Decidim web app
5
+ # It holds utilities for maintenance tasks (such as importing taxonomies)
6
+ # and compatibility models that might not be longer present in the current Decidim version
7
+ module Maintenance
8
+ module ImportModels
9
+ autoload :ApplicationRecord, "decidim/maintenance/import_models/application_record"
10
+ autoload :ParticipatoryProcessType, "decidim/maintenance/import_models/participatory_process_type"
11
+ autoload :AssemblyType, "decidim/maintenance/import_models/assembly_type"
12
+ autoload :Scope, "decidim/maintenance/import_models/scope"
13
+ autoload :Area, "decidim/maintenance/import_models/area"
14
+ autoload :AreaType, "decidim/maintenance/import_models/area_type"
15
+ autoload :Category, "decidim/maintenance/import_models/category"
16
+ autoload :Categorization, "decidim/maintenance/import_models/categorization"
17
+ end
18
+ end
19
+ end