decidim-core 0.18.1 → 0.19.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of decidim-core might be problematic. Click here for more details.

Files changed (275) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/config/decidim_core_manifest.js +3 -0
  3. data/app/assets/javascripts/decidim/social_share.js +2 -0
  4. data/app/assets/stylesheets/decidim/extras/_social_share.css.scss +36 -0
  5. data/app/assets/stylesheets/decidim/modules/_input-gallery.scss +24 -0
  6. data/app/assets/stylesheets/decidim/modules/_navbar.scss +1 -1
  7. data/app/cells/decidim/activities_cell.rb +13 -8
  8. data/app/cells/decidim/activity_cell.rb +19 -5
  9. data/app/cells/decidim/address/details.erb +2 -2
  10. data/app/cells/decidim/amendable/amenders_list/show.erb +1 -1
  11. data/app/cells/decidim/amendable/amenders_list_cell.rb +5 -1
  12. data/app/cells/decidim/amendable/announcement_cell.rb +22 -9
  13. data/app/cells/decidim/amendable/wizard_step_form_cell.rb +121 -0
  14. data/app/cells/decidim/announcement_cell.rb +1 -0
  15. data/app/cells/decidim/author_cell.rb +7 -0
  16. data/app/cells/decidim/card_m_cell.rb +3 -1
  17. data/app/cells/decidim/coauthorships_cell.rb +3 -1
  18. data/app/cells/decidim/collapsible_authors_cell.rb +1 -0
  19. data/app/cells/decidim/collapsible_list_cell.rb +1 -0
  20. data/app/cells/decidim/content_blocks/highlighted_content_banner_cell.rb +1 -0
  21. data/app/cells/decidim/content_blocks/last_activity_cell.rb +3 -2
  22. data/app/cells/decidim/content_blocks/metrics_cell.rb +1 -0
  23. data/app/cells/decidim/content_blocks/stats_cell.rb +1 -0
  24. data/app/cells/decidim/content_blocks/sub_hero_cell.rb +1 -0
  25. data/app/cells/decidim/diff_cell.rb +1 -1
  26. data/app/cells/decidim/fingerprint/show.erb +1 -1
  27. data/app/cells/decidim/follow_button_cell.rb +3 -0
  28. data/app/cells/decidim/members_cell.rb +1 -0
  29. data/app/cells/decidim/notifications/show.erb +1 -1
  30. data/app/cells/decidim/profile_cell.rb +1 -0
  31. data/app/cells/decidim/profile_sidebar_cell.rb +4 -0
  32. data/app/cells/decidim/search_results_cell.rb +1 -0
  33. data/app/cells/decidim/search_results_section/show.erb +1 -1
  34. data/app/cells/decidim/tos_page_cell.rb +1 -0
  35. data/app/cells/decidim/user_group_pending_invitations_list_cell.rb +1 -0
  36. data/app/cells/decidim/user_group_pending_requests_list_cell.rb +1 -0
  37. data/app/cells/decidim/wizard_step_form/wizard_aside.erb +14 -0
  38. data/app/cells/decidim/wizard_step_form/wizard_header.erb +18 -0
  39. data/app/cells/decidim/wizard_step_form_cell.rb +112 -0
  40. data/app/commands/decidim/amendable/accept.rb +1 -1
  41. data/app/commands/decidim/amendable/create_draft.rb +70 -0
  42. data/app/commands/decidim/amendable/destroy_draft.rb +40 -0
  43. data/app/commands/decidim/amendable/promote.rb +13 -11
  44. data/app/commands/decidim/amendable/publish_draft.rb +76 -0
  45. data/app/commands/decidim/amendable/update_draft.rb +54 -0
  46. data/app/commands/decidim/amendable/withdraw.rb +31 -15
  47. data/app/commands/decidim/create_follow.rb +1 -0
  48. data/app/commands/decidim/create_omniauth_registration.rb +22 -4
  49. data/app/commands/decidim/create_registration.rb +5 -0
  50. data/app/commands/decidim/delete_follow.rb +1 -0
  51. data/app/commands/decidim/search.rb +1 -0
  52. data/app/controllers/concerns/decidim/action_authorization.rb +2 -0
  53. data/app/controllers/concerns/decidim/amendments_controller.rb +148 -28
  54. data/app/controllers/concerns/decidim/devise_controllers.rb +3 -2
  55. data/app/controllers/concerns/decidim/force_authentication.rb +38 -0
  56. data/app/controllers/concerns/decidim/impersonate_users.rb +1 -0
  57. data/app/controllers/concerns/decidim/locale_switcher.rb +44 -17
  58. data/app/controllers/concerns/decidim/needs_tos_accepted.rb +8 -0
  59. data/app/controllers/concerns/decidim/orderable.rb +36 -0
  60. data/app/controllers/concerns/decidim/participatory_space_context.rb +2 -0
  61. data/app/controllers/concerns/decidim/safe_redirect.rb +24 -0
  62. data/app/controllers/decidim/application_controller.rb +19 -2
  63. data/app/controllers/decidim/devise/confirmations_controller.rb +6 -0
  64. data/app/controllers/decidim/devise/invitations_controller.rb +8 -4
  65. data/app/controllers/decidim/devise/omniauth_registrations_controller.rb +4 -1
  66. data/app/controllers/decidim/errors_controller.rb +3 -0
  67. data/app/controllers/decidim/follows_controller.rb +2 -2
  68. data/app/controllers/decidim/messaging/conversations_controller.rb +2 -2
  69. data/app/controllers/decidim/profiles_controller.rb +4 -1
  70. data/app/controllers/decidim/scopes_controller.rb +16 -4
  71. data/app/events/decidim/amendable/amendment_base_event.rb +4 -0
  72. data/app/forms/decidim/account_form.rb +1 -1
  73. data/app/forms/decidim/amendable/create_form.rb +3 -19
  74. data/app/forms/decidim/amendable/edit_form.rb +22 -0
  75. data/app/forms/decidim/amendable/form.rb +42 -20
  76. data/app/forms/decidim/amendable/promote_form.rb +4 -7
  77. data/app/forms/decidim/amendable/publish_form.rb +21 -0
  78. data/app/forms/decidim/amendable/reject_form.rb +1 -1
  79. data/app/forms/decidim/amendable/review_form.rb +9 -4
  80. data/app/forms/decidim/invite_user_form.rb +1 -0
  81. data/app/forms/decidim/notifications_settings_form.rb +1 -0
  82. data/app/forms/decidim/registration_form.rb +4 -3
  83. data/app/forms/decidim/user_group_form.rb +1 -0
  84. data/app/forms/decidim/user_interests_form.rb +1 -0
  85. data/app/helpers/decidim/amendments_helper.rb +33 -19
  86. data/app/helpers/decidim/cells_helper.rb +2 -0
  87. data/app/helpers/decidim/layout_helper.rb +1 -0
  88. data/app/helpers/decidim/map_helper.rb +1 -1
  89. data/app/helpers/decidim/meta_tags_helper.rb +1 -0
  90. data/app/helpers/decidim/resource_reference_helper.rb +1 -0
  91. data/app/jobs/decidim/event_publisher_job.rb +60 -0
  92. data/app/jobs/decidim/metric_job.rb +1 -0
  93. data/app/models/decidim/action_log.rb +12 -0
  94. data/app/models/decidim/amendment.rb +31 -2
  95. data/app/models/decidim/attachment.rb +2 -0
  96. data/app/models/decidim/authorization.rb +1 -0
  97. data/app/models/decidim/category.rb +1 -0
  98. data/app/models/decidim/component.rb +7 -0
  99. data/app/models/decidim/content_block.rb +1 -0
  100. data/app/models/decidim/follow.rb +3 -0
  101. data/app/models/decidim/identity.rb +1 -0
  102. data/app/models/decidim/impersonation_log.rb +2 -0
  103. data/app/models/decidim/newsletter.rb +1 -0
  104. data/app/models/decidim/participatory_process_user_role.rb +1 -0
  105. data/app/models/decidim/participatory_space_private_user.rb +1 -0
  106. data/app/models/decidim/permission_action.rb +2 -0
  107. data/app/models/decidim/report.rb +1 -0
  108. data/app/models/decidim/scope.rb +1 -0
  109. data/app/models/decidim/searchable_resource.rb +1 -1
  110. data/app/models/decidim/static_page.rb +1 -0
  111. data/app/models/decidim/user.rb +2 -0
  112. data/app/permissions/decidim/permissions.rb +18 -14
  113. data/app/permissions/decidim/user_manager_permissions.rb +9 -2
  114. data/app/presenters/decidim/admin_log/organization_presenter.rb +1 -0
  115. data/app/presenters/decidim/admin_log/participatory_space_private_user_presenter.rb +1 -1
  116. data/app/presenters/decidim/admin_log/user_presenter.rb +1 -1
  117. data/app/presenters/decidim/hashtag_presenter.rb +1 -1
  118. data/app/presenters/decidim/log/base_presenter.rb +1 -0
  119. data/app/presenters/decidim/log/diff_presenter.rb +1 -1
  120. data/app/presenters/decidim/log/value_types/area_presenter.rb +1 -0
  121. data/app/presenters/decidim/log/value_types/area_type_presenter.rb +1 -0
  122. data/app/presenters/decidim/log/value_types/currency_presenter.rb +1 -0
  123. data/app/presenters/decidim/log/value_types/date_presenter.rb +1 -0
  124. data/app/presenters/decidim/log/value_types/locale_presenter.rb +1 -0
  125. data/app/presenters/decidim/log/value_types/percentage_presenter.rb +1 -0
  126. data/app/presenters/decidim/log/value_types/scope_presenter.rb +1 -0
  127. data/app/presenters/decidim/log/value_types/scope_type_presenter.rb +1 -0
  128. data/app/presenters/decidim/metric_charts_presenter.rb +1 -0
  129. data/app/presenters/decidim/metric_object_presenter.rb +4 -0
  130. data/app/queries/decidim/metric_manage.rb +3 -0
  131. data/app/queries/decidim/metric_measure.rb +1 -0
  132. data/app/queries/decidim/metrics/followers_metric_manage.rb +3 -0
  133. data/app/queries/decidim/metrics/participants_metric_manage.rb +4 -0
  134. data/app/queries/decidim/similar_emendations.rb +56 -0
  135. data/app/resolvers/decidim/core/metric_resolver.rb +1 -0
  136. data/app/services/decidim/action_authorizer.rb +1 -0
  137. data/app/services/decidim/action_logger.rb +1 -0
  138. data/app/services/decidim/activity_search.rb +1 -0
  139. data/app/services/decidim/email_notification_generator.rb +4 -0
  140. data/app/services/decidim/notification_generator.rb +2 -0
  141. data/app/services/decidim/notification_generator_for_recipient.rb +0 -1
  142. data/app/services/decidim/resource_search.rb +1 -1
  143. data/app/services/decidim/traceability.rb +1 -0
  144. data/app/uploaders/decidim/application_uploader.rb +1 -0
  145. data/app/uploaders/decidim/attachment_uploader.rb +16 -0
  146. data/app/uploaders/decidim/avatar_uploader.rb +0 -2
  147. data/app/uploaders/decidim/data_portability_uploader.rb +1 -0
  148. data/app/uploaders/decidim/homepage_image_uploader.rb +0 -2
  149. data/app/uploaders/decidim/image_uploader.rb +15 -1
  150. data/app/uploaders/decidim/oauth_application_logo_uploader.rb +0 -1
  151. data/app/uploaders/decidim/official_image_footer_uploader.rb +0 -1
  152. data/app/uploaders/decidim/official_image_header_uploader.rb +0 -1
  153. data/app/uploaders/decidim/open_data_uploader.rb +1 -0
  154. data/app/validators/etiquette_validator.rb +5 -0
  155. data/app/views/decidim/account/delete.html.erb +2 -2
  156. data/app/views/decidim/account/show.html.erb +1 -1
  157. data/app/views/decidim/amendments/_edit_form_fields.html.erb +16 -13
  158. data/app/views/decidim/amendments/_similar_emendation.html.erb +24 -0
  159. data/app/views/decidim/amendments/compare_draft.html.erb +21 -0
  160. data/app/views/decidim/amendments/edit_draft.html.erb +31 -0
  161. data/app/views/decidim/amendments/new.html.erb +5 -17
  162. data/app/views/decidim/amendments/preview_draft.html.erb +32 -0
  163. data/app/views/decidim/amendments/review.html.erb +5 -3
  164. data/app/views/decidim/application/_document.html.erb +1 -1
  165. data/app/views/decidim/application/_photos.html.erb +1 -1
  166. data/app/views/decidim/data_portability/show.html.erb +1 -1
  167. data/app/views/decidim/devise/invitations/edit.html.erb +2 -2
  168. data/app/views/decidim/devise/sessions/new.html.erb +1 -1
  169. data/app/views/decidim/doorkeeper/authorizations/new.html.erb +3 -3
  170. data/app/views/decidim/export_mailer/data_portability_export.html.erb +1 -1
  171. data/app/views/decidim/searches/index.js.erb +6 -0
  172. data/app/views/decidim/shared/_address_details.html.erb +2 -2
  173. data/app/views/decidim/shared/_embed_modal.html.erb +1 -1
  174. data/app/views/decidim/shared/_share_modal.html.erb +7 -4
  175. data/app/views/layouts/decidim/_application.html.erb +0 -1
  176. data/app/views/layouts/decidim/_head.html.erb +13 -12
  177. data/app/views/layouts/decidim/_logo.html.erb +1 -1
  178. data/app/views/layouts/decidim/_social_media_links.html.erb +5 -5
  179. data/app/views/layouts/decidim/_user_menu.html.erb +1 -1
  180. data/app/views/layouts/decidim/_wrapper.html.erb +2 -2
  181. data/app/views/layouts/decidim/mailer.html.erb +2 -2
  182. data/config/locales/ar.yml +27 -17
  183. data/config/locales/ca.yml +79 -15
  184. data/config/locales/cs.yml +73 -14
  185. data/config/locales/de.yml +62 -12
  186. data/config/locales/en.yml +80 -16
  187. data/config/locales/eo-UY.yml +16 -0
  188. data/config/locales/es-MX.yml +73 -11
  189. data/config/locales/es-PY.yml +73 -11
  190. data/config/locales/es.yml +79 -15
  191. data/config/locales/eu.yml +6 -13
  192. data/config/locales/fi-plain.yml +75 -11
  193. data/config/locales/fi.yml +80 -16
  194. data/config/locales/fr.yml +70 -16
  195. data/config/locales/gl.yml +6 -13
  196. data/config/locales/hu.yml +80 -17
  197. data/config/locales/id-ID.yml +6 -12
  198. data/config/locales/it.yml +56 -14
  199. data/config/locales/nl.yml +76 -12
  200. data/config/locales/no.yml +11 -2
  201. data/config/locales/pl.yml +6 -15
  202. data/config/locales/pt-BR.yml +6 -13
  203. data/config/locales/pt.yml +6 -13
  204. data/config/locales/ru.yml +7 -2
  205. data/config/locales/sv.yml +34 -18
  206. data/config/locales/tr-TR.yml +15 -12
  207. data/config/locales/uk.yml +7 -2
  208. data/config/routes.rb +7 -0
  209. data/db/migrate/20180226140756_add_version_to_action_logs.rb +1 -0
  210. data/db/migrate/20180305132906_rename_features_to_components.rb +1 -0
  211. data/db/migrate/20190412131728_fix_user_names.rb +1 -1
  212. data/db/migrate/20190610093742_add_force_users_to_authenticate_before_access_organization.rb +10 -0
  213. data/db/migrate/20190618075906_add_confidential_to_doorkeeper_application.rb +13 -0
  214. data/db/migrate/{20190925091507_add_uniq_index_to_decidim_metrics.rb → 20190829092826_add_uniq_index_to_decidim_metrics.rb} +0 -0
  215. data/lib/decidim/amendable.rb +87 -13
  216. data/lib/decidim/attributes/localized_date.rb +5 -0
  217. data/lib/decidim/attributes/time_with_zone.rb +5 -0
  218. data/lib/decidim/authorable.rb +3 -0
  219. data/lib/decidim/authorization_form_builder.rb +2 -2
  220. data/lib/decidim/component_manifest.rb +2 -0
  221. data/lib/decidim/content_parsers.rb +2 -0
  222. data/lib/decidim/content_parsers/hashtag_parser.rb +1 -1
  223. data/lib/decidim/content_parsers/link_parser.rb +10 -0
  224. data/lib/decidim/content_parsers/newline_parser.rb +20 -0
  225. data/lib/decidim/content_parsers/user_parser.rb +1 -1
  226. data/lib/decidim/content_processor.rb +2 -0
  227. data/lib/decidim/content_renderers.rb +1 -0
  228. data/lib/decidim/content_renderers/hashtag_renderer.rb +1 -1
  229. data/lib/decidim/content_renderers/link_renderer.rb +24 -0
  230. data/lib/decidim/content_renderers/user_renderer.rb +2 -2
  231. data/lib/decidim/core.rb +11 -0
  232. data/lib/decidim/core/engine.rb +2 -28
  233. data/lib/decidim/core/test.rb +4 -1
  234. data/lib/decidim/core/test/factories.rb +35 -8
  235. data/lib/decidim/core/test/shared_examples/amendable/create_amendment_draft_examples.rb +50 -0
  236. data/lib/decidim/core/test/shared_examples/amendable/destroy_amendment_draft_examples.rb +39 -0
  237. data/lib/decidim/core/test/shared_examples/amendable/promote_amendment_examples.rb +27 -3
  238. data/lib/decidim/core/test/shared_examples/amendable/{create_amendment_examples.rb → publish_amendment_draft_examples.rb} +26 -17
  239. data/lib/decidim/core/test/shared_examples/amendable/update_amendment_draft_examples.rb +42 -0
  240. data/lib/decidim/core/test/shared_examples/amendable/withdraw_amendment_examples.rb +19 -11
  241. data/lib/decidim/core/test/shared_examples/has_attachment_collections.rb +1 -1
  242. data/lib/decidim/core/test/shared_examples/has_attachments.rb +1 -1
  243. data/lib/decidim/core/test/shared_examples/simple_event.rb +4 -0
  244. data/lib/decidim/core/version.rb +1 -1
  245. data/lib/decidim/data_portability_file_zipper.rb +3 -0
  246. data/lib/decidim/events/author_event.rb +1 -0
  247. data/lib/decidim/events/base_event.rb +12 -22
  248. data/lib/decidim/events/coauthor_event.rb +1 -0
  249. data/lib/decidim/events/simple_event.rb +3 -0
  250. data/lib/decidim/exporters/csv.rb +1 -0
  251. data/lib/decidim/fingerprintable.rb +1 -0
  252. data/lib/decidim/followable.rb +8 -0
  253. data/lib/decidim/form_builder.rb +24 -3
  254. data/lib/decidim/gamification.rb +4 -0
  255. data/lib/decidim/gamification/badge_status.rb +1 -0
  256. data/lib/decidim/has_category.rb +2 -0
  257. data/lib/decidim/has_component.rb +2 -7
  258. data/lib/decidim/has_private_users.rb +8 -1
  259. data/lib/decidim/has_settings.rb +12 -8
  260. data/lib/decidim/hashtaggable.rb +4 -0
  261. data/lib/decidim/metric_operation_manifest.rb +1 -0
  262. data/lib/decidim/nicknamizable.rb +1 -0
  263. data/lib/decidim/participable.rb +1 -0
  264. data/lib/decidim/participatory_space_resourceable.rb +1 -0
  265. data/lib/decidim/randomable.rb +20 -0
  266. data/lib/decidim/search_resource_fields_mapper.rb +2 -0
  267. data/lib/decidim/searchable.rb +2 -0
  268. data/lib/decidim/settings_manifest.rb +10 -1
  269. data/lib/decidim/stats_registry.rb +1 -0
  270. data/lib/decidim/view_model.rb +1 -1
  271. data/lib/tasks/decidim_data_portability_tasks.rake +1 -0
  272. data/lib/tasks/decidim_metrics_tasks.rake +2 -0
  273. data/vendor/assets/javascripts/datepicker-locales/foundation-datepicker.no.js +12 -12
  274. metadata +140 -82
  275. data/app/commands/decidim/amendable/create.rb +0 -80
@@ -3,8 +3,10 @@
3
3
  module Decidim
4
4
  class UserManagerPermissions < DefaultPermissions
5
5
  def permissions
6
- allow! if read_admin_dashboard_action?
7
- allow! if impersonate_managed_user_action?
6
+ if user_manager?
7
+ allow! if read_admin_dashboard_action?
8
+ allow! if impersonate_managed_user_action?
9
+ end
8
10
 
9
11
  permission_action
10
12
  end
@@ -20,5 +22,10 @@ module Decidim
20
22
  permission_action.subject == :managed_user &&
21
23
  permission_action.action == :impersonate
22
24
  end
25
+
26
+ # Whether the user has the user_manager role or not.
27
+ def user_manager?
28
+ user && !user.admin? && user.role?("user_manager")
29
+ end
23
30
  end
24
31
  end
@@ -81,6 +81,7 @@ module Decidim
81
81
 
82
82
  def action_string
83
83
  return "decidim.admin_log.organization.update_id_documents_config" if action == "update_id_documents_config"
84
+
84
85
  "decidim.admin_log.organization.update"
85
86
  end
86
87
 
@@ -23,7 +23,7 @@ module Decidim
23
23
 
24
24
  def action_string
25
25
  case action
26
- when "invite", "delete"
26
+ when "create", "create_via_csv", "delete"
27
27
  "decidim.admin_log.participatory_space_private_user.#{action}"
28
28
  else
29
29
  super
@@ -30,7 +30,7 @@ module Decidim
30
30
  end
31
31
 
32
32
  def user_role
33
- action_log.extra.dig("extra", "invited_user_role")
33
+ Array(action_log.extra.dig("extra", "invited_user_role")).last
34
34
  end
35
35
 
36
36
  def user_badge
@@ -27,7 +27,7 @@ module Decidim
27
27
  end
28
28
 
29
29
  def display_hashtag
30
- link_to name, decidim.search_path(term: name), target: "_blank", class: "hashtag-mention"
30
+ link_to name, decidim.search_path(term: name), target: "_blank", class: "hashtag-mention", rel: "noopener"
31
31
  end
32
32
 
33
33
  def display_hashtag_name
@@ -234,6 +234,7 @@ module Decidim
234
234
  # Returns an Array of Strings.
235
235
  def action_log_extra_classes
236
236
  return ["logs__log--deletion"] if action.to_s == "delete"
237
+
237
238
  []
238
239
  end
239
240
 
@@ -111,7 +111,7 @@ module Decidim
111
111
 
112
112
  begin
113
113
  return klass.constantize
114
- rescue NameError => _exception
114
+ rescue NameError => _e
115
115
  default_klass
116
116
  end
117
117
  end
@@ -14,6 +14,7 @@ module Decidim
14
14
  def present
15
15
  return unless value
16
16
  return h.translated_attribute(area.name) if area
17
+
17
18
  I18n.t("not_found", id: value, scope: "decidim.log.value_types.area_presenter")
18
19
  end
19
20
 
@@ -14,6 +14,7 @@ module Decidim
14
14
  def present
15
15
  return unless value
16
16
  return h.translated_attribute(area_type.name) if area_type
17
+
17
18
  I18n.t("not_found", id: value, scope: "decidim.log.value_types.area_type_presenter")
18
19
  end
19
20
 
@@ -12,6 +12,7 @@ module Decidim
12
12
  # Returns an HTML-safe String.
13
13
  def present
14
14
  return unless value
15
+
15
16
  h.number_to_currency(value, unit: Decidim.currency_unit)
16
17
  end
17
18
  end
@@ -12,6 +12,7 @@ module Decidim
12
12
  # Returns an HTML-safe String.
13
13
  def present
14
14
  return unless value
15
+
15
16
  h.l(value, format: :long)
16
17
  end
17
18
  end
@@ -12,6 +12,7 @@ module Decidim
12
12
  # Returns an HTML-safe String.
13
13
  def present
14
14
  return unless value
15
+
15
16
  I18n.with_locale(value) { I18n.t("locale.name") }
16
17
  end
17
18
  end
@@ -13,6 +13,7 @@ module Decidim
13
13
  # Returns an HTML-safe String.
14
14
  def present
15
15
  return unless value
16
+
16
17
  h.number_to_percentage(value, strip_insignificant_zeros: true)
17
18
  end
18
19
  end
@@ -14,6 +14,7 @@ module Decidim
14
14
  def present
15
15
  return unless value
16
16
  return h.translated_attribute(scope.name) if scope
17
+
17
18
  I18n.t("not_found", id: value, scope: "decidim.log.value_types.scope_presenter")
18
19
  end
19
20
 
@@ -14,6 +14,7 @@ module Decidim
14
14
  def present
15
15
  return unless value
16
16
  return h.translated_attribute(scope_type.name) if scope_type
17
+
17
18
  I18n.t("not_found", id: value, scope: "decidim.log.value_types.scope_type_presenter")
18
19
  end
19
20
 
@@ -30,6 +30,7 @@ module Decidim
30
30
  safe_join(
31
31
  metrics_group.map do |metric|
32
32
  next "" if metric.blank?
33
+
33
34
  render_metrics_data(metric.metric_name, klass: "column medium-6", graph_klass: "small")
34
35
  end
35
36
  )
@@ -7,21 +7,25 @@ module Decidim
7
7
  class MetricObjectPresenter < SimpleDelegator
8
8
  def attr_int(attr, default: 0)
9
9
  return default unless __getobj__
10
+
10
11
  __getobj__[attr] || default
11
12
  end
12
13
 
13
14
  def attr_string(attr, default: "")
14
15
  return default unless __getobj__
16
+
15
17
  __getobj__[attr].presence || default
16
18
  end
17
19
 
18
20
  def attr_date(attr, default: "")
19
21
  return default unless __getobj__
22
+
20
23
  __getobj__[attr].try(:strftime, "%Y-%m-%d") || default
21
24
  end
22
25
 
23
26
  def attr_translated(attr, locale: I18n.locale, default: "")
24
27
  return default unless __getobj__
28
+
25
29
  __getobj__[attr].try(:[], locale.to_s).presence || default
26
30
  end
27
31
  end
@@ -11,6 +11,7 @@ module Decidim
11
11
  def initialize(day_string, organization)
12
12
  @day = day_string.present? ? Date.parse(day_string) : Time.zone.yesterday
13
13
  raise ArgumentError, "[ERROR] Malformed `day` argument. Format must be `YYYY-MM-DD` and in the past" if @day > Time.zone.today
14
+
14
15
  @day ||= Time.zone.yesterday
15
16
  @organization = organization
16
17
  @metric_name = metric_name
@@ -28,6 +29,7 @@ module Decidim
28
29
  return @registry if @registry
29
30
 
30
31
  return if cumulative.zero?
32
+
31
33
  @registry = Decidim::Metric.find_or_initialize_by(day: @day.to_s, metric_type: @metric_name, organization: @organization)
32
34
  @registry.assign_attributes(cumulative: cumulative, quantity: quantity)
33
35
  @registry.save!
@@ -61,6 +63,7 @@ module Decidim
61
63
  def retrieve_participatory_spaces
62
64
  Decidim.participatory_space_manifests.map do |space_manifest|
63
65
  next unless space_manifest.name == :participatory_processes # Temporal limitation
66
+
64
67
  space_manifest.participatory_spaces.call(@organization)
65
68
  end.flatten.compact
66
69
  end
@@ -9,6 +9,7 @@ module Decidim
9
9
  def initialize(day, resource)
10
10
  @day = day.try(:to_date) || Time.zone.yesterday
11
11
  raise ArgumentError, "[ERROR] Malformed `day` argument. Format must be `YYYY-MM-DD` and in the past" if @day > Time.zone.today
12
+
12
13
  @day ||= Time.zone.yesterday
13
14
  @resource = resource
14
15
  end
@@ -11,10 +11,12 @@ module Decidim
11
11
 
12
12
  def save
13
13
  return @registry if @registry
14
+
14
15
  @registry = []
15
16
  query.each do |key, results|
16
17
  cumulative_value = results[:cumulative_users].count
17
18
  next if cumulative_value.zero?
19
+
18
20
  quantity_value = results[:quantity_users].count || 0
19
21
  space_type, space_id = key
20
22
  record = Decidim::Metric.find_or_initialize_by(day: @day.to_s, metric_type: @metric_name,
@@ -49,6 +51,7 @@ module Decidim
49
51
  components.each do |component|
50
52
  operation_manifest = Decidim.metrics_operation.for(:followers, component.manifest_name)
51
53
  next grouped_participants unless operation_manifest
54
+
52
55
  component_participants = operation_manifest.calculate(@day, component)
53
56
  grouped_participants[key].merge!(component_participants || {}) do |_key, grouped_users, component_users|
54
57
  grouped_users | component_users
@@ -14,10 +14,12 @@ module Decidim
14
14
 
15
15
  def save
16
16
  return @registry if @registry
17
+
17
18
  @registry = []
18
19
  query.each do |key, results|
19
20
  cumulative_value = results[:cumulative_users].count
20
21
  next if cumulative_value.zero?
22
+
21
23
  quantity_value = results[:quantity_users].count || 0
22
24
  space_type, space_id = key
23
25
  record = Decidim::Metric.find_or_initialize_by(day: @day.to_s, metric_type: @metric_name,
@@ -45,6 +47,7 @@ module Decidim
45
47
  components.each do |component|
46
48
  operation_manifest = Decidim.metrics_operation.for(:participants, component.manifest_name)
47
49
  next grouped_participants unless operation_manifest
50
+
48
51
  component_participants = operation_manifest.calculate(@day, component)
49
52
  grouped_participants[key].merge!(component_participants || {}) do |_key, grouped_users, component_users|
50
53
  grouped_users | component_users
@@ -54,6 +57,7 @@ module Decidim
54
57
  # Special case for comments ONLY
55
58
  operation_manifest = Decidim.metrics_operation.for(:participants, :comments)
56
59
  next grouped_participants unless operation_manifest
60
+
57
61
  comments_participants = operation_manifest.calculate(@day, participatory_space)
58
62
  grouped_participants[key].merge!(comments_participants || {}) do |_key, grouped_users, comment_users|
59
63
  grouped_users | comment_users
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ # Class used to retrieve similar emendations, scoped to the current component.
5
+ class SimilarEmendations < Rectify::Query
6
+ include Decidim::TranslationsHelper
7
+
8
+ # Syntactic sugar to initialize the class and return the queried objects.
9
+ #
10
+ # amendment - Decidim::Amendment
11
+ def self.for(amendment)
12
+ new(amendment).query
13
+ end
14
+
15
+ # Initializes the class.
16
+ #
17
+ # amendment - Decidim::Amendment
18
+ def initialize(amendment)
19
+ @component = amendment.amendable.component
20
+ @emendation = amendment.emendation
21
+ @amender = amendment.amender
22
+ end
23
+
24
+ # Retrieves similar emendations
25
+ def query
26
+ emendation.class
27
+ .where(component: component)
28
+ .only_visible_emendations_for(amender, component)
29
+ .published
30
+ .not_hidden
31
+ .where(
32
+ "GREATEST(#{title_similarity}, #{body_similarity}) >= ?",
33
+ emendation.title,
34
+ emendation.body,
35
+ amendable_module.similarity_threshold
36
+ )
37
+ .limit(amendable_module.similarity_limit)
38
+ end
39
+
40
+ private
41
+
42
+ attr_reader :component, :emendation, :amender
43
+
44
+ def amendable_module
45
+ emendation.class.parent
46
+ end
47
+
48
+ def title_similarity
49
+ "similarity(title, ?)"
50
+ end
51
+
52
+ def body_similarity
53
+ "similarity(body, ?)"
54
+ end
55
+ end
56
+ end
@@ -48,6 +48,7 @@ module Decidim
48
48
  def filter
49
49
  @filters.each do |key, value|
50
50
  next unless Decidim::Metric.column_names.include? key.to_s
51
+
51
52
  @records = @records.where("#{key}": value)
52
53
  end
53
54
  end
@@ -47,6 +47,7 @@ module Decidim
47
47
 
48
48
  def permission
49
49
  return nil unless component && action
50
+
50
51
  @permission ||= resource&.permissions&.fetch(action, nil) || component.permissions&.fetch(action, nil)
51
52
  end
52
53
 
@@ -75,6 +75,7 @@ module Decidim
75
75
 
76
76
  def participatory_space
77
77
  return component.participatory_space if component.respond_to?(:participatory_space)
78
+
78
79
  resource.participatory_space if resource.respond_to?(:participatory_space)
79
80
  end
80
81
 
@@ -114,6 +114,7 @@ module Decidim
114
114
 
115
115
  chained_conditions = conditions.inject do |previous_condition, condition|
116
116
  next condition unless previous_condition
117
+
117
118
  previous_condition.or(condition)
118
119
  end
119
120
 
@@ -39,11 +39,13 @@ module Decidim
39
39
  followers.each do |recipient|
40
40
  next unless ["all", "followed-only"].include?(recipient.notification_types)
41
41
  next unless participatory_space.present? && participatory_space.is_a?(Decidim::Participable) && participatory_space.can_participate?(recipient)
42
+
42
43
  send_email_to(recipient, user_role: :follower)
43
44
  end
44
45
 
45
46
  affected_users.each do |recipient|
46
47
  next unless ["all", "own-only"].include?(recipient.notification_types)
48
+
47
49
  send_email_to(recipient, user_role: :affected_user)
48
50
  end
49
51
  end
@@ -63,6 +65,7 @@ module Decidim
63
65
  def send_email_to(recipient, user_role:)
64
66
  return unless recipient
65
67
  return unless recipient.email_on_notification?
68
+ return if resource.respond_to?(:can_participate?) && !resource.can_participate?(recipient)
66
69
 
67
70
  NotificationMailer
68
71
  .event_received(
@@ -83,6 +86,7 @@ module Decidim
83
86
 
84
87
  def participatory_space
85
88
  return resource if resource.is_a?(Decidim::ParticipatorySpaceResourceable)
89
+
86
90
  component&.participatory_space
87
91
  end
88
92
  end
@@ -50,6 +50,8 @@ module Decidim
50
50
  attr_reader :event, :event_class, :resource, :followers, :affected_users, :extra
51
51
 
52
52
  def generate_notification_for(recipient, user_role:)
53
+ return if resource.respond_to?(:can_participate?) && !resource.can_participate?(recipient)
54
+
53
55
  NotificationGeneratorForRecipientJob.perform_later(
54
56
  event,
55
57
  event_class.name,
@@ -30,7 +30,6 @@ module Decidim
30
30
  return unless event_class
31
31
  return unless resource
32
32
  return unless recipient
33
- return unless notification.event_class_instance.notifiable?
34
33
 
35
34
  notification.save!
36
35
  end
@@ -45,7 +45,7 @@ module Decidim
45
45
  end
46
46
 
47
47
  conditions = []
48
- conditions << "decidim_scope_id IS NULL" if clean_scope_ids.delete("global")
48
+ conditions << "#{query.model_name.plural}.decidim_scope_id IS NULL" if clean_scope_ids.delete("global")
49
49
  conditions.concat(["? = ANY(decidim_scopes.part_of)"] * clean_scope_ids.count) if clean_scope_ids.any?
50
50
 
51
51
  query.includes(:scope).references(:decidim_scopes).where(conditions.join(" OR "), *clean_scope_ids.map(&:to_i))
@@ -109,6 +109,7 @@ module Decidim
109
109
  def gid(author)
110
110
  return if author.blank?
111
111
  return author.to_gid if author.respond_to?(:to_gid)
112
+
112
113
  author
113
114
  end
114
115
 
@@ -11,6 +11,7 @@ module Decidim
11
11
  default_path = "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
12
12
 
13
13
  return File.join(Decidim.base_uploads_path, default_path) if Decidim.base_uploads_path.present?
14
+
14
15
  default_path
15
16
  end
16
17
  end
@@ -7,6 +7,7 @@ module Decidim
7
7
 
8
8
  process :set_content_type_and_size_in_model
9
9
  process :validate_dimensions
10
+ process :strip
10
11
 
11
12
  version :thumbnail, if: :image? do
12
13
  process resize_to_fit: [nil, 237]
@@ -18,6 +19,20 @@ module Decidim
18
19
 
19
20
  protected
20
21
 
22
+ def extension_white_list
23
+ %w(jpg jpeg gif png bmp pdf doc docx xls xlsx ppt ppx rtf txt odt ott odf otg ods ots)
24
+ end
25
+
26
+ # Strips out all embedded information from the image
27
+ def strip
28
+ return unless image?(self)
29
+
30
+ manipulate! do |img|
31
+ img.strip
32
+ img
33
+ end
34
+ end
35
+
21
36
  # CarrierWave automatically calls this method and validates the content
22
37
  # type fo the temp file to match against any of these options.
23
38
  def content_type_whitelist
@@ -62,6 +77,7 @@ module Decidim
62
77
 
63
78
  manipulate! do |image|
64
79
  raise CarrierWave::IntegrityError, I18n.t("carrierwave.errors.image_too_big") if image.dimensions.any? { |dimension| dimension > max_image_height_or_width }
80
+
65
81
  image
66
82
  end
67
83
  end