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
@@ -2,14 +2,16 @@
2
2
 
3
3
  module Decidim
4
4
  # A custom mailer for Decidim so we can notify users to verify
5
- # his own newsletter notifications settings. GDPR releated
5
+ # their own newsletter notifications settings. GDPR releated
6
6
  class NewslettersOptInMailer < ApplicationMailer
7
7
  def notify(user, token)
8
- @user = user
9
- @organization = user.organization
10
- @token = token
8
+ with_user(user) do
9
+ @user = user
10
+ @organization = user.organization
11
+ @token = token
11
12
 
12
- mail(to: user.email, subject: I18n.t("decidim.newsletters_opt_in_mailer.notify.subject", organization_name: @organization.name))
13
+ mail(to: user.email, subject: I18n.t("decidim.newsletters_opt_in_mailer.notify.subject", organization_name: @organization.name))
14
+ end
13
15
  end
14
16
  end
15
17
  end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ # A custom mailer for sending notifications to users when
5
+ # a events are received.
6
+ class NotificationsDigestMailer < Decidim::ApplicationMailer
7
+ helper Decidim::ResourceHelper
8
+ SIZE_LIMIT = 10
9
+
10
+ def digest_mail(user, notification_ids)
11
+ with_user(user) do
12
+ notifications = Decidim::Notification.where(id: notification_ids)
13
+ @user = user
14
+ @organization = user.organization
15
+ @notifications_digest = Decidim::NotificationsDigestPresenter.new(user)
16
+ @display_see_more_message = notifications.size > SIZE_LIMIT
17
+ @notifications = notifications[0...SIZE_LIMIT].map { |notification| Decidim::NotificationToMailerPresenter.new(notification) }
18
+
19
+ mail(to: user.email, subject: @notifications_digest.subject)
20
+ end
21
+ end
22
+ end
23
+ end
@@ -4,18 +4,17 @@ module Decidim
4
4
  # A custom mailer to notify Decidim users
5
5
  # that they have been reported
6
6
  class UserReportMailer < ApplicationMailer
7
- def notify(admin, token, reason, user)
8
- @user = user
9
- @organization = user.organization
10
- @token = token
11
- @reason = reason
7
+ def notify(admin, report)
8
+ @report = report
12
9
  @admin = admin
13
- mail(to: admin.email, subject: I18n.t(
14
- "decidim.user_report_mailer.notify.subject",
15
- organization_name: @organization.name,
16
- reason: @reason,
17
- token: @token
18
- ))
10
+ @organization = report.moderation.user.organization
11
+ with_user(admin) do
12
+ mail(to: admin.email, subject: I18n.t(
13
+ "decidim.user_report_mailer.notify.subject",
14
+ organization_name: report.moderation.user.organization.name,
15
+ reason: @report.reason
16
+ ))
17
+ end
19
18
  end
20
19
  end
21
20
  end
@@ -37,9 +37,57 @@ module Decidim
37
37
  class_name: "Decidim::Area",
38
38
  optional: true
39
39
 
40
- validates :organization, :user, :action, presence: true
40
+ scope :with_resource_type, lambda { |resource_type_key|
41
+ if publicable_public_resource_types.include?(resource_type_key)
42
+ where(resource_type: resource_type_key).where.not(action: "create")
43
+ elsif public_resource_types.include?(resource_type_key)
44
+ where(resource_type: resource_type_key)
45
+ else
46
+ with_all_resources
47
+ end
48
+ }
49
+
50
+ scope :with_new_resource_type, lambda { |resource_type_key|
51
+ if publicable_public_resource_types.include?(resource_type_key)
52
+ where(resource_type: resource_type_key, action: "publish")
53
+ elsif public_resource_types.include?(resource_type_key)
54
+ where(resource_type: resource_type_key, action: "create")
55
+ else
56
+ with_all_new_resources
57
+ end
58
+ }
59
+
60
+ scope :with_private_resources, lambda {
61
+ where(
62
+ "(action <> ? AND resource_type IN (?)) OR (resource_type IN (?))",
63
+ "create",
64
+ publicable_public_resource_types,
65
+ (private_resource_types + public_resource_types - publicable_public_resource_types)
66
+ )
67
+ }
68
+
69
+ scope :with_all_resources, lambda {
70
+ where(
71
+ "(action <> ? AND resource_type IN (?)) OR (resource_type IN (?))",
72
+ "create",
73
+ publicable_public_resource_types,
74
+ (public_resource_types - publicable_public_resource_types)
75
+ )
76
+ }
77
+
78
+ scope :with_all_new_resources, lambda {
79
+ where(
80
+ "(action = ? AND resource_type IN (?)) OR (action = ? AND resource_type IN (?))",
81
+ "publish",
82
+ publicable_public_resource_types,
83
+ "create",
84
+ (public_resource_types - publicable_public_resource_types)
85
+ )
86
+ }
87
+
88
+ validates :action, presence: true
41
89
  validates :resource, presence: true, if: ->(log) { log.action != "delete" }
42
- validates :visibility, presence: true, inclusion: { in: %w(admin-only public-only all) }
90
+ validates :visibility, presence: true, inclusion: { in: %w(private-only admin-only public-only all) }
43
91
 
44
92
  # To ensure records can't be deleted
45
93
  before_destroy { |_record| raise ActiveRecord::ReadOnlyRecord }
@@ -49,6 +97,42 @@ module Decidim
49
97
  where(visibility: %w(admin-only all))
50
98
  end
51
99
 
100
+ # All the resource types that are eligible to be included as an activity.
101
+ def self.public_resource_types
102
+ @public_resource_types ||= %w(
103
+ Decidim::Accountability::Result
104
+ Decidim::Blogs::Post
105
+ Decidim::Comments::Comment
106
+ Decidim::Consultations::Question
107
+ Decidim::Debates::Debate
108
+ Decidim::Meetings::Meeting
109
+ Decidim::Proposals::Proposal
110
+ Decidim::Surveys::Survey
111
+ Decidim::Assembly
112
+ Decidim::Consultation
113
+ Decidim::Initiative
114
+ Decidim::ParticipatoryProcess
115
+ ).select do |klass|
116
+ klass.safe_constantize.present?
117
+ end
118
+ end
119
+
120
+ def self.private_resource_types
121
+ @private_resource_types ||= %w(
122
+ Decidim::Budgets::Order
123
+ ).select do |klass|
124
+ klass.safe_constantize.present?
125
+ end
126
+ end
127
+
128
+ def self.publicable_public_resource_types
129
+ @publicable_public_resource_types ||= public_resource_types.select { |klass| klass.constantize.column_names.include?("published_at") }
130
+ end
131
+
132
+ def self.ransackable_scopes(_auth_object = nil)
133
+ [:with_resource_type]
134
+ end
135
+
52
136
  # Overwrites the method so that records cannot be modified.
53
137
  #
54
138
  # Returns a Boolean.
@@ -8,7 +8,6 @@ module Decidim
8
8
  belongs_to :amender, foreign_key: "decidim_user_id", class_name: "Decidim::User"
9
9
  belongs_to :emendation, foreign_key: "decidim_emendation_id", foreign_type: "decidim_emendation_type", polymorphic: true
10
10
 
11
- validates :amendable, :amender, :emendation, presence: true
12
11
  validates :state, presence: true, inclusion: { in: STATES }
13
12
 
14
13
  def draft?
@@ -20,8 +20,7 @@ module Decidim
20
20
  inverse_of: :areas,
21
21
  optional: true
22
22
 
23
- validates :name, :organization, presence: true
24
- validates :name, uniqueness: { scope: [:organization, :area_type] }
23
+ validates :name, presence: true, uniqueness: { scope: [:organization, :area_type] }
25
24
 
26
25
  before_destroy :abort_if_dependencies
27
26
 
@@ -5,6 +5,7 @@ module Decidim
5
5
  # (terriotrial, sectorial, etc.)
6
6
  class AreaType < ApplicationRecord
7
7
  include Decidim::TranslatableResource
8
+ include Decidim::Traceable
8
9
 
9
10
  translatable_fields :name, :plural
10
11
 
@@ -20,5 +21,9 @@ module Decidim
20
21
  def translated_name
21
22
  Decidim::AreaTypePresenter.new(self).translated_name
22
23
  end
24
+
25
+ def self.log_presenter_class_for(_log)
26
+ Decidim::AdminLog::AreaTypePresenter
27
+ end
23
28
  end
24
29
  end
@@ -6,6 +6,8 @@ module Decidim
6
6
  class Attachment < ApplicationRecord
7
7
  include Decidim::HasUploadValidations
8
8
  include Decidim::TranslatableResource
9
+ include Traceable
10
+
9
11
  before_save :set_content_type_and_size, if: :attached?
10
12
 
11
13
  translatable_fields :title, :description
@@ -92,5 +94,9 @@ module Decidim
92
94
  self.content_type = file.content_type
93
95
  self.file_size = file.byte_size
94
96
  end
97
+
98
+ def self.log_presenter_class_for(_log)
99
+ Decidim::AdminLog::AttachmentPresenter
100
+ end
95
101
  end
96
102
  end
@@ -4,6 +4,7 @@ module Decidim
4
4
  # Categories serve as a taxonomy for attachments to use for while in the
5
5
  # context of a participatory space.
6
6
  class AttachmentCollection < ApplicationRecord
7
+ include Traceable
7
8
  include Decidim::TranslatableResource
8
9
 
9
10
  translatable_fields :name, :description
@@ -15,5 +16,9 @@ module Decidim
15
16
  def unused?
16
17
  attachments.empty?
17
18
  end
19
+
20
+ def self.log_presenter_class_for(_log)
21
+ Decidim::AdminLog::AttachmentCollectionPresenter
22
+ end
18
23
  end
19
24
  end
@@ -5,8 +5,10 @@ module Decidim
5
5
  # context of a participatory process.
6
6
  class Category < ApplicationRecord
7
7
  include Decidim::TranslatableResource
8
+ include Decidim::FilterableResource
9
+ include Decidim::Traceable
8
10
 
9
- translatable_fields :name, :description
11
+ translatable_fields :name
10
12
 
11
13
  belongs_to :participatory_space, foreign_key: "decidim_participatory_space_id", foreign_type: "decidim_participatory_space_type", polymorphic: true
12
14
  has_many :subcategories, foreign_key: "parent_id", class_name: "Decidim::Category", dependent: :destroy, inverse_of: :parent
@@ -38,11 +40,13 @@ module Decidim
38
40
  categorizations.empty?
39
41
  end
40
42
 
41
- # Allow ransacker to search for a key in a hstore column (`name`.`en`)
42
- ransacker :name do |parent|
43
- Arel::Nodes::InfixOperation.new("->>", parent.table[:name], Arel::Nodes.build_quoted(I18n.locale.to_s))
43
+ def self.log_presenter_class_for(_log)
44
+ Decidim::AdminLog::CategoryPresenter
44
45
  end
45
46
 
47
+ # Allow ransacker to search for a key in a hstore column (`name`.`en`)
48
+ ransacker_i18n :name
49
+
46
50
  private
47
51
 
48
52
  # This is done since we only allow one level of subcategories.
@@ -55,6 +59,7 @@ module Decidim
55
59
 
56
60
  def subcategories_have_same_participatory_space
57
61
  return unless parent
62
+ return if participatory_space == parent.participatory_space
58
63
 
59
64
  self.participatory_space = parent.participatory_space
60
65
  end
@@ -6,8 +6,6 @@ module Decidim
6
6
 
7
7
  belongs_to :coauthorable, polymorphic: true, counter_cache: true
8
8
 
9
- validates :coauthorable, presence: true
10
-
11
9
  after_commit :author_is_follower, on: [:create]
12
10
 
13
11
  def identity
@@ -3,13 +3,17 @@
3
3
  module Decidim
4
4
  class ContextualHelpSection < ApplicationRecord
5
5
  include Decidim::TranslatableResource
6
+ include Decidim::Traceable
6
7
 
7
8
  translatable_fields :content
8
9
 
9
10
  belongs_to :organization, class_name: "Decidim::Organization"
10
- validates :organization, presence: true
11
11
  validates :content, presence: true
12
12
 
13
+ def self.log_presenter_class_for(_log)
14
+ Decidim::AdminLog::ContextualHelpSectionPresenter
15
+ end
16
+
13
17
  # Public: Finds content given an id
14
18
  #
15
19
  # organization - The Organization to scope the content to
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Decidim
4
4
  class Follow < ApplicationRecord
5
- include Decidim::DataPortability
5
+ include Decidim::DownloadYourData
6
6
 
7
7
  belongs_to :followable, foreign_key: "decidim_followable_id", foreign_type: "decidim_followable_type", polymorphic: true, counter_cache: true
8
8
  belongs_to :user, foreign_key: "decidim_user_id", class_name: "Decidim::User"
@@ -20,7 +20,7 @@ module Decidim
20
20
  end
21
21
 
22
22
  def self.export_serializer
23
- Decidim::DataPortabilitySerializers::DataPortabilityFollowSerializer
23
+ Decidim::DownloadYourDataSerializers::DownloadYourDataFollowSerializer
24
24
  end
25
25
 
26
26
  def self.user_follower_ids_for_participatory_spaces(spaces)
@@ -6,7 +6,6 @@ module Decidim
6
6
  self.table_name = "decidim_gamification_badge_scores"
7
7
 
8
8
  belongs_to :user, class_name: "Decidim::UserBaseEntity"
9
- validates :user, presence: true
10
9
  validates :value, numericality: { greater_than_or_equal_to: 0 }
11
10
  end
12
11
  end
@@ -3,7 +3,7 @@
3
3
  module Decidim
4
4
  # Store user's social identities
5
5
  class Identity < ApplicationRecord
6
- include Decidim::DataPortability
6
+ include Decidim::DownloadYourData
7
7
 
8
8
  belongs_to :user, foreign_key: :decidim_user_id, class_name: "Decidim::User"
9
9
  belongs_to :organization, foreign_key: :decidim_organization_id, class_name: "Decidim::Organization"
@@ -18,7 +18,7 @@ module Decidim
18
18
  end
19
19
 
20
20
  def self.export_serializer
21
- Decidim::DataPortabilitySerializers::DataPortabilityIdentitySerializer
21
+ Decidim::DownloadYourDataSerializers::DownloadYourDataIdentitySerializer
22
22
  end
23
23
 
24
24
  private
@@ -10,7 +10,7 @@ module Decidim
10
10
  class Conversation < ApplicationRecord
11
11
  self.table_name = "decidim_messaging_conversations"
12
12
 
13
- include Decidim::DataPortability
13
+ include Decidim::DownloadYourData
14
14
 
15
15
  has_many :participations, foreign_key: :decidim_conversation_id,
16
16
  class_name: "Decidim::Messaging::Participation",
@@ -110,7 +110,7 @@ module Decidim
110
110
  end
111
111
 
112
112
  #
113
- # Given a user, returns her interlocutors in this conversation
113
+ # Given a user, returns their interlocutors in this conversation
114
114
  #
115
115
  # @param user [Decidim::User] The user to find interlocutors for
116
116
  #
@@ -121,7 +121,7 @@ module Decidim
121
121
  end
122
122
 
123
123
  #
124
- # Given a user, returns if ALL the interlocutors allow her to join the conversation
124
+ # Given a user, returns if ALL the interlocutors allow the user to join the conversation
125
125
  #
126
126
  # @return Boolean
127
127
  #
@@ -173,7 +173,7 @@ module Decidim
173
173
  end
174
174
 
175
175
  def self.export_serializer
176
- Decidim::DataPortabilitySerializers::DataPortabilityConversationSerializer
176
+ Decidim::DownloadYourDataSerializers::DownloadYourDataConversationSerializer
177
177
  end
178
178
  end
179
179
  end
@@ -26,8 +26,7 @@ module Decidim
26
26
  foreign_key: :decidim_message_id,
27
27
  inverse_of: :message
28
28
 
29
- validates :sender, :body, presence: true
30
- validates :body, length: { maximum: ->(_message) { Decidim.config.maximum_conversation_message_length } }
29
+ validates :body, presence: true, length: { maximum: ->(_message) { Decidim.config.maximum_conversation_message_length } }
31
30
 
32
31
  default_scope { order(created_at: :asc) }
33
32
 
@@ -17,8 +17,6 @@ module Decidim
17
17
  foreign_key: :decidim_participant_id,
18
18
  class_name: "Decidim::UserBaseEntity"
19
19
 
20
- validates :conversation, :participant, presence: true
21
-
22
20
  validates :decidim_conversation_id, uniqueness: { scope: :decidim_participant_id }
23
21
  end
24
22
  end
@@ -13,8 +13,6 @@ module Decidim
13
13
  belongs_to :recipient, foreign_key: "decidim_recipient_id", class_name: "Decidim::User"
14
14
  belongs_to :message, foreign_key: "decidim_message_id", class_name: "Decidim::Messaging::Message"
15
15
 
16
- validates :recipient, :message, presence: true
17
-
18
16
  scope :recipient, ->(recipient) { where(recipient: recipient) }
19
17
  scope :unread_by, ->(user) { recipient(user).unread }
20
18
  scope :unread, -> { where(read_at: nil) }
@@ -2,11 +2,14 @@
2
2
 
3
3
  module Decidim
4
4
  class Notification < ApplicationRecord
5
- include Decidim::DataPortability
5
+ include Decidim::DownloadYourData
6
6
 
7
7
  belongs_to :resource, foreign_key: "decidim_resource_id", foreign_type: "decidim_resource_type", polymorphic: true
8
8
  belongs_to :user, foreign_key: "decidim_user_id", class_name: "Decidim::User"
9
9
 
10
+ scope :daily, ->(time: Time.now.utc - 1.day) { where(created_at: time.all_day) }
11
+ scope :weekly, ->(time: Time.now.utc) { where(created_at: (time - 7.days)..time) }
12
+
10
13
  def event_class_instance
11
14
  @event_class_instance ||= event_class.constantize.new(
12
15
  resource: resource,
@@ -26,7 +29,7 @@ module Decidim
26
29
  end
27
30
 
28
31
  def self.export_serializer
29
- Decidim::DataPortabilitySerializers::DataPortabilityNotificationSerializer
32
+ Decidim::DownloadYourDataSerializers::DownloadYourDataNotificationSerializer
30
33
  end
31
34
  end
32
35
  end
@@ -9,7 +9,18 @@ module Decidim
9
9
  belongs_to :organization, foreign_key: "decidim_organization_id", class_name: "Decidim::Organization", inverse_of: :oauth_applications
10
10
 
11
11
  has_one_attached :organization_logo
12
- validates_upload :organization_logo, uploader: OAuthApplicationLogoUploader
12
+
13
+ # validates_upload cannot be used here because the file is not necessarily
14
+ # attached to any organization yet when creating a new OAuth application.
15
+ # The organization becomes mapped after the OAuth application is created
16
+ # but the logo needs to be uploaded in the front-end already before that.
17
+ validates(
18
+ :organization_logo,
19
+ file_size: { less_than_or_equal_to: ->(record) { record.maximum_upload_size } },
20
+ uploader_content_type: true,
21
+ uploader_image_dimensions: true
22
+ )
23
+ attached_config[:organization_logo] = OpenStruct.new(uploader: OAuthApplicationLogoUploader)
13
24
 
14
25
  def owner
15
26
  organization
@@ -22,12 +22,12 @@ module Decidim
22
22
 
23
23
  has_many :static_pages, foreign_key: "decidim_organization_id", class_name: "Decidim::StaticPage", inverse_of: :organization, dependent: :destroy
24
24
  has_many :static_page_topics, class_name: "Decidim::StaticPageTopic", inverse_of: :organization, dependent: :destroy
25
- has_many :scopes, -> { order(name: :asc) }, foreign_key: "decidim_organization_id", class_name: "Decidim::Scope", inverse_of: :organization
26
- has_many :scope_types, -> { order(name: :asc) }, foreign_key: "decidim_organization_id", class_name: "Decidim::ScopeType", inverse_of: :organization
27
- has_many :areas, -> { order(name: :asc) }, foreign_key: "decidim_organization_id", class_name: "Decidim::Area", inverse_of: :organization
28
- has_many :area_types, -> { order(name: :asc) }, foreign_key: "decidim_organization_id", class_name: "Decidim::AreaType", inverse_of: :organization
29
- has_many :admins, -> { where(admin: true) }, foreign_key: "decidim_organization_id", class_name: "Decidim::User"
30
- has_many :users_with_any_role, -> { where.not(roles: []) }, foreign_key: "decidim_organization_id", class_name: "Decidim::User"
25
+ has_many :scopes, -> { order(name: :asc) }, foreign_key: "decidim_organization_id", class_name: "Decidim::Scope", inverse_of: :organization, dependent: :destroy
26
+ has_many :scope_types, -> { order(name: :asc) }, foreign_key: "decidim_organization_id", class_name: "Decidim::ScopeType", inverse_of: :organization, dependent: :destroy
27
+ has_many :areas, -> { order(name: :asc) }, foreign_key: "decidim_organization_id", class_name: "Decidim::Area", inverse_of: :organization, dependent: :destroy
28
+ has_many :area_types, -> { order(name: :asc) }, foreign_key: "decidim_organization_id", class_name: "Decidim::AreaType", inverse_of: :organization, dependent: :destroy
29
+ has_many :admins, -> { where(admin: true) }, foreign_key: "decidim_organization_id", class_name: "Decidim::User", dependent: :destroy
30
+ has_many :users_with_any_role, -> { where.not(roles: []) }, foreign_key: "decidim_organization_id", class_name: "Decidim::User", dependent: :destroy
31
31
  has_many :users, foreign_key: "decidim_organization_id", class_name: "Decidim::User", dependent: :destroy
32
32
  has_many :user_entities, foreign_key: "decidim_organization_id", class_name: "Decidim::UserBaseEntity", dependent: :destroy
33
33
  has_many :oauth_applications, foreign_key: "decidim_organization_id", class_name: "Decidim::OAuthApplication", inverse_of: :organization, dependent: :destroy
@@ -146,7 +146,7 @@ module Decidim
146
146
  # Returns the presenter for this author, to be used in the views.
147
147
  # Required by ActsAsAuthor.
148
148
  def presenter
149
- Decidim::Debates::OfficialAuthorPresenter.new
149
+ Decidim::OfficialAuthorPresenter.new
150
150
  end
151
151
 
152
152
  def static_pages_accessible_for(user)
@@ -3,19 +3,21 @@
3
3
  module Decidim
4
4
  # This class gives a given User access to a given private ParticipatorySpacePrivateUser
5
5
  class ParticipatorySpacePrivateUser < ApplicationRecord
6
- include Decidim::DataPortability
6
+ include Decidim::DownloadYourData
7
7
 
8
8
  belongs_to :user, class_name: "Decidim::User", foreign_key: :decidim_user_id
9
9
  belongs_to :privatable_to, polymorphic: true
10
10
 
11
11
  validate :user_and_participatory_space_same_organization
12
12
 
13
+ scope :by_participatory_space, ->(privatable_to) { where(privatable_to_id: privatable_to.id, privatable_to_type: privatable_to.class.to_s) }
14
+
13
15
  def self.user_collection(user)
14
16
  where(decidim_user_id: user.id)
15
17
  end
16
18
 
17
19
  def self.export_serializer
18
- Decidim::DataPortabilitySerializers::DataPortabilityParticipatorySpacePrivateUserSerializer
20
+ Decidim::DownloadYourDataSerializers::DownloadYourDataParticipatorySpacePrivateUserSerializer
19
21
  end
20
22
 
21
23
  def self.log_presenter_class_for(_log)
@@ -55,6 +55,7 @@ module Decidim
55
55
  end
56
56
 
57
57
  class PermissionNotSetError < StandardError; end
58
+
58
59
  class PermissionCannotBeDisallowedError < StandardError; end
59
60
  end
60
61
  end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ class Reminder < ApplicationRecord
5
+ belongs_to :user, foreign_key: "decidim_user_id", class_name: "Decidim::User"
6
+ belongs_to :component, foreign_key: "decidim_component_id", class_name: "Decidim::Component"
7
+ has_many :records, foreign_key: "decidim_reminder_id", class_name: "Decidim::ReminderRecord", dependent: :destroy
8
+ has_many :deliveries, foreign_key: "decidim_reminder_id", class_name: "Decidim::ReminderDelivery", dependent: :destroy
9
+ end
10
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ class ReminderDelivery < ApplicationRecord
5
+ belongs_to :reminder, foreign_key: "decidim_reminder_id", class_name: "Decidim::Reminder"
6
+ end
7
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ class ReminderRecord < ApplicationRecord
5
+ belongs_to :reminder, foreign_key: "decidim_reminder_id", class_name: "Decidim::Reminder"
6
+ belongs_to :remindable, foreign_type: "remindable_type", polymorphic: true, optional: true
7
+
8
+ scope :active, -> { where(state: "active") }
9
+ scope :pending, -> { where(state: "pending") }
10
+ scope :completed, -> { where(state: "completed") }
11
+ scope :deleted, -> { where(state: "deleted") }
12
+
13
+ def active?
14
+ state == "active"
15
+ end
16
+
17
+ def pending?
18
+ state == "pending"
19
+ end
20
+
21
+ def completed?
22
+ state == "completed"
23
+ end
24
+
25
+ def deleted?
26
+ state == "deleted"
27
+ end
28
+ end
29
+ end
@@ -3,7 +3,7 @@
3
3
  module Decidim
4
4
  # A reportable can be reported one time for each user.
5
5
  class Report < ApplicationRecord
6
- include Decidim::DataPortability
6
+ include Decidim::DownloadYourData
7
7
 
8
8
  REASONS = %w(spam offensive does_not_belong).freeze
9
9
 
@@ -20,7 +20,7 @@ module Decidim
20
20
  end
21
21
 
22
22
  def self.export_serializer
23
- Decidim::DataPortabilitySerializers::DataPortabilityReportSerializer
23
+ Decidim::DownloadYourDataSerializers::DownloadYourDataReportSerializer
24
24
  end
25
25
 
26
26
  private
@@ -8,6 +8,7 @@ module Decidim
8
8
  include Decidim::Traceable
9
9
  include Decidim::Loggable
10
10
  include Decidim::TranslatableResource
11
+ include Decidim::FilterableResource
11
12
 
12
13
  translatable_fields :name
13
14
 
@@ -34,7 +35,7 @@ module Decidim
34
35
 
35
36
  before_validation :update_part_of, on: :update
36
37
 
37
- validates :name, :code, :organization, presence: true
38
+ validates :name, :code, presence: true
38
39
  validates :code, uniqueness: { scope: :organization }
39
40
  validate :forbid_cycles
40
41
 
@@ -73,9 +74,7 @@ module Decidim
73
74
  end
74
75
 
75
76
  # Allow ransacker to search for a key in a hstore column (`name`.`en`)
76
- ransacker :name do |parent|
77
- Arel::Nodes::InfixOperation.new("->>", parent.table[:name], Arel::Nodes.build_quoted(I18n.locale.to_s))
78
- end
77
+ ransacker_i18n :name
79
78
 
80
79
  private
81
80
 
@@ -5,6 +5,7 @@ module Decidim
5
5
  # (municipalities, provinces, states, countries, etc.)
6
6
  class ScopeType < ApplicationRecord
7
7
  include Decidim::TranslatableResource
8
+ include Traceable
8
9
 
9
10
  translatable_fields :name, :plural
10
11
  belongs_to :organization,
@@ -15,5 +16,9 @@ module Decidim
15
16
  has_many :scopes, class_name: "Decidim::Scope", inverse_of: :scope_type, dependent: :nullify
16
17
 
17
18
  validates :name, presence: true
19
+
20
+ def self.log_presenter_class_for(_log)
21
+ Decidim::AdminLog::ScopeTypePresenter
22
+ end
18
23
  end
19
24
  end