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
@@ -18,7 +18,7 @@ module Decidim
18
18
 
19
19
  map_url = "https://www.openstreetmap.org/?mlat=#{latitude}&mlon=#{longitude}#map=#{zoom}/#{latitude}/#{longitude}"
20
20
 
21
- link_to map_url, target: "_blank" do
21
+ link_to map_url, target: "_blank", rel: "noopener" do
22
22
  image_tag decidim.static_map_path(sgid: resource.to_sgid.to_s)
23
23
  end
24
24
  end
@@ -36,6 +36,7 @@ module Decidim
36
36
  def add_decidim_page_title(title)
37
37
  @decidim_page_title ||= []
38
38
  return @decidim_page_title if title.blank?
39
+
39
40
  @decidim_page_title << title
40
41
  end
41
42
 
@@ -12,6 +12,7 @@ module Decidim
12
12
  # Returns a String.
13
13
  def resource_reference(resource, options = {})
14
14
  return unless resource.respond_to?(:reference) && resource.reference.present?
15
+
15
16
  "<div class='tech-info #{options[:class]}'>#{localized_reference(resource.reference)}</div>".html_safe
16
17
  end
17
18
 
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ class EventPublisherJob < ApplicationJob
5
+ queue_as :events
6
+
7
+ attr_reader :resource
8
+
9
+ def perform(event_name, data)
10
+ @resource = data[:resource]
11
+
12
+ return unless notifiable?
13
+
14
+ EmailNotificationGeneratorJob.perform_later(
15
+ event_name,
16
+ data[:event_class],
17
+ data[:resource],
18
+ data[:followers],
19
+ data[:affected_users],
20
+ data[:extra]
21
+ )
22
+
23
+ NotificationGeneratorJob.perform_later(
24
+ event_name,
25
+ data[:event_class],
26
+ data[:resource],
27
+ data[:followers],
28
+ data[:affected_users],
29
+ data[:extra]
30
+ )
31
+ end
32
+
33
+ private
34
+
35
+ # Whether this event should be notified or not. Useful when you want the
36
+ # event to decide based on the params.
37
+ #
38
+ # It returns false when the resource or any element in the chain is a
39
+ # `Decidim::Publicable` and it isn't published or participatory_space
40
+ # is a `Decidim::Participable` and the user can't participate.
41
+ def notifiable?
42
+ return false if resource.is_a?(Decidim::Publicable) && !resource.published?
43
+ return false if participatory_space.is_a?(Decidim::Publicable) && !participatory_space&.published?
44
+ return false if component && !component.published?
45
+
46
+ true
47
+ end
48
+
49
+ def component
50
+ return resource.component if resource.is_a?(Decidim::HasComponent)
51
+ return resource if resource.is_a?(Decidim::Component)
52
+ end
53
+
54
+ def participatory_space
55
+ return resource if resource.is_a?(Decidim::ParticipatorySpaceResourceable)
56
+
57
+ component&.participatory_space
58
+ end
59
+ end
60
+ end
@@ -7,6 +7,7 @@ module Decidim
7
7
  def perform(manager_class, organization_id, day = nil)
8
8
  organization = Decidim::Organization.find_by(id: organization_id)
9
9
  return unless organization
10
+
10
11
  metric = manager_class.constantize.new(day, organization)
11
12
  metric.save if metric.valid?
12
13
  end
@@ -128,5 +128,17 @@ module Decidim
128
128
  scope.each { |relation| loader.call(relation.id, relation) }
129
129
  end
130
130
  end
131
+
132
+ # Whether this activity or log is visible for a given user (can also be nil)
133
+ #
134
+ # Returns a True/False.
135
+ def visible_for?(user)
136
+ return false if resource_lazy.blank?
137
+ return false if participatory_space_lazy.blank?
138
+ return false if resource_lazy.respond_to?(:hidden?) && resource_lazy.hidden?
139
+ return false if resource_lazy.respond_to?(:can_participate?) && !resource_lazy.can_participate?(user)
140
+
141
+ true
142
+ end
131
143
  end
132
144
  end
@@ -2,11 +2,18 @@
2
2
 
3
3
  module Decidim
4
4
  class Amendment < ApplicationRecord
5
+ STATES = %w(draft evaluating accepted rejected withdrawn).freeze
6
+
5
7
  belongs_to :amendable, foreign_key: "decidim_amendable_id", foreign_type: "decidim_amendable_type", polymorphic: true
6
8
  belongs_to :amender, foreign_key: "decidim_user_id", class_name: "Decidim::User"
7
9
  belongs_to :emendation, foreign_key: "decidim_emendation_id", foreign_type: "decidim_emendation_type", polymorphic: true
8
10
 
9
- STATES = %w(evaluating accepted rejected withdrawn).freeze
11
+ validates :amendable, :amender, :emendation, presence: true
12
+ validates :state, presence: true, inclusion: { in: STATES }
13
+
14
+ def draft?
15
+ state == "draft"
16
+ end
10
17
 
11
18
  def evaluating?
12
19
  state == "evaluating"
@@ -16,6 +23,28 @@ module Decidim
16
23
  state == "rejected"
17
24
  end
18
25
 
19
- validates :amendable, :amender, :emendation, presence: true
26
+ def promoted?
27
+ return false unless rejected?
28
+
29
+ emendation.linked_promoted_resource.present?
30
+ end
31
+
32
+ # VisibilityStepSetting::options can be expanded via config setting.
33
+ #
34
+ # For new options, add the missing locales in `decidim-core/config/locales/en.yml` and
35
+ # change the logic of the filtering methods in the Amendable concern to fit your needs:
36
+ # - Decidim::Amendable::only_visible_emendations_for(user, component)
37
+ # - Decidim::Amendable::amendables_and_visible_emendations_for(user, component)
38
+ # - Decidim::Amendable#visible_emendations_for(user)
39
+ #
40
+ # Returns an Array of Arrays of translation, value:
41
+ # i.e. [["All amendments are visible", "all"], ...]
42
+ class VisibilityStepSetting
43
+ def self.options
44
+ Decidim.config.amendments_visibility_options.map do |option|
45
+ [I18n.t(option, scope: "decidim.amendments.visibility_options"), option]
46
+ end
47
+ end
48
+ end
20
49
  end
21
50
  end
@@ -44,6 +44,7 @@ module Decidim
44
44
  # Returns String.
45
45
  def thumbnail_url
46
46
  return unless photo?
47
+
47
48
  file.thumbnail.url
48
49
  end
49
50
 
@@ -52,6 +53,7 @@ module Decidim
52
53
  # Returns String.
53
54
  def big_url
54
55
  return unless photo?
56
+
55
57
  file.big.url
56
58
  end
57
59
  end
@@ -53,6 +53,7 @@ module Decidim
53
53
  def expires_at
54
54
  return unless workflow_manifest
55
55
  return if workflow_manifest.expires_in.zero?
56
+
56
57
  (granted_at || created_at) + workflow_manifest.expires_in
57
58
  end
58
59
 
@@ -44,6 +44,7 @@ module Decidim
44
44
 
45
45
  def subcategories_have_same_participatory_space
46
46
  return unless parent
47
+
47
48
  self.participatory_space = parent.participatory_space
48
49
  end
49
50
  end
@@ -73,6 +73,13 @@ module Decidim
73
73
  # Public: Returns an empty description
74
74
  def resource_description; end
75
75
 
76
+ def can_participate_in_space?(user)
77
+ return true unless participatory_space.try(:private_space?)
78
+ return false unless user
79
+
80
+ participatory_space.can_participate?(user)
81
+ end
82
+
76
83
  private
77
84
 
78
85
  def participatory_space_name
@@ -66,6 +66,7 @@ module Decidim
66
66
  # block manifest.
67
67
  def images_container
68
68
  return @images_container if @images_container
69
+
69
70
  manifest = self.manifest
70
71
 
71
72
  @images_container = Class.new do
@@ -36,17 +36,20 @@ module Decidim
36
36
 
37
37
  def increase_followers_counter
38
38
  return unless followable.is_a?(Decidim::UserBaseEntity)
39
+
39
40
  followable.increment!(:followers_count)
40
41
  end
41
42
 
42
43
  def decrease_following_counters
43
44
  return unless user
45
+
44
46
  user.decrement!(:following_count)
45
47
  end
46
48
 
47
49
  def decrease_followers_counter
48
50
  return unless followable.is_a?(Decidim::UserBaseEntity)
49
51
  return unless user
52
+
50
53
  followable.decrement!(:followers_count)
51
54
  end
52
55
  # rubocop:enable Rails/SkipsModelValidations
@@ -25,6 +25,7 @@ module Decidim
25
25
 
26
26
  def same_organization
27
27
  return if organization == user&.organization
28
+
28
29
  errors.add(:organization, :invalid)
29
30
  end
30
31
  end
@@ -25,11 +25,13 @@ module Decidim
25
25
 
26
26
  def same_organization
27
27
  return if admin&.organization == user&.organization
28
+
28
29
  errors.add(:admin, :invalid)
29
30
  end
30
31
 
31
32
  def non_active_impersonation
32
33
  return if ended? || expired?
34
+
33
35
  errors.add(:admin, :invalid) if Decidim::ImpersonationLog.where(admin: admin).active.any?
34
36
  end
35
37
  end
@@ -51,6 +51,7 @@ module Decidim
51
51
 
52
52
  def author_belongs_to_organization
53
53
  return if !author || !organization
54
+
54
55
  errors.add(:author, :invalid) unless author.organization == organization
55
56
  end
56
57
  end
@@ -25,6 +25,7 @@ module Decidim
25
25
  # Private: check if the process and the user have the same organization
26
26
  def user_and_participatory_process_same_organization
27
27
  return if !participatory_process || !user
28
+
28
29
  errors.add(:participatory_process, :invalid) unless user.organization == participatory_process.organization
29
30
  end
30
31
  end
@@ -27,6 +27,7 @@ module Decidim
27
27
  # Private: check if the participatory space and the user have the same organization
28
28
  def user_and_participatory_space_same_organization
29
29
  return if !privatable_to || !user
30
+
30
31
  errors.add(:privatable_to, :invalid) unless user.organization == privatable_to.organization
31
32
  end
32
33
  end
@@ -23,6 +23,7 @@ module Decidim
23
23
 
24
24
  def allow!
25
25
  raise PermissionCannotBeDisallowedError, "Allowing a previously disallowed action is not permitted: #{inspect}" if @state == :disallowed
26
+
26
27
  @state = :allowed
27
28
  end
28
29
 
@@ -32,6 +33,7 @@ module Decidim
32
33
 
33
34
  def allowed?
34
35
  raise PermissionNotSetError, "Permission hasn't been allowed or disallowed yet: #{inspect}" if @state.blank?
36
+
35
37
  @state == :allowed
36
38
  end
37
39
 
@@ -28,6 +28,7 @@ module Decidim
28
28
  # Private: check if the moderation and the user have the same organization
29
29
  def user_and_moderation_same_organization
30
30
  return if !moderation || !user
31
+
31
32
  errors.add(:moderation, :invalid) unless user.organization == moderation.organization
32
33
  end
33
34
  end
@@ -73,6 +73,7 @@ module Decidim
73
73
 
74
74
  def forbid_cycles
75
75
  return unless parent
76
+
76
77
  errors.add(:parent_id, :cycle_detected) if parent.part_of.include?(id)
77
78
  end
78
79
 
@@ -16,7 +16,7 @@ module Decidim
16
16
  # - datetime: The timestamp that places this resource in the line of time. Used as second criteria (first is text relevance) for sorting.
17
17
  #
18
18
  class SearchableResource < ApplicationRecord
19
- include PgSearch
19
+ include PgSearch::Model
20
20
 
21
21
  belongs_to :organization,
22
22
  foreign_key: "decidim_organization_id",
@@ -65,6 +65,7 @@ module Decidim
65
65
  # set the organization tos_version
66
66
  def update_organization_tos_version
67
67
  return unless slug == "terms-and-conditions"
68
+
68
69
  organization.update!(tos_version: created_at)
69
70
  end
70
71
 
@@ -182,6 +182,7 @@ module Decidim
182
182
  # If the user has been deleted or it is managed the email field is not required anymore.
183
183
  def email_required?
184
184
  return false if deleted? || managed?
185
+
185
186
  super
186
187
  end
187
188
 
@@ -189,6 +190,7 @@ module Decidim
189
190
  # If the user is managed the password field is not required anymore.
190
191
  def password_required?
191
192
  return false if managed?
193
+
192
194
  super
193
195
  end
194
196
 
@@ -11,8 +11,8 @@ module Decidim
11
11
  search_scope_action?
12
12
 
13
13
  return permission_action unless user
14
- return user_manager_permissions if not_admin? && user_manager?
15
14
 
15
+ user_manager_permissions
16
16
  manage_self_user_action?
17
17
  authorization_action?
18
18
  follow_action?
@@ -30,11 +30,13 @@ module Decidim
30
30
  def read_public_pages_action?
31
31
  return unless permission_action.subject == :public_page &&
32
32
  permission_action.action == :read
33
+
33
34
  allow!
34
35
  end
35
36
 
36
37
  def locales_action?
37
38
  return unless permission_action.subject == :locales
39
+
38
40
  allow!
39
41
  end
40
42
 
@@ -45,21 +47,25 @@ module Decidim
45
47
  return allow! if component.published?
46
48
  return allow! if user_can_admin_component?
47
49
  return allow! if user_can_admin_component_via_space?
50
+
48
51
  disallow!
49
52
  end
50
53
 
51
54
  def search_scope_action?
52
55
  return unless permission_action.subject == :scope
56
+
53
57
  toggle_allow([:search, :pick].include?(permission_action.action))
54
58
  end
55
59
 
56
60
  def manage_self_user_action?
57
61
  return unless permission_action.subject == :user
62
+
58
63
  toggle_allow(context.fetch(:current_user, nil) == user)
59
64
  end
60
65
 
61
66
  def authorization_action?
62
67
  return unless permission_action.subject == :authorization
68
+
63
69
  authorization = context.fetch(:authorization, nil)
64
70
 
65
71
  case permission_action.action
@@ -82,10 +88,17 @@ module Decidim
82
88
 
83
89
  def amend_action?
84
90
  return unless permission_action.subject == :amendment
85
- return allow! if permission_action.action == :create
86
- return allow! if permission_action.action == :reject
87
- return allow! if permission_action.action == :promote
88
- return allow! if permission_action.action == :accept
91
+ return disallow! unless component.settings.amendments_enabled
92
+
93
+ case permission_action.action
94
+ when :create
95
+ return allow! if component.current_settings.amendment_creation_enabled
96
+ when :accept,
97
+ :reject
98
+ return allow! if component.current_settings.amendment_reaction_enabled
99
+ when :promote
100
+ return allow! if component.current_settings.amendment_promotion_enabled
101
+ end
89
102
 
90
103
  amendment = context.fetch(:amendment, nil)
91
104
  toggle_allow(amendment&.amender == user)
@@ -158,14 +171,5 @@ module Decidim
158
171
  def user_manager_permissions
159
172
  Decidim::UserManagerPermissions.new(user, permission_action, context).permissions
160
173
  end
161
-
162
- def not_admin?
163
- !user.admin?
164
- end
165
-
166
- # Whether the user has the user_manager role or not.
167
- def user_manager?
168
- user.role? "user_manager"
169
- end
170
174
  end
171
175
  end