decidim-core 0.26.2 → 0.27.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 (543) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/app/cells/decidim/amendable/announcement_cell.rb +3 -8
  4. data/app/cells/decidim/announcement_cell.rb +1 -1
  5. data/app/cells/decidim/author_cell.rb +1 -1
  6. data/app/cells/decidim/content_blocks/footer_sub_hero/show.erb +1 -1
  7. data/app/cells/decidim/content_blocks/hero/show.erb +1 -1
  8. data/app/cells/decidim/content_blocks/highlighted_content_banner/show.erb +3 -3
  9. data/app/cells/decidim/content_blocks/highlighted_elements_cell.rb +1 -1
  10. data/app/cells/decidim/content_blocks/how_to_participate/show.erb +1 -1
  11. data/app/cells/decidim/content_blocks/last_activity/show.erb +1 -1
  12. data/app/cells/decidim/content_blocks/last_activity_cell.rb +3 -3
  13. data/app/cells/decidim/content_blocks/stats_cell.rb +4 -4
  14. data/app/cells/decidim/content_blocks/sub_hero/show.erb +1 -1
  15. data/app/cells/decidim/data_consent/category.erb +64 -0
  16. data/app/cells/decidim/data_consent/dialog.erb +29 -0
  17. data/app/cells/decidim/data_consent/modal.erb +39 -0
  18. data/app/cells/decidim/data_consent/show.erb +3 -0
  19. data/app/cells/decidim/data_consent_cell.rb +21 -0
  20. data/app/cells/decidim/follow_button_cell.rb +5 -7
  21. data/app/cells/decidim/profile_sidebar_cell.rb +1 -1
  22. data/app/cells/decidim/search_results_cell.rb +1 -1
  23. data/app/cells/decidim/tos_page/refuse_btn_modal.erb +1 -1
  24. data/app/cells/decidim/upload_modal/files.erb +52 -0
  25. data/app/cells/decidim/upload_modal/modal.erb +49 -0
  26. data/app/cells/decidim/upload_modal/show.erb +3 -0
  27. data/app/cells/decidim/upload_modal_cell.rb +205 -0
  28. data/app/cells/decidim/user_conversation/reply.erb +1 -1
  29. data/app/cells/decidim/user_conversations/add_conversation_users.erb +5 -3
  30. data/app/cells/decidim/version_cell.rb +2 -13
  31. data/app/cells/decidim/versions_list_cell.rb +2 -13
  32. data/app/cells/decidim/versions_list_item_cell.rb +2 -13
  33. data/app/commands/decidim/accept_group_invitation.rb +1 -1
  34. data/app/commands/decidim/accept_user_group_join_request.rb +1 -1
  35. data/app/commands/decidim/amendable/accept.rb +1 -1
  36. data/app/commands/decidim/amendable/create_draft.rb +1 -1
  37. data/app/commands/decidim/amendable/destroy_draft.rb +1 -1
  38. data/app/commands/decidim/amendable/promote.rb +1 -1
  39. data/app/commands/decidim/amendable/publish_draft.rb +1 -1
  40. data/app/commands/decidim/amendable/reject.rb +1 -1
  41. data/app/commands/decidim/amendable/update_draft.rb +1 -1
  42. data/app/commands/decidim/amendable/withdraw.rb +1 -1
  43. data/app/commands/decidim/attachment_methods.rb +3 -2
  44. data/app/commands/decidim/create_editor_image.rb +1 -1
  45. data/app/commands/decidim/create_follow.rb +1 -1
  46. data/app/commands/decidim/create_omniauth_registration.rb +2 -3
  47. data/app/commands/decidim/create_registration.rb +1 -2
  48. data/app/commands/decidim/create_report.rb +1 -1
  49. data/app/commands/decidim/create_user_group.rb +2 -2
  50. data/app/commands/decidim/create_user_report.rb +5 -3
  51. data/app/commands/decidim/delete_follow.rb +1 -1
  52. data/app/commands/decidim/demote_membership.rb +1 -1
  53. data/app/commands/decidim/destroy_account.rb +1 -1
  54. data/app/commands/decidim/endorse_resource.rb +1 -1
  55. data/app/commands/decidim/gallery_methods.rb +45 -10
  56. data/app/commands/decidim/invite_user.rb +1 -3
  57. data/app/commands/decidim/invite_user_again.rb +1 -1
  58. data/app/commands/decidim/invite_user_to_group.rb +1 -1
  59. data/app/commands/decidim/join_user_group.rb +1 -1
  60. data/app/commands/decidim/leave_user_group.rb +8 -2
  61. data/app/commands/decidim/messaging/reply_to_conversation.rb +2 -2
  62. data/app/commands/decidim/messaging/start_conversation.rb +2 -2
  63. data/app/commands/decidim/multiple_attachments_methods.rb +44 -5
  64. data/app/commands/decidim/promote_membership.rb +1 -1
  65. data/app/commands/decidim/reject_group_invitation.rb +1 -1
  66. data/app/commands/decidim/reject_user_group_join_request.rb +1 -1
  67. data/app/commands/decidim/remove_user_from_group.rb +1 -1
  68. data/app/commands/decidim/resend_confirmation_instructions.rb +18 -0
  69. data/app/commands/decidim/search.rb +10 -9
  70. data/app/commands/decidim/unendorse_resource.rb +1 -1
  71. data/app/commands/decidim/unsubscribe_settings.rb +1 -1
  72. data/app/commands/decidim/update_account.rb +2 -2
  73. data/app/commands/decidim/update_notifications_settings.rb +3 -2
  74. data/app/commands/decidim/update_password.rb +31 -0
  75. data/app/commands/decidim/update_user_group.rb +2 -2
  76. data/app/commands/decidim/update_user_interests.rb +1 -1
  77. data/app/commands/decidim/validate_upload.rb +15 -0
  78. data/app/controllers/concerns/decidim/devise_controllers.rb +0 -1
  79. data/app/controllers/concerns/decidim/filter_resource.rb +23 -24
  80. data/app/controllers/concerns/decidim/force_authentication.rb +1 -2
  81. data/app/controllers/concerns/decidim/http_caching_disabler.rb +1 -1
  82. data/app/controllers/concerns/decidim/needs_password_change.rb +43 -0
  83. data/app/controllers/concerns/decidim/needs_tos_accepted.rb +3 -3
  84. data/app/controllers/concerns/decidim/orderable.rb +1 -1
  85. data/app/controllers/concerns/decidim/participatory_space_context.rb +2 -2
  86. data/app/controllers/decidim/account_controller.rb +45 -0
  87. data/app/controllers/decidim/application_controller.rb +1 -1
  88. data/app/controllers/decidim/devise/invitations_controller.rb +2 -0
  89. data/app/controllers/decidim/devise/passwords_controller.rb +33 -0
  90. data/app/controllers/decidim/devise/registrations_controller.rb +2 -0
  91. data/app/controllers/decidim/devise/sessions_controller.rb +2 -0
  92. data/app/controllers/decidim/{data_portability_controller.rb → download_your_data_controller.rb} +8 -8
  93. data/app/controllers/decidim/groups_controller.rb +5 -0
  94. data/app/controllers/decidim/last_activities_controller.rb +7 -9
  95. data/app/controllers/decidim/manifests_controller.rb +11 -0
  96. data/app/controllers/decidim/newsletters_controller.rb +1 -1
  97. data/app/controllers/decidim/notifications_subscriptions_controller.rb +16 -0
  98. data/app/controllers/decidim/offline_controller.rb +7 -0
  99. data/app/controllers/decidim/profiles_controller.rb +1 -1
  100. data/app/controllers/decidim/searches_controller.rb +4 -3
  101. data/app/controllers/decidim/short_links_controller.rb +35 -0
  102. data/app/controllers/decidim/upload_validations_controller.rb +44 -0
  103. data/app/controllers/decidim/user_activities_controller.rb +32 -16
  104. data/app/controllers/decidim/user_interests_controller.rb +0 -2
  105. data/app/controllers/decidim/user_timeline_controller.rb +6 -8
  106. data/app/events/decidim/change_nickname_event.rb +21 -0
  107. data/app/forms/decidim/account_form.rb +7 -6
  108. data/app/forms/decidim/form.rb +1 -1
  109. data/app/forms/decidim/messaging/conversation_form.rb +1 -1
  110. data/app/forms/decidim/notifications_settings_form.rb +8 -2
  111. data/app/forms/decidim/password_form.rb +10 -0
  112. data/app/forms/decidim/registration_form.rb +10 -4
  113. data/app/forms/decidim/upload_validation_form.rb +54 -0
  114. data/app/forms/decidim/user_group_form.rb +1 -1
  115. data/app/forms/decidim/user_interest_scope_form.rb +1 -1
  116. data/app/forms/decidim/user_interests_form.rb +1 -1
  117. data/app/forms/translatable_presence_validator.rb +2 -2
  118. data/app/forms/url_validator.rb +1 -1
  119. data/app/helpers/decidim/application_helper.rb +2 -2
  120. data/app/helpers/decidim/attachments_helper.rb +1 -1
  121. data/app/helpers/decidim/cells_paginate_helper.rb +1 -1
  122. data/app/helpers/decidim/datalist_select_helper.rb +40 -0
  123. data/app/helpers/decidim/decidim_form_helper.rb +1 -1
  124. data/app/helpers/decidim/followable_helper.rb +1 -1
  125. data/app/helpers/decidim/icon_helper.rb +1 -1
  126. data/app/helpers/decidim/layout_helper.rb +15 -1
  127. data/app/helpers/decidim/map_helper.rb +12 -8
  128. data/app/helpers/decidim/meta_tags_helper.rb +0 -2
  129. data/app/helpers/decidim/notifications_settings_helper.rb +15 -0
  130. data/app/helpers/decidim/passwords_helper.rb +41 -0
  131. data/app/helpers/decidim/sanitize_helper.rb +1 -0
  132. data/app/helpers/decidim/searches_helper.rb +6 -6
  133. data/app/helpers/decidim/short_link_helper.rb +28 -0
  134. data/app/helpers/decidim/translations_helper.rb +2 -2
  135. data/app/jobs/decidim/{data_portability_export_job.rb → download_your_data_export_job.rb} +5 -5
  136. data/app/jobs/decidim/email_notifications_digest_generator_job.rb +21 -0
  137. data/app/jobs/decidim/notification_generator_for_recipient_job.rb +5 -3
  138. data/app/jobs/decidim/reminder_generator_job.rb +12 -0
  139. data/app/jobs/decidim/resend_confirmation_instructions_job.rb +11 -0
  140. data/app/jobs/decidim/user_report_job.rb +2 -2
  141. data/app/mailers/concerns/decidim/multitenant_asset_host.rb +11 -3
  142. data/app/mailers/decidim/application_mailer.rb +1 -1
  143. data/app/mailers/decidim/block_user_mailer.rb +8 -7
  144. data/app/mailers/decidim/export_mailer.rb +2 -2
  145. data/app/mailers/decidim/newsletter_mailer.rb +2 -2
  146. data/app/mailers/decidim/newsletters_opt_in_mailer.rb +7 -5
  147. data/app/mailers/decidim/notifications_digest_mailer.rb +23 -0
  148. data/app/mailers/decidim/user_report_mailer.rb +10 -11
  149. data/app/models/decidim/action_log.rb +86 -2
  150. data/app/models/decidim/amendment.rb +0 -1
  151. data/app/models/decidim/area.rb +1 -2
  152. data/app/models/decidim/area_type.rb +5 -0
  153. data/app/models/decidim/attachment.rb +6 -0
  154. data/app/models/decidim/attachment_collection.rb +5 -0
  155. data/app/models/decidim/category.rb +9 -4
  156. data/app/models/decidim/coauthorship.rb +0 -2
  157. data/app/models/decidim/contextual_help_section.rb +5 -1
  158. data/app/models/decidim/follow.rb +2 -2
  159. data/app/models/decidim/gamification/badge_score.rb +0 -1
  160. data/app/models/decidim/identity.rb +2 -2
  161. data/app/models/decidim/messaging/conversation.rb +4 -4
  162. data/app/models/decidim/messaging/message.rb +1 -2
  163. data/app/models/decidim/messaging/participation.rb +0 -2
  164. data/app/models/decidim/messaging/receipt.rb +0 -2
  165. data/app/models/decidim/notification.rb +5 -2
  166. data/app/models/decidim/oauth_application.rb +12 -1
  167. data/app/models/decidim/organization.rb +7 -7
  168. data/app/models/decidim/participatory_space_private_user.rb +4 -2
  169. data/app/models/decidim/permission_action.rb +1 -0
  170. data/app/models/decidim/reminder.rb +10 -0
  171. data/app/models/decidim/reminder_delivery.rb +7 -0
  172. data/app/models/decidim/reminder_record.rb +29 -0
  173. data/app/models/decidim/report.rb +2 -2
  174. data/app/models/decidim/scope.rb +3 -4
  175. data/app/models/decidim/scope_type.rb +5 -0
  176. data/app/models/decidim/share_token.rb +0 -2
  177. data/app/models/decidim/short_link.rb +162 -0
  178. data/app/models/decidim/user.rb +34 -6
  179. data/app/models/decidim/user_base_entity.rb +1 -1
  180. data/app/models/decidim/user_group.rb +3 -3
  181. data/app/models/decidim/user_moderation.rb +0 -2
  182. data/app/models/decidim/user_report.rb +2 -2
  183. data/app/packs/entrypoints/decidim_core.js +2 -2
  184. data/app/packs/entrypoints/decidim_sw.js +1 -0
  185. data/app/packs/src/decidim/autocomplete.js +298 -0
  186. data/app/packs/src/decidim/cookie_consent/consent_manager.js +133 -0
  187. data/app/packs/src/decidim/cookie_consent/cookie_consent.js +103 -0
  188. data/app/packs/src/decidim/datalist_select.js +36 -0
  189. data/app/packs/src/decidim/direct_uploads/upload_field.js +117 -0
  190. data/app/packs/src/decidim/direct_uploads/upload_modal.js +264 -0
  191. data/app/packs/src/decidim/direct_uploads/upload_utility.js +49 -0
  192. data/app/packs/src/decidim/direct_uploads/uploader.js +89 -0
  193. data/app/packs/src/decidim/external_domain_warning.js +1 -1
  194. data/app/packs/src/decidim/external_link.js +14 -3
  195. data/app/packs/src/decidim/external_link.test.js +64 -0
  196. data/app/packs/src/decidim/geocoding.js +10 -35
  197. data/app/packs/src/decidim/identity_selector_dialog.js +1 -1
  198. data/app/packs/src/decidim/impersonation.js +3 -3
  199. data/app/packs/src/decidim/input_character_counter.js +177 -7
  200. data/app/packs/src/decidim/input_multiple_mentions.js +87 -187
  201. data/app/packs/src/decidim/map/factory.js +3 -1
  202. data/app/packs/src/decidim/map/icon.js +2 -1
  203. data/app/packs/src/decidim/map/legacy.js +2 -2
  204. data/app/packs/src/decidim/map/svg-icon.js +248 -0
  205. data/app/packs/src/decidim/map.js +2 -2
  206. data/app/packs/src/decidim/security/selfxss_warning.js +5 -1
  207. data/app/packs/src/decidim/session_timeouter.js +15 -15
  208. data/app/packs/src/decidim/sw/a2hs.js +28 -0
  209. data/app/packs/src/decidim/sw/index.js +3 -0
  210. data/app/packs/src/decidim/sw/loader.js +18 -0
  211. data/app/packs/src/decidim/sw/push-permissions.js +87 -0
  212. data/app/packs/src/decidim/sw/sw.js +80 -0
  213. data/app/packs/src/decidim/vizzs/areachart.js +33 -28
  214. data/app/packs/src/decidim/vizzs/{metrics.js → index.js} +0 -0
  215. data/app/packs/src/decidim/vizzs/linechart.js +23 -18
  216. data/app/packs/src/decidim/vizzs/rowchart.js +15 -11
  217. data/app/packs/stylesheets/decidim/email.scss +66 -0
  218. data/app/packs/stylesheets/decidim/layouts/_user.scss +8 -0
  219. data/app/packs/stylesheets/decidim/modules/_autocomplete.scss +99 -0
  220. data/app/packs/stylesheets/decidim/modules/_cookie-consent.scss +115 -0
  221. data/app/packs/stylesheets/decidim/modules/_footer.scss +4 -0
  222. data/app/packs/stylesheets/decidim/modules/_input-multiple-mentions.scss +29 -2
  223. data/app/packs/stylesheets/decidim/modules/_modules.scss +3 -1
  224. data/app/packs/stylesheets/decidim/modules/_reveal.scss +15 -0
  225. data/app/packs/stylesheets/decidim/modules/_upload_modal.scss +143 -0
  226. data/app/packs/stylesheets/decidim/utils/_fontface.scss +3 -0
  227. data/app/permissions/decidim/permissions.rb +2 -4
  228. data/app/presenters/decidim/admin_log/area_type_presenter.rb +34 -0
  229. data/app/presenters/decidim/admin_log/attachment_collection_presenter.rb +35 -0
  230. data/app/presenters/decidim/admin_log/attachment_presenter.rb +27 -0
  231. data/app/presenters/decidim/admin_log/category_presenter.rb +36 -0
  232. data/app/presenters/decidim/admin_log/component_presenter.rb +35 -3
  233. data/app/presenters/decidim/admin_log/contextual_help_section_presenter.rb +33 -0
  234. data/app/presenters/decidim/admin_log/organization_presenter.rb +9 -4
  235. data/app/presenters/decidim/admin_log/scope_type_presenter.rb +34 -0
  236. data/app/presenters/decidim/home_stats_presenter.rb +4 -2
  237. data/app/presenters/decidim/log/base_presenter.rb +1 -1
  238. data/app/presenters/decidim/menu_item_presenter.rb +1 -1
  239. data/app/presenters/decidim/metric_charts_presenter.rb +7 -1
  240. data/app/presenters/decidim/nil_presenter.rb +3 -1
  241. data/app/presenters/decidim/notification_to_mailer_presenter.rb +39 -0
  242. data/app/presenters/decidim/notifications_digest_presenter.rb +42 -0
  243. data/app/presenters/decidim/official_author_presenter.rb +4 -0
  244. data/app/presenters/decidim/organization_presenter.rb +22 -0
  245. data/app/presenters/decidim/push_notification_presenter.rb +24 -0
  246. data/app/presenters/decidim/stats_presenter.rb +1 -1
  247. data/app/presenters/decidim/validation_errors_presenter.rb +1 -1
  248. data/app/queries/decidim/messaging/user_conversations.rb +1 -1
  249. data/app/queries/decidim/metric_manage.rb +1 -1
  250. data/app/queries/decidim/own_activities.rb +11 -0
  251. data/app/queries/decidim/participatory_processes_with_user_role.rb +1 -1
  252. data/app/{services/decidim/activity_search.rb → queries/decidim/public_activities.rb} +35 -77
  253. data/app/queries/decidim/public_components.rb +1 -1
  254. data/app/queries/decidim/similar_emendations.rb +1 -1
  255. data/app/queries/decidim/stats_users_count.rb +1 -1
  256. data/app/queries/decidim/user_groups/accepted_memberships.rb +1 -1
  257. data/app/queries/decidim/user_groups/accepted_user_groups.rb +1 -1
  258. data/app/queries/decidim/user_groups/accepted_users.rb +1 -1
  259. data/app/queries/decidim/user_groups/admin_memberships.rb +1 -1
  260. data/app/queries/decidim/user_groups/invited_memberships.rb +1 -1
  261. data/app/queries/decidim/user_groups/manageable_user_groups.rb +1 -1
  262. data/app/queries/decidim/user_groups/member_memberships.rb +1 -1
  263. data/app/services/decidim/{data_portability_exporter.rb → download_your_data_exporter.rb} +6 -6
  264. data/app/services/decidim/email_notification_generator.rb +2 -2
  265. data/app/services/decidim/engine_resolver.rb +66 -0
  266. data/app/services/decidim/events_manager.rb +1 -1
  267. data/app/services/decidim/iframe_disabler.rb +31 -0
  268. data/app/services/decidim/notification_generator_for_recipient.rb +1 -1
  269. data/app/services/decidim/notifications_digest_sending_decider.rb +18 -0
  270. data/app/services/decidim/notifications_subscriptions_persistor.rb +37 -0
  271. data/app/services/decidim/open_data_exporter.rb +1 -1
  272. data/app/services/decidim/resource_search.rb +17 -164
  273. data/app/services/decidim/send_push_notification.rb +59 -0
  274. data/app/services/decidim/traceability.rb +1 -1
  275. data/app/uploaders/decidim/application_uploader.rb +2 -12
  276. data/app/uploaders/decidim/cw/attachment_uploader.rb +1 -1
  277. data/app/uploaders/decidim/cw/{data_portability_uploader.rb → download_your_data_uploader.rb} +3 -3
  278. data/app/uploaders/decidim/cw/image_uploader.rb +2 -2
  279. data/app/uploaders/decidim/organization_favicon_uploader.rb +3 -2
  280. data/app/validators/passthru_validator.rb +29 -21
  281. data/app/validators/password_validator.rb +25 -4
  282. data/app/validators/uploader_image_dimensions_validator.rb +1 -1
  283. data/app/views/decidim/account/_account_notification.js.erb +20 -0
  284. data/app/views/decidim/account/_password_fields.html.erb +2 -2
  285. data/app/views/decidim/account/cancel_email_change.js.erb +6 -0
  286. data/app/views/decidim/account/resend_confirmation_instructions.erb +1 -0
  287. data/app/views/decidim/account/show.html.erb +19 -6
  288. data/app/views/decidim/application/{_attachments.html.erb → _attachments.erb} +2 -2
  289. data/app/views/decidim/application/_collection.html.erb +1 -1
  290. data/app/views/decidim/application/{_document.html.erb → _document.erb} +0 -0
  291. data/app/views/decidim/application/{_documents.html.erb → _documents.erb} +2 -2
  292. data/app/views/decidim/application/{_photos.html.erb → _photos.erb} +0 -0
  293. data/app/views/decidim/devise/confirmations/new.html.erb +1 -1
  294. data/app/views/decidim/devise/invitations/edit.html.erb +3 -4
  295. data/app/views/decidim/devise/omniauth_registrations/new.html.erb +3 -3
  296. data/app/views/decidim/devise/passwords/edit.html.erb +7 -5
  297. data/app/views/decidim/devise/passwords/new.html.erb +1 -1
  298. data/app/views/decidim/devise/registrations/edit.html.erb +5 -5
  299. data/app/views/decidim/devise/registrations/new.html.erb +5 -5
  300. data/app/views/decidim/devise/sessions/new.html.erb +2 -2
  301. data/app/views/decidim/{data_portability → download_your_data}/export.html.erb +0 -0
  302. data/app/views/decidim/{data_portability → download_your_data}/show.html.erb +2 -2
  303. data/app/views/decidim/export_mailer/download_your_data_export.html.erb +7 -0
  304. data/app/views/decidim/last_activities/index.html.erb +1 -1
  305. data/app/views/decidim/manifests/show.json.erb +31 -0
  306. data/app/views/decidim/messaging/conversations/_add_conversation_users.html.erb +5 -3
  307. data/app/views/decidim/messaging/conversations/_reply.html.erb +1 -1
  308. data/app/views/decidim/messaging/conversations/_start.html.erb +1 -3
  309. data/app/views/decidim/messaging/conversations/create.js.erb +1 -0
  310. data/app/views/decidim/notifications_digest_mailer/_email_content.html.erb +11 -0
  311. data/app/views/decidim/notifications_digest_mailer/digest_mail.erb +27 -0
  312. data/app/views/decidim/notifications_settings/show.html.erb +34 -9
  313. data/app/views/decidim/offline/show.html.erb +9 -0
  314. data/app/views/decidim/pages/_standalone.html.erb +1 -1
  315. data/app/views/decidim/reported_mailer/hide.html.erb +1 -1
  316. data/app/views/decidim/reported_mailer/report.html.erb +1 -1
  317. data/app/views/decidim/scopes/picker.html.erb +1 -1
  318. data/app/views/decidim/searches/_filters.html.erb +2 -2
  319. data/app/views/decidim/shared/participatory_space_filters/_filters.html.erb +3 -3
  320. data/app/views/decidim/user_report_mailer/notify.html.erb +10 -3
  321. data/app/views/devise/mailer/confirmation_instructions.html.erb +3 -1
  322. data/app/views/layouts/decidim/_application.html.erb +6 -3
  323. data/app/views/layouts/decidim/_cookie_warning.html.erb +8 -8
  324. data/app/views/layouts/decidim/_decidim_javascript.html.erb +12 -0
  325. data/app/views/layouts/decidim/_head.html.erb +4 -2
  326. data/app/views/layouts/decidim/_js_configuration.html.erb +5 -1
  327. data/app/views/layouts/decidim/_main_footer.html.erb +1 -0
  328. data/app/views/layouts/decidim/_offline_banner.html.erb +11 -0
  329. data/app/views/layouts/decidim/widget.html.erb +2 -2
  330. data/config/assets.rb +1 -0
  331. data/config/locales/am-ET.yml +1 -0
  332. data/config/locales/ar.yml +48 -36
  333. data/config/locales/bg.yml +15 -30
  334. data/config/locales/ca.yml +186 -35
  335. data/config/locales/cs.yml +186 -33
  336. data/config/locales/da.yml +1 -0
  337. data/config/locales/de.yml +25 -36
  338. data/config/locales/el.yml +15 -30
  339. data/config/locales/en.yml +183 -32
  340. data/config/locales/eo.yml +4 -6
  341. data/config/locales/es-MX.yml +185 -34
  342. data/config/locales/es-PY.yml +185 -34
  343. data/config/locales/es.yml +185 -34
  344. data/config/locales/et.yml +1 -0
  345. data/config/locales/eu.yml +15 -36
  346. data/config/locales/fi-plain.yml +184 -33
  347. data/config/locales/fi.yml +184 -33
  348. data/config/locales/fr-CA.yml +170 -33
  349. data/config/locales/fr.yml +170 -33
  350. data/config/locales/ga-IE.yml +5 -7
  351. data/config/locales/gl.yml +47 -30
  352. data/config/locales/hr.yml +1 -0
  353. data/config/locales/hu.yml +65 -35
  354. data/config/locales/id-ID.yml +15 -29
  355. data/config/locales/is-IS.yml +6 -15
  356. data/config/locales/it.yml +22 -38
  357. data/config/locales/ja.yml +173 -34
  358. data/config/locales/ko.yml +1 -0
  359. data/config/locales/lb.yml +16 -32
  360. data/config/locales/lt.yml +1 -0
  361. data/config/locales/lv.yml +15 -28
  362. data/config/locales/mt.yml +1 -0
  363. data/config/locales/nl.yml +25 -33
  364. data/config/locales/no.yml +24 -35
  365. data/config/locales/om-ET.yml +1 -0
  366. data/config/locales/pl.yml +113 -32
  367. data/config/locales/pt-BR.yml +17 -32
  368. data/config/locales/pt.yml +16 -32
  369. data/config/locales/ro-RO.yml +20 -36
  370. data/config/locales/ru.yml +15 -27
  371. data/config/locales/si-LK.yml +1 -0
  372. data/config/locales/sk.yml +15 -30
  373. data/config/locales/sl.yml +1 -0
  374. data/config/locales/so-SO.yml +1 -0
  375. data/config/locales/sr-CS.yml +1 -0
  376. data/config/locales/sv.yml +69 -34
  377. data/config/locales/sw-KE.yml +1 -0
  378. data/config/locales/ti-ER.yml +1 -0
  379. data/config/locales/tr-TR.yml +15 -29
  380. data/config/locales/uk.yml +15 -26
  381. data/config/locales/val-ES.yml +1 -0
  382. data/config/locales/vi.yml +1 -0
  383. data/config/locales/zh-CN.yml +15 -28
  384. data/config/locales/zh-TW.yml +1 -0
  385. data/config/routes.rb +17 -2
  386. data/db/migrate/20180508111710_add_accepted_tos_version_field_to_users.rb +1 -0
  387. data/db/migrate/20181030090144_destroy_deleted_users_follows.rb +1 -0
  388. data/db/migrate/20190412131728_fix_user_names.rb +4 -4
  389. data/db/migrate/20210831181634_add_service_name_to_active_storage_blobs.active_storage.rb +22 -0
  390. data/db/migrate/20210831181635_create_active_storage_variant_records.active_storage.rb +14 -0
  391. data/db/migrate/20211208155453_create_decidim_reminders.rb +11 -0
  392. data/db/migrate/20211209121025_create_decidim_reminder_records.rb +11 -0
  393. data/db/migrate/20211209121040_create_decidim_reminder_deliveries.rb +10 -0
  394. data/db/migrate/20220118121921_change_required_description_categories.rb +7 -0
  395. data/db/migrate/20220127113419_add_notification_settings_to_users.rb +7 -0
  396. data/db/migrate/20220203121137_add_notifications_sending_frequency_to_users.rb +7 -0
  397. data/db/migrate/20220215172439_add_digest_sent_at_to_users.rb +7 -0
  398. data/db/migrate/20220323195258_add_index_to_decidim_users_notifications_sending_frequency.rb +7 -0
  399. data/db/migrate/20220427142214_drop_emails_on_notifications_flag_from_user.rb +15 -0
  400. data/db/migrate/20220518094535_add_previous_passwords_to_users.rb +20 -0
  401. data/db/migrate/20220524195530_create_decidim_short_links.rb +23 -0
  402. data/db/seeds.rb +17 -18
  403. data/lib/decidim/acts_as_tree.rb +47 -0
  404. data/lib/decidim/api/input_sorts/component_input_sort.rb +2 -1
  405. data/lib/decidim/api/interfaces/authorable_interface.rb +6 -5
  406. data/lib/decidim/asset_router.rb +80 -0
  407. data/lib/decidim/attachment_attributes.rb +8 -8
  408. data/lib/decidim/attribute_object/form.rb +174 -0
  409. data/lib/decidim/attribute_object/model.rb +148 -0
  410. data/lib/decidim/attribute_object/nested_validator.rb +22 -0
  411. data/lib/decidim/attribute_object/type_map.rb +14 -0
  412. data/lib/decidim/attribute_object/type_resolver.rb +91 -0
  413. data/lib/decidim/attribute_object.rb +26 -0
  414. data/lib/decidim/attributes/array.rb +62 -0
  415. data/lib/decidim/attributes/blob.rb +20 -0
  416. data/lib/decidim/attributes/clean_string.rb +12 -6
  417. data/lib/decidim/attributes/hash.rb +36 -0
  418. data/lib/decidim/attributes/integer.rb +17 -0
  419. data/lib/decidim/attributes/localized_date.rb +9 -7
  420. data/lib/decidim/attributes/model.rb +24 -0
  421. data/lib/decidim/attributes/object.rb +28 -0
  422. data/lib/decidim/attributes/symbol.rb +23 -0
  423. data/lib/decidim/attributes/time_with_zone.rb +9 -7
  424. data/lib/decidim/attributes.rb +29 -0
  425. data/lib/decidim/authorable.rb +21 -6
  426. data/lib/decidim/authorization_form_builder.rb +9 -11
  427. data/lib/decidim/carrier_wave_migrator_service.rb +15 -15
  428. data/lib/decidim/coauthorable.rb +22 -4
  429. data/lib/decidim/command.rb +44 -0
  430. data/lib/decidim/common_passwords.rb +1 -1
  431. data/lib/decidim/component_manifest.rb +5 -5
  432. data/lib/decidim/component_validator.rb +2 -2
  433. data/lib/decidim/content_block_manifest.rb +1 -1
  434. data/lib/decidim/content_parsers/hashtag_parser.rb +2 -2
  435. data/lib/decidim/content_parsers/resource_parser.rb +1 -1
  436. data/lib/decidim/content_parsers/user_group_parser.rb +1 -1
  437. data/lib/decidim/content_parsers/user_parser.rb +4 -4
  438. data/lib/decidim/content_renderers/hashtag_renderer.rb +1 -1
  439. data/lib/decidim/content_renderers/link_renderer.rb +2 -2
  440. data/lib/decidim/content_renderers/user_group_renderer.rb +1 -1
  441. data/lib/decidim/content_renderers/user_renderer.rb +1 -1
  442. data/lib/decidim/controller_helpers.rb +41 -0
  443. data/lib/decidim/core/engine.rb +29 -18
  444. data/lib/decidim/core/test/factories.rb +48 -8
  445. data/lib/decidim/core/test/shared_examples/admin_resource_gallery_examples.rb +16 -4
  446. data/lib/decidim/core/test/shared_examples/amendable/amendment_form_examples.rb +1 -1
  447. data/lib/decidim/core/test/shared_examples/authorable_interface_examples.rb +15 -2
  448. data/lib/decidim/core/test/shared_examples/coauthorable_interface_examples.rb +2 -2
  449. data/lib/decidim/core/test/shared_examples/comments_examples.rb +203 -0
  450. data/lib/decidim/core/test/shared_examples/localised_email.rb +1 -1
  451. data/lib/decidim/core/test/shared_examples/logo_email.rb +1 -1
  452. data/lib/decidim/core/test/shared_examples/map_examples.rb +2 -2
  453. data/lib/decidim/core/test/shared_examples/preview_component_with_share_token_examples.rb +0 -6
  454. data/lib/decidim/core/test/shared_examples/resource_search_examples.rb +120 -40
  455. data/lib/decidim/core/test/shared_examples/resourceable.rb +0 -6
  456. data/lib/decidim/core/test/shared_examples/searchable_participatory_space_examples.rb +1 -1
  457. data/lib/decidim/core/test/shared_examples/searchable_resources_shared_context.rb +1 -1
  458. data/lib/decidim/core/test/shared_examples/system_endorse_resource_examples.rb +3 -3
  459. data/lib/decidim/core/test/shared_examples/translated_event_examples.rb +2 -2
  460. data/lib/decidim/core/version.rb +1 -1
  461. data/lib/decidim/core.rb +108 -14
  462. data/lib/decidim/{data_portability.rb → download_your_data.rb} +3 -3
  463. data/lib/decidim/{data_portability_serializers/data_portability_conversation_serializer.rb → download_your_data_serializers/download_your_data_conversation_serializer.rb} +2 -2
  464. data/lib/decidim/{data_portability_serializers/data_portability_follow_serializer.rb → download_your_data_serializers/download_your_data_follow_serializer.rb} +2 -2
  465. data/lib/decidim/{data_portability_serializers/data_portability_identity_serializer.rb → download_your_data_serializers/download_your_data_identity_serializer.rb} +2 -2
  466. data/lib/decidim/{data_portability_serializers/data_portability_notification_serializer.rb → download_your_data_serializers/download_your_data_notification_serializer.rb} +2 -2
  467. data/lib/decidim/{data_portability_serializers/data_portability_participatory_space_private_user_serializer.rb → download_your_data_serializers/download_your_data_participatory_space_private_user_serializer.rb} +2 -2
  468. data/lib/decidim/{data_portability_serializers/data_portability_report_serializer.rb → download_your_data_serializers/download_your_data_report_serializer.rb} +2 -2
  469. data/lib/decidim/{data_portability_serializers/data_portability_user_group_serializer.rb → download_your_data_serializers/download_your_data_user_group_serializer.rb} +2 -2
  470. data/lib/decidim/{data_portability_serializers/data_portability_user_serializer.rb → download_your_data_serializers/download_your_data_user_serializer.rb} +3 -3
  471. data/lib/decidim/download_your_data_serializers.rb +23 -0
  472. data/lib/decidim/engine_router.rb +7 -1
  473. data/lib/decidim/env.rb +56 -0
  474. data/lib/decidim/event_recorder.rb +25 -0
  475. data/lib/decidim/events/base_event.rb +10 -14
  476. data/lib/decidim/events/simple_event.rb +12 -4
  477. data/lib/decidim/exporters/export_data.rb +1 -1
  478. data/lib/decidim/exporters/export_manifest.rb +2 -1
  479. data/lib/decidim/file_validator_humanizer.rb +24 -1
  480. data/lib/decidim/filterable_resource.rb +55 -0
  481. data/lib/decidim/fingerprint_calculator.rb +2 -4
  482. data/lib/decidim/form_builder.rb +158 -130
  483. data/lib/decidim/gamification/badge.rb +2 -3
  484. data/lib/decidim/gamification/badge_scorer.rb +1 -0
  485. data/lib/decidim/has_area.rb +27 -0
  486. data/lib/decidim/has_attachments.rb +2 -2
  487. data/lib/decidim/has_category.rb +36 -0
  488. data/lib/decidim/importers/import_manifest.rb +3 -21
  489. data/lib/decidim/jsonb_attributes.rb +6 -4
  490. data/lib/decidim/manifest_messages.rb +23 -0
  491. data/lib/decidim/map/autocomplete.rb +6 -4
  492. data/lib/decidim/map/frontend.rb +2 -2
  493. data/lib/decidim/map/provider/geocoding/here.rb +5 -5
  494. data/lib/decidim/map/provider/here.rb +3 -0
  495. data/lib/decidim/map/provider/osm.rb +3 -0
  496. data/lib/decidim/map.rb +4 -4
  497. data/lib/decidim/menu.rb +1 -1
  498. data/lib/decidim/metric_manifest.rb +2 -2
  499. data/lib/decidim/nicknamizable.rb +1 -1
  500. data/lib/decidim/notification_setting_manifest.rb +19 -0
  501. data/lib/decidim/organization_settings.rb +8 -7
  502. data/lib/decidim/participatory_space_context_manifest.rb +2 -2
  503. data/lib/decidim/participatory_space_manifest.rb +2 -2
  504. data/lib/decidim/processes_file_locally.rb +31 -0
  505. data/lib/decidim/query.rb +84 -0
  506. data/lib/decidim/record_encryptor.rb +29 -8
  507. data/lib/decidim/reminder_manifest.rb +75 -0
  508. data/lib/decidim/reminder_registry.rb +67 -0
  509. data/lib/decidim/resource_manifest.rb +1 -1
  510. data/lib/decidim/resourceable.rb +11 -0
  511. data/lib/decidim/scopable.rb +15 -0
  512. data/lib/decidim/settings_manifest.rb +4 -4
  513. data/lib/decidim/spring.rb +16 -0
  514. data/lib/decidim/translatable_attributes.rb +12 -8
  515. data/lib/decidim/url_option_resolver.rb +50 -0
  516. data/lib/decidim/view_hooks.rb +1 -1
  517. data/lib/decidim/view_model.rb +5 -1
  518. data/lib/decidim/webpacker/thread_safe_compiler.rb +30 -0
  519. data/lib/decidim/webpacker/webpack/custom.js +15 -3
  520. data/lib/decidim/webpacker/webpacker.yml +1 -1
  521. data/lib/decidim/webpacker.rb +2 -0
  522. data/lib/devise/models/decidim_validatable.rb +1 -1
  523. data/lib/tasks/decidim_active_storage_migration_tasks.rake +1 -3
  524. data/lib/tasks/{decidim_data_portability_tasks.rake → decidim_download_your_data_tasks.rake} +9 -9
  525. data/lib/tasks/decidim_mailers_tasks.rake +23 -0
  526. data/lib/tasks/decidim_metrics_tasks.rake +1 -1
  527. data/lib/tasks/decidim_pwa_tasks.rake +18 -0
  528. data/lib/tasks/decidim_reminders_tasks.rake +17 -0
  529. data/lib/tasks/decidim_tasks.rake +6 -1
  530. data/lib/tasks/decidim_webpacker_tasks.rake +1 -1
  531. data/lib/tasks/upgrade/decidim_fix_nickname_uniqueness.rake +51 -0
  532. metadata +184 -83
  533. data/app/controllers/decidim/cookie_policy_controller.rb +0 -24
  534. data/app/helpers/decidim/cookies_helper.rb +0 -11
  535. data/app/packs/src/decidim/vizzs/renders.js +0 -9
  536. data/app/packs/src/decidim/vizzs.js +0 -1
  537. data/app/packs/stylesheets/decidim/modules/_cookie-bar.scss +0 -26
  538. data/app/services/decidim/home_activity_search.rb +0 -80
  539. data/app/services/decidim/participatory_space_search.rb +0 -54
  540. data/app/views/decidim/cookie_policy/accept.js.erb +0 -3
  541. data/app/views/decidim/export_mailer/data_portability_export.html.erb +0 -7
  542. data/lib/decidim/data_portability_serializers.rb +0 -23
  543. data/lib/decidim/middleware/rails_cookies.rb +0 -23
data/lib/decidim/core.rb CHANGED
@@ -3,10 +3,13 @@
3
3
  require "decidim/core/engine"
4
4
  require "decidim/core/api"
5
5
  require "decidim/core/version"
6
+
6
7
  # Decidim configuration.
7
8
  module Decidim
9
+ autoload :Env, "decidim/env"
8
10
  autoload :Deprecations, "decidim/deprecations"
9
11
  autoload :ActsAsAuthor, "decidim/acts_as_author"
12
+ autoload :ActsAsTree, "decidim/acts_as_tree"
10
13
  autoload :TranslatableAttributes, "decidim/translatable_attributes"
11
14
  autoload :TranslatableResource, "decidim/translatable_resource"
12
15
  autoload :JsonbAttributes, "decidim/jsonb_attributes"
@@ -14,6 +17,7 @@ module Decidim
14
17
  autoload :AuthorizationFormBuilder, "decidim/authorization_form_builder"
15
18
  autoload :FilterFormBuilder, "decidim/filter_form_builder"
16
19
  autoload :ComponentManifest, "decidim/component_manifest"
20
+ autoload :NotificationSettingManifest, "decidim/notification_setting_manifest"
17
21
  autoload :ParticipatorySpaceManifest, "decidim/participatory_space_manifest"
18
22
  autoload :ResourceManifest, "decidim/resource_manifest"
19
23
  autoload :Resourceable, "decidim/resourceable"
@@ -43,7 +47,6 @@ module Decidim
43
47
  autoload :FriendlyDates, "decidim/friendly_dates"
44
48
  autoload :Nicknamizable, "decidim/nicknamizable"
45
49
  autoload :HasReference, "decidim/has_reference"
46
- autoload :Attributes, "decidim/attributes"
47
50
  autoload :StatsRegistry, "decidim/stats_registry"
48
51
  autoload :Exporters, "decidim/exporters"
49
52
  autoload :FileZipper, "decidim/file_zipper"
@@ -51,7 +54,9 @@ module Decidim
51
54
  autoload :MenuItem, "decidim/menu_item"
52
55
  autoload :MenuRegistry, "decidim/menu_registry"
53
56
  autoload :ManifestRegistry, "decidim/manifest_registry"
57
+ autoload :AssetRouter, "decidim/asset_router"
54
58
  autoload :EngineRouter, "decidim/engine_router"
59
+ autoload :UrlOptionResolver, "decidim/url_option_resolver"
55
60
  autoload :Events, "decidim/events"
56
61
  autoload :ViewHooks, "decidim/view_hooks"
57
62
  autoload :ContentBlockRegistry, "decidim/content_block_registry"
@@ -64,6 +69,7 @@ module Decidim
64
69
  autoload :NewsletterEncryptor, "decidim/newsletter_encryptor"
65
70
  autoload :NewsletterParticipant, "decidim/newsletter_participant"
66
71
  autoload :Searchable, "decidim/searchable"
72
+ autoload :FilterableResource, "decidim/filterable_resource"
67
73
  autoload :SearchResourceFieldsMapper, "decidim/search_resource_fields_mapper"
68
74
  autoload :QueryExtensions, "decidim/query_extensions"
69
75
  autoload :ParticipatorySpaceResourceable, "decidim/participatory_space_resourceable"
@@ -71,9 +77,9 @@ module Decidim
71
77
  autoload :ViewModel, "decidim/view_model"
72
78
  autoload :FingerprintCalculator, "decidim/fingerprint_calculator"
73
79
  autoload :Fingerprintable, "decidim/fingerprintable"
74
- autoload :DataPortability, "decidim/data_portability"
75
- autoload :DataPortabilitySerializers, "decidim/data_portability_serializers"
76
- autoload :DataPortabilityExporter, "decidim/data_portability_exporter"
80
+ autoload :DownloadYourData, "decidim/download_your_data"
81
+ autoload :DownloadYourDataSerializers, "decidim/download_your_data_serializers"
82
+ autoload :DownloadYourDataExporter, "decidim/download_your_data_exporter"
77
83
  autoload :Amendable, "decidim/amendable"
78
84
  autoload :Gamification, "decidim/gamification"
79
85
  autoload :Hashtag, "decidim/hashtag"
@@ -96,7 +102,17 @@ module Decidim
96
102
  autoload :RecordEncryptor, "decidim/record_encryptor"
97
103
  autoload :AttachmentAttributes, "decidim/attachment_attributes"
98
104
  autoload :CarrierWaveMigratorService, "decidim/carrier_wave_migrator_service"
105
+ autoload :ReminderRegistry, "decidim/reminder_registry"
106
+ autoload :ReminderManifest, "decidim/reminder_manifest"
107
+ autoload :ManifestMessages, "decidim/manifest_messages"
99
108
  autoload :CommonPasswords, "decidim/common_passwords"
109
+ autoload :HasArea, "decidim/has_area"
110
+ autoload :AttributeObject, "decidim/attribute_object"
111
+ autoload :Query, "decidim/query"
112
+ autoload :Command, "decidim/command"
113
+ autoload :EventRecorder, "decidim/event_recorder"
114
+ autoload :ControllerHelpers, "decidim/controller_helpers"
115
+ autoload :ProcessesFileLocally, "decidim/processes_file_locally"
100
116
 
101
117
  include ActiveSupport::Configurable
102
118
  # Loads seeds from all engines.
@@ -259,8 +275,8 @@ module Decidim
259
275
  true
260
276
  end
261
277
 
262
- # Time that data portability files are available in server
263
- config_accessor :data_portability_expiry_time do
278
+ # Time that download your data files are available in server
279
+ config_accessor :download_your_data_expiry_time do
264
280
  7.days
265
281
  end
266
282
 
@@ -383,7 +399,43 @@ module Decidim
383
399
  # Defines the name of the cookie used to check if the user allows Decidim to
384
400
  # set cookies.
385
401
  config_accessor :consent_cookie_name do
386
- "decidim-cc"
402
+ "decidim-consent"
403
+ end
404
+
405
+ # Defines cookie categories. Note that when adding a cookie you need to
406
+ # add following i18n entries also (change 'foo' with the name of the cookie).
407
+ #
408
+ # layouts.decidim.cookie_consent.cookie_details.cookies.foo.service
409
+ # layouts.decidim.cookie_consent.cookie_details.cookies.foo.description
410
+ config_accessor :consent_categories do
411
+ [
412
+ {
413
+ slug: "essential",
414
+ mandatory: true,
415
+ cookies: [
416
+ {
417
+ type: "cookie",
418
+ name: "_session_id"
419
+ },
420
+ {
421
+ type: "cookie",
422
+ name: Decidim.consent_cookie_name
423
+ }
424
+ ]
425
+ },
426
+ {
427
+ slug: "preferences",
428
+ mandatory: false
429
+ },
430
+ {
431
+ slug: "analytics",
432
+ mandatory: false
433
+ },
434
+ {
435
+ slug: "marketing",
436
+ mandatory: false
437
+ }
438
+ ]
387
439
  end
388
440
 
389
441
  # Blacklisted passwords. Array may contain strings and regex entries.
@@ -391,6 +443,23 @@ module Decidim
391
443
  []
392
444
  end
393
445
 
446
+ # Defines if admins are required to have stronger passwords than other users
447
+ config_accessor :admin_password_strong do
448
+ true
449
+ end
450
+
451
+ config_accessor :admin_password_expiration_days do
452
+ 90
453
+ end
454
+
455
+ config_accessor :admin_password_min_length do
456
+ 15
457
+ end
458
+
459
+ config_accessor :admin_password_repetition_times do
460
+ 5
461
+ end
462
+
394
463
  # This is an internal key that allow us to properly configure the caching key separator. This is useful for redis cache store
395
464
  # as it creates some namespaces within the cached data.
396
465
  # use `config.cache_key_separator = ":"` in your initializer to have namespaced data
@@ -398,6 +467,11 @@ module Decidim
398
467
  "/"
399
468
  end
400
469
 
470
+ # Enable/Disable the service worker
471
+ config_accessor :service_worker_enabled do
472
+ Rails.env.exclude?("development")
473
+ end
474
+
401
475
  # Public: Registers a global engine. This method is intended to be used
402
476
  # by component engines that also offer unscoped functionality
403
477
  #
@@ -471,6 +545,10 @@ module Decidim
471
545
  resource_registry.register(name, &block)
472
546
  end
473
547
 
548
+ def self.notification_settings(name, &block)
549
+ notification_settings_registry.register(name, &block)
550
+ end
551
+
474
552
  # Public: Finds all registered resource manifests via the `register_component`
475
553
  # method.
476
554
  #
@@ -534,11 +612,19 @@ module Decidim
534
612
  @participatory_space_registry ||= ManifestRegistry.new(:participatory_spaces)
535
613
  end
536
614
 
615
+ def self.reminders_registry
616
+ @reminders_registry ||= ReminderRegistry.new
617
+ end
618
+
537
619
  # Public: Stores the registry of resource spaces
538
620
  def self.resource_registry
539
621
  @resource_registry ||= ManifestRegistry.new(:resources)
540
622
  end
541
623
 
624
+ def self.notification_settings_registry
625
+ @notification_settings_registry ||= ManifestRegistry.new(:notification_settings)
626
+ end
627
+
542
628
  # Public: Stores the registry for user permissions
543
629
  def self.permissions_registry
544
630
  @permissions_registry ||= PermissionsRegistry.new
@@ -594,13 +680,12 @@ module Decidim
594
680
  # organization or a model responding to the `organization` method.
595
681
  #
596
682
  def self.organization_settings(model)
597
- organization = begin
598
- if model.is_a?(Decidim::Organization)
599
- model
600
- elsif model.respond_to?(:organization) && model.organization.present?
601
- model.organization
602
- end
603
- end
683
+ organization = if model.is_a?(Decidim::Organization)
684
+ model
685
+ elsif model.respond_to?(:organization) && model.organization.present?
686
+ model.organization
687
+ end
688
+
604
689
  return Decidim::OrganizationSettings.defaults unless organization
605
690
 
606
691
  Decidim::OrganizationSettings.for(organization)
@@ -625,4 +710,13 @@ module Decidim
625
710
  def self.register_assets_path(path)
626
711
  Rails.autoloaders.main.ignore(path) if Rails.configuration.autoloader == :zeitwerk
627
712
  end
713
+
714
+ # Checks if a particular decidim gem is installed
715
+ # Note that defined(Decidim::Something) does not work all the times, specially when the
716
+ # Gemfile uses the "path" parameter to find the module.
717
+ # This is because the module can be defined by some files searched by Rails automatically
718
+ # (ie: decidim-initiatives/lib/decidim/initiatives/version.rb automatically defines Decidim::Intiatives even if not required)
719
+ def self.module_installed?(mod)
720
+ Gem.loaded_specs.has_key?("decidim-#{mod}")
721
+ end
628
722
  end
@@ -3,8 +3,8 @@
3
3
  require "active_support/concern"
4
4
 
5
5
  module Decidim
6
- # This concern contains the logic related to data portability.
7
- module DataPortability
6
+ # This concern contains the logic related to download your data.
7
+ module DownloadYourData
8
8
  extend ActiveSupport::Concern
9
9
 
10
10
  included do
@@ -23,7 +23,7 @@ module Decidim
23
23
 
24
24
  # Returns a collection of images scoped by User.
25
25
  # Returns nil for default.
26
- def self.data_portability_images(_user)
26
+ def self.download_your_data_images(_user)
27
27
  nil
28
28
  end
29
29
  end
@@ -2,8 +2,8 @@
2
2
 
3
3
  module Decidim
4
4
  # This class serializes a Message so can be exported to CSV
5
- module DataPortabilitySerializers
6
- class DataPortabilityConversationSerializer < Decidim::Exporters::Serializer
5
+ module DownloadYourDataSerializers
6
+ class DownloadYourDataConversationSerializer < Decidim::Exporters::Serializer
7
7
  include Decidim::ResourceHelper
8
8
 
9
9
  # Public: Initializes the serializer with a conversation.
@@ -2,8 +2,8 @@
2
2
 
3
3
  module Decidim
4
4
  # This class serializes a Follow so can be exported to CSV
5
- module DataPortabilitySerializers
6
- class DataPortabilityFollowSerializer < Decidim::Exporters::Serializer
5
+ module DownloadYourDataSerializers
6
+ class DownloadYourDataFollowSerializer < Decidim::Exporters::Serializer
7
7
  include Decidim::ResourceHelper
8
8
 
9
9
  # Public: Exports a hash with the serialized data for follow.
@@ -2,8 +2,8 @@
2
2
 
3
3
  module Decidim
4
4
  # This class serializes a Identity so can be exported to CSV
5
- module DataPortabilitySerializers
6
- class DataPortabilityIdentitySerializer < Decidim::Exporters::Serializer
5
+ module DownloadYourDataSerializers
6
+ class DownloadYourDataIdentitySerializer < Decidim::Exporters::Serializer
7
7
  include Decidim::ResourceHelper
8
8
 
9
9
  # Public: Exports a hash with the serialized data for this identities.
@@ -2,8 +2,8 @@
2
2
 
3
3
  module Decidim
4
4
  # This class serializes a Follow so can be exported to CSV
5
- module DataPortabilitySerializers
6
- class DataPortabilityNotificationSerializer < Decidim::Exporters::Serializer
5
+ module DownloadYourDataSerializers
6
+ class DownloadYourDataNotificationSerializer < Decidim::Exporters::Serializer
7
7
  include Decidim::ResourceHelper
8
8
 
9
9
  # Public: Exports a hash with the serialized data for follow.
@@ -2,8 +2,8 @@
2
2
 
3
3
  module Decidim
4
4
  # This class serializes a User so can be exported to CSV
5
- module DataPortabilitySerializers
6
- class DataPortabilityParticipatorySpacePrivateUserSerializer < Decidim::Exporters::Serializer
5
+ module DownloadYourDataSerializers
6
+ class DownloadYourDataParticipatorySpacePrivateUserSerializer < Decidim::Exporters::Serializer
7
7
  include Decidim::ResourceHelper
8
8
 
9
9
  # Public: Exports a hash with the serialized data for this user.
@@ -2,8 +2,8 @@
2
2
 
3
3
  module Decidim
4
4
  # This class serializes a Report so can be exported to CSV
5
- module DataPortabilitySerializers
6
- class DataPortabilityReportSerializer < Decidim::Exporters::Serializer
5
+ module DownloadYourDataSerializers
6
+ class DownloadYourDataReportSerializer < Decidim::Exporters::Serializer
7
7
  include Decidim::ResourceHelper
8
8
 
9
9
  # Public: Exports a hash with the serialized data for this conversation.
@@ -2,8 +2,8 @@
2
2
 
3
3
  module Decidim
4
4
  # This class serializes a User so can be exported to CSV
5
- module DataPortabilitySerializers
6
- class DataPortabilityUserGroupSerializer < Decidim::Exporters::Serializer
5
+ module DownloadYourDataSerializers
6
+ class DownloadYourDataUserGroupSerializer < Decidim::Exporters::Serializer
7
7
  include Decidim::ResourceHelper
8
8
 
9
9
  # Public: Exports a hash with the serialized data for this user.
@@ -2,8 +2,8 @@
2
2
 
3
3
  module Decidim
4
4
  # This class serializes a User so can be exported to CSV
5
- module DataPortabilitySerializers
6
- class DataPortabilityUserSerializer < Decidim::Exporters::Serializer
5
+ module DownloadYourDataSerializers
6
+ class DownloadYourDataUserSerializer < Decidim::Exporters::Serializer
7
7
  include Decidim::ResourceHelper
8
8
 
9
9
  # Public: Exports a hash with the serialized data for this user.
@@ -19,7 +19,7 @@ module Decidim
19
19
  name: resource.organization.try(:name)
20
20
  },
21
21
  newsletter_notifications_at: resource.newsletter_notifications_at,
22
- email_on_notification: resource.email_on_notification,
22
+ notifications_sending_frequency: resource.notifications_sending_frequency,
23
23
  admin: resource.admin,
24
24
  personal_url: resource.personal_url,
25
25
  about: resource.about,
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module DownloadYourDataSerializers
5
+ autoload :DownloadYourDataUserSerializer, "decidim/download_your_data_serializers/download_your_data_user_serializer"
6
+ autoload :DownloadYourDataUserGroupSerializer, "decidim/download_your_data_serializers/download_your_data_user_group_serializer"
7
+ autoload :DownloadYourDataConversationSerializer, "decidim/download_your_data_serializers/download_your_data_conversation_serializer"
8
+ autoload :DownloadYourDataReportSerializer, "decidim/download_your_data_serializers/download_your_data_report_serializer"
9
+ autoload :DownloadYourDataFollowSerializer, "decidim/download_your_data_serializers/download_your_data_follow_serializer"
10
+ autoload :DownloadYourDataNotificationSerializer, "decidim/download_your_data_serializers/download_your_data_notification_serializer"
11
+ autoload :DownloadYourDataIdentitySerializer, "decidim/download_your_data_serializers/download_your_data_identity_serializer"
12
+ autoload :DownloadYourDataParticipatorySpacePrivateUserSerializer, "decidim/download_your_data_serializers/download_your_data_participatory_space_private_user_serializer"
13
+
14
+ def self.data_entities
15
+ ["Decidim::Follow", "Decidim::Identity",
16
+ "Decidim::Messaging::Conversation", "Decidim::Notification",
17
+ "Decidim::ParticipatorySpacePrivateUser", "Decidim::Report", "Decidim::User", "Decidim::UserGroup"] |
18
+ Decidim.component_manifests.map(&:data_portable_entities).flatten |
19
+ Decidim.participatory_space_manifests.map(&:data_portable_entities).flatten |
20
+ (Decidim::Comments.data_portable_entities.flatten if defined?(Decidim::Comments))
21
+ end
22
+ end
23
+ end
@@ -34,7 +34,7 @@ module Decidim
34
34
  end
35
35
 
36
36
  def default_url_options
37
- @default_url_options.reverse_merge(ActionMailer::Base.default_url_options)
37
+ @default_url_options.reverse_merge(configured_default_url_options)
38
38
  end
39
39
 
40
40
  def respond_to_missing?(method_name, include_private = false)
@@ -52,5 +52,11 @@ module Decidim
52
52
  def route_helper?(method_name)
53
53
  method_name.to_s.match?(/_(url|path)$/)
54
54
  end
55
+
56
+ def configured_default_url_options
57
+ @configured_default_url_options ||=
58
+ ActionMailer::Base.default_url_options.presence ||
59
+ UrlOptionResolver.new.options
60
+ end
55
61
  end
56
62
  end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ # This class can be used to parse ENV variables to a set of predefined values
5
+ # For instance, "", nil, "false" or 0 will all translate into false using valid?
6
+ class Env
7
+ FALSE_VALUES = %w(0 false no).freeze
8
+
9
+ def initialize(name, default = nil)
10
+ @name = name
11
+ @value = ENV.fetch(name, nil)
12
+ @default = default
13
+ end
14
+
15
+ def value
16
+ @value.presence || @default
17
+ end
18
+
19
+ delegate :to_s, :to_json, to: :value
20
+
21
+ def blank?
22
+ value.blank? || FALSE_VALUES.include?(value.to_s.downcase)
23
+ end
24
+
25
+ # rubocop:disable Rails/Present
26
+ def present?
27
+ !blank?
28
+ end
29
+ # rubocop:enable Rails/Present
30
+
31
+ def to_boolean_string
32
+ present?.to_s
33
+ end
34
+
35
+ def to_i
36
+ str = blank? ? @default : value
37
+ str.to_s.to_i
38
+ end
39
+
40
+ def to_f
41
+ str = blank? ? @default : value
42
+ str.to_s.to_f
43
+ end
44
+
45
+ def default_or_present_if_exists
46
+ return @default unless ENV.has_key?(@name)
47
+
48
+ @value.present? && FALSE_VALUES.exclude?(@value.to_s.downcase)
49
+ end
50
+
51
+ def to_array(separator: ",")
52
+ str = blank? ? @default : value
53
+ str.to_s.split(separator).map(&:strip)
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright (c) 2016 Andy Pike - The MIT license
4
+ #
5
+ # This file has been copied from https://github.com/andypike/rectify/blob/master/lib/rectify/command.rb
6
+ # We have done this so we can decouple Decidim from any Virtus dependency, which is a dead project
7
+ # Please follow Decidim discussion to understand more https://github.com/decidim/decidim/discussions/7234
8
+ module Decidim
9
+ class EventRecorder
10
+ attr_reader :events
11
+
12
+ def initialize
13
+ @events = {}
14
+ end
15
+
16
+ def method_missing(method_name, *args, &_block)
17
+ args = args.first if args.size == 1
18
+ @events[method_name] = args
19
+ end
20
+
21
+ def respond_to_missing?(_method_name, _include_private = false)
22
+ true
23
+ end
24
+ end
25
+ end
@@ -59,24 +59,20 @@ module Decidim
59
59
 
60
60
  # Caches the path for the given resource.
61
61
  def resource_path
62
- @resource_path ||= begin
63
- if resource&.respond_to?(:polymorphic_resource_path)
64
- resource.polymorphic_resource_path(resource_url_params)
65
- else
66
- resource_locator.path(resource_url_params)
67
- end
68
- end
62
+ @resource_path ||= if resource.respond_to?(:polymorphic_resource_path)
63
+ resource.polymorphic_resource_path(resource_url_params)
64
+ else
65
+ resource_locator.path(resource_url_params)
66
+ end
69
67
  end
70
68
 
71
69
  # Caches the URL for the given resource.
72
70
  def resource_url
73
- @resource_url ||= begin
74
- if resource&.respond_to?(:polymorphic_resource_url)
75
- resource.polymorphic_resource_url(resource_url_params)
76
- else
77
- resource_locator.url(resource_url_params)
78
- end
79
- end
71
+ @resource_url ||= if resource.respond_to?(:polymorphic_resource_url)
72
+ resource.polymorphic_resource_url(resource_url_params)
73
+ else
74
+ resource_locator.url(resource_url_params)
75
+ end
80
76
  end
81
77
 
82
78
  def resource_text; end
@@ -13,6 +13,8 @@ module Decidim
13
13
  include Decidim::ComponentPathHelper
14
14
  include Decidim::SanitizeHelper
15
15
 
16
+ delegate :created_at, to: :resource
17
+
16
18
  class_attribute :i18n_interpolations
17
19
  self.i18n_interpolations = []
18
20
 
@@ -32,19 +34,25 @@ module Decidim
32
34
  end
33
35
 
34
36
  def email_subject
35
- I18n.t("email_subject", i18n_options).html_safe
37
+ I18n.t("email_subject", **email_subject_i18n_options).html_safe
38
+ end
39
+
40
+ def email_subject_i18n_options
41
+ sanitized_values = { resource_title: decidim_sanitize(resource_title) }
42
+ sanitized_values[:mentioned_proposal_title] = decidim_sanitize(mentioned_proposal_title) if i18n_options.has_key?(:mentioned_proposal_title)
43
+ i18n_options.merge(sanitized_values)
36
44
  end
37
45
 
38
46
  def email_intro
39
- I18n.t("email_intro", i18n_options).html_safe
47
+ I18n.t("email_intro", **i18n_options).html_safe
40
48
  end
41
49
 
42
50
  def email_outro
43
- I18n.t("email_outro", i18n_options).html_safe
51
+ I18n.t("email_outro", **i18n_options).html_safe
44
52
  end
45
53
 
46
54
  def notification_title
47
- I18n.t("notification_title", i18n_options).html_safe
55
+ I18n.t("notification_title", **i18n_options).html_safe
48
56
  end
49
57
 
50
58
  # Public: The String to use as scope to search for the keys
@@ -27,7 +27,7 @@ module Decidim
27
27
  #
28
28
  # Returns a String with the filename of the export.
29
29
  def filename(prefix = "export", options = {})
30
- options[:extension] = !options[:extension].nil? ? options[:extension] : true
30
+ options[:extension] = options[:extension].nil? ? true : options[:extension]
31
31
  result = "#{prefix}-#{I18n.l(Time.zone.today, format: :default)}-#{Time.now.seconds_since_midnight.to_i}"
32
32
  result += ".#{extension}" if options[:extension]
33
33
  result
@@ -10,7 +10,7 @@ module Decidim
10
10
  #
11
11
  class ExportManifest
12
12
  include ActiveModel::Model
13
- include Virtus.model
13
+ include Decidim::AttributeObject::Model
14
14
 
15
15
  # A setting to choose if the collection exported by this manifest should
16
16
  # be included in the open data export available for all users.
@@ -26,6 +26,7 @@ module Decidim
26
26
  # manifest - The parent manifest where this export manifest belongs to.
27
27
  #
28
28
  def initialize(name, manifest)
29
+ super()
29
30
  @name = name.to_sym
30
31
  @manifest = manifest
31
32
  end
@@ -12,6 +12,8 @@ module Decidim
12
12
  # another object in case the PassthruValidator is in charge of the
13
13
  # validations.
14
14
  class FileValidatorHumanizer
15
+ # record - Form object (e.g. Decidim::AccountForm)
16
+ # attribute - Form field (e.g. :avatar)
15
17
  def initialize(record, attribute)
16
18
  @record = record
17
19
  @attribute = attribute
@@ -21,7 +23,7 @@ module Decidim
21
23
  end
22
24
 
23
25
  def uploader
24
- @uploader ||= passthru_uploader || record.attached_uploader(attribute) || record.send(attribute)
26
+ @uploader ||= fetch_uploader
25
27
  end
26
28
 
27
29
  def messages
@@ -36,6 +38,14 @@ module Decidim
36
38
  )
37
39
  end
38
40
 
41
+ if (file_dimensions = max_file_dimensions)
42
+ messages << I18n.t(
43
+ "max_file_dimension",
44
+ resolution: file_dimensions,
45
+ scope: "decidim.forms.file_validation"
46
+ )
47
+ end
48
+
39
49
  if (extensions = extension_allowlist)
40
50
  messages << I18n.t(
41
51
  "allowed_file_extensions",
@@ -73,6 +83,12 @@ module Decidim
73
83
  end
74
84
  # rubocop: enable Metrics/CyclomaticComplexity
75
85
 
86
+ def max_file_dimensions
87
+ return unless uploader.respond_to?(:max_image_height_or_width)
88
+
89
+ "#{uploader.max_image_height_or_width}x#{uploader.max_image_height_or_width}"
90
+ end
91
+
76
92
  def extension_allowlist
77
93
  return unless uploader.respond_to?(:extension_allowlist, true)
78
94
 
@@ -85,6 +101,13 @@ module Decidim
85
101
 
86
102
  attr_reader :record, :attribute, :passthru_validator
87
103
 
104
+ def fetch_uploader
105
+ return passthru_uploader if passthru_uploader.present?
106
+ return record.attached_uploader(attribute) if record.respond_to?(:attached_uploader) && record.attached_uploader(attribute).present?
107
+
108
+ record.send(attribute)
109
+ end
110
+
88
111
  def passthru_record
89
112
  return unless passthru_validator
90
113