decidim-core 0.30.0.rc3 → 0.30.0

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 (71) hide show
  1. checksums.yaml +4 -4
  2. data/app/cells/decidim/participatory_space_dropdown_metadata/show.erb +5 -3
  3. data/app/commands/decidim/create_report.rb +1 -6
  4. data/app/commands/decidim/search.rb +14 -0
  5. data/app/controllers/decidim/reports_controller.rb +1 -1
  6. data/app/forms/decidim/account_form.rb +4 -1
  7. data/app/mailers/decidim/reported_mailer.rb +1 -0
  8. data/app/models/decidim/action_log.rb +1 -9
  9. data/app/packs/src/decidim/datepicker/datepicker_functions.js +3 -3
  10. data/app/packs/src/decidim/index.js +4 -2
  11. data/app/packs/stylesheets/decidim/_content_blocks.scss +4 -0
  12. data/app/packs/stylesheets/decidim/_header.scss +6 -2
  13. data/app/presenters/decidim/log/user_presenter.rb +1 -0
  14. data/app/presenters/decidim/user_presenter.rb +1 -1
  15. data/app/services/decidim/base_diff_renderer.rb +2 -0
  16. data/app/views/decidim/reported_mailer/hide.html.erb +17 -1
  17. data/app/views/decidim/reported_mailer/report.html.erb +1 -1
  18. data/app/views/decidim/searches/_count.html.erb +1 -1
  19. data/app/views/decidim/searches/_filters.html.erb +40 -38
  20. data/app/views/layouts/decidim/footer/_main_legal.html.erb +1 -1
  21. data/config/locales/ar.yml +3 -3
  22. data/config/locales/bg.yml +2 -2
  23. data/config/locales/bs-BA.yml +2 -0
  24. data/config/locales/ca-IT.yml +2400 -0
  25. data/config/locales/ca.yml +24 -2
  26. data/config/locales/cs.yml +10 -2
  27. data/config/locales/de.yml +13 -4
  28. data/config/locales/el.yml +2 -2
  29. data/config/locales/en.yml +22 -0
  30. data/config/locales/es-MX.yml +25 -3
  31. data/config/locales/es-PY.yml +25 -3
  32. data/config/locales/es.yml +23 -1
  33. data/config/locales/eu.yml +52 -31
  34. data/config/locales/fi-plain.yml +4 -3
  35. data/config/locales/fi.yml +4 -3
  36. data/config/locales/fr-CA.yml +16 -4
  37. data/config/locales/fr.yml +15 -3
  38. data/config/locales/ga-IE.yml +2 -0
  39. data/config/locales/gl.yml +3 -1
  40. data/config/locales/hu.yml +2 -2
  41. data/config/locales/id-ID.yml +2 -2
  42. data/config/locales/it.yml +12 -6
  43. data/config/locales/ja.yml +71 -9
  44. data/config/locales/lb.yml +5 -3
  45. data/config/locales/lv.yml +2 -2
  46. data/config/locales/nl.yml +2 -0
  47. data/config/locales/no.yml +2 -0
  48. data/config/locales/pl.yml +2 -2
  49. data/config/locales/pt-BR.yml +3 -3
  50. data/config/locales/pt.yml +2 -0
  51. data/config/locales/ro-RO.yml +172 -0
  52. data/config/locales/sk.yml +2 -2
  53. data/config/locales/sr-CS.yml +2 -0
  54. data/config/locales/sv.yml +19 -1
  55. data/config/locales/tr-TR.yml +3 -3
  56. data/config/locales/zh-CN.yml +2 -2
  57. data/config/locales/zh-TW.yml +2 -0
  58. data/lib/decidim/asset_router/storage.rb +7 -2
  59. data/lib/decidim/attributes/time_with_zone.rb +5 -1
  60. data/lib/decidim/content_parsers/blob_parser.rb +10 -8
  61. data/lib/decidim/core/test/shared_examples/reports_examples.rb +8 -15
  62. data/lib/decidim/core/test/shared_examples/uncommentable_component_examples.rb +26 -0
  63. data/lib/decidim/core/test/shared_examples/versions_controller_examples.rb +26 -0
  64. data/lib/decidim/core/version.rb +1 -1
  65. data/lib/decidim/moderation_tools.rb +14 -8
  66. data/lib/decidim/participatory_space_user.rb +1 -3
  67. data/lib/decidim/reportable.rb +6 -2
  68. data/lib/decidim/translatable_attributes.rb +5 -1
  69. data/lib/tasks/upgrade/decidim_fix_nickname_uniqueness.rake +3 -3
  70. metadata +7 -7
  71. data/lib/tasks/upgrade/clean_hidden_resources.rake +0 -33
@@ -20,19 +20,19 @@ module Decidim
20
20
  # https://github.com/rails/rails/blob/a7e379896552ce43b822385c03c37f2bd47739d3/activestorage/config/routes.rb#L5-L14
21
21
  BLOB_REGEX = %r{
22
22
  # Group 1: Host part
23
- (
23
+ (?<host_part>
24
24
  # Group 2: Domain and subpath part
25
- https?://((?!/rails).)+
25
+ #{URI::DEFAULT_PARSER.make_regexp(%w(https http))}
26
26
  )?
27
27
  /rails/active_storage
28
28
  # Group 3: Blob path, representation path or disk service path
29
- /(blobs/redirect|blobs/proxy|blobs|representations/redirect|representations/proxy|representations|disk)
29
+ /(?<type_part>blobs/redirect|blobs/proxy|blobs|representations/redirect|representations/proxy|representations|disk)
30
30
  # Group 4: Signed ID for blobs or encoded key for disk service
31
- /([^/]+)
31
+ /(?<key_part>[^/]+)
32
32
  # Group 5: Variation part (only for representations)
33
33
  (
34
34
  # Group 6: Variation key for representations
35
- /([\w.=-]+)
35
+ /(?<variation_part>[\w.=-]+)
36
36
  )?
37
37
  # Group 7: Filename
38
38
  /([\w.=-]+)
@@ -46,8 +46,10 @@ module Decidim
46
46
 
47
47
  def replace_blobs(text)
48
48
  text.gsub(BLOB_REGEX) do |match|
49
- type_part = Regexp.last_match(3)
50
- key_part = Regexp.last_match(4)
49
+ named_captures = Regexp.last_match.named_captures
50
+
51
+ type_part = named_captures["type_part"]
52
+ key_part = named_captures["key_part"]
51
53
 
52
54
  variation_key = nil
53
55
  blob =
@@ -59,7 +61,7 @@ module Decidim
59
61
  # Representation or blob
60
62
  if type_part.start_with?("representations")
61
63
  # Representation
62
- variation_part = Regexp.last_match(6)
64
+ variation_part = named_captures["variation_part"]
63
65
  variation_key = generate_variation_key(variation_part)
64
66
  end
65
67
 
@@ -33,13 +33,6 @@ shared_examples "higher user role hides" do
33
33
  before do
34
34
  login_as user, scope: :user
35
35
  end
36
- around do |example|
37
- previous = Capybara.raise_server_errors
38
-
39
- Capybara.raise_server_errors = false
40
- example.run
41
- Capybara.raise_server_errors = previous
42
- end
43
36
 
44
37
  it "reports the resource" do
45
38
  visit reportable_path
@@ -54,6 +47,10 @@ shared_examples "higher user role hides" do
54
47
  click_on "Hide"
55
48
  end
56
49
 
50
+ sleep(1)
51
+
52
+ expect(page).to have_current_path(reportable_index_path, ignore_query: true)
53
+
57
54
  expect(reportable.reload).to be_hidden
58
55
  end
59
56
  end
@@ -67,14 +64,6 @@ shared_examples "higher user role hides resource with comments" do
67
64
  login_as user, scope: :user
68
65
  Decidim::Ai::SpamDetection.create_reporting_user!
69
66
  end
70
- around do |example|
71
- previous = Capybara.raise_server_errors
72
-
73
- # Disabling server errors to that we can test page not found error.
74
- Capybara.raise_server_errors = false
75
- example.run
76
- Capybara.raise_server_errors = previous
77
- end
78
67
 
79
68
  it "hides the resource" do
80
69
  visit decidim.search_path
@@ -96,6 +85,10 @@ shared_examples "higher user role hides resource with comments" do
96
85
  click_on "Hide"
97
86
  end
98
87
 
88
+ sleep(1)
89
+
90
+ expect(page).to have_current_path(reportable_index_path, ignore_query: true)
91
+
99
92
  perform_enqueued_jobs
100
93
 
101
94
  expect(reportable.reload).to be_hidden
@@ -8,6 +8,7 @@ shared_examples "an uncommentable component" do
8
8
  manifest:,
9
9
  participatory_space:)
10
10
  end
11
+ let!(:comment) { create(:comment, commentable: resources.first) }
11
12
 
12
13
  it "does not displays comments count" do
13
14
  component.update!(settings: { comments_enabled: false })
@@ -18,4 +19,29 @@ shared_examples "an uncommentable component" do
18
19
  expect(page).to have_no_link(resource_locator(resource).path)
19
20
  end
20
21
  end
22
+
23
+ describe "when search a comment in the global search" do
24
+ it "does displays the comments" do
25
+ visit decidim.root_path
26
+
27
+ within ".main-bar__search" do
28
+ fill_in "term", with: comment.body["en"]
29
+ find("input#input-search").native.send_keys :enter
30
+ end
31
+
32
+ expect(page).to have_content("1 Results for the search")
33
+ end
34
+
35
+ it "does not displays the comment when comments are disable" do
36
+ component.update!(settings: { comments_enabled: false })
37
+ visit decidim.root_path
38
+
39
+ within ".main-bar__search" do
40
+ fill_in "term", with: comment.body["en"]
41
+ find("input#input-search").native.send_keys :enter
42
+ end
43
+
44
+ expect(page).to have_content("0 Results for the search")
45
+ end
46
+ end
21
47
  end
@@ -2,6 +2,32 @@
2
2
 
3
3
  require "spec_helper"
4
4
 
5
+ shared_examples "a version of a hidden object" do
6
+ before do
7
+ visit resource_path
8
+ click_on "see other versions"
9
+ click_on("Version 1 of #{hidden_object.reload.versions.size}")
10
+ end
11
+
12
+ around do |example|
13
+ previous = Capybara.raise_server_errors
14
+
15
+ Capybara.raise_server_errors = false
16
+ example.run
17
+ Capybara.raise_server_errors = previous
18
+ end
19
+
20
+ it "shows an error page" do
21
+ expect(page).to have_content("Changes at")
22
+
23
+ create(:moderation, reportable: hidden_object, hidden_at: 1.day.ago)
24
+
25
+ visit current_path
26
+
27
+ expect(page).to have_content(ActiveRecord::RecordNotFound)
28
+ end
29
+ end
30
+
5
31
  shared_examples "versions controller" do
6
32
  let(:base_params) do
7
33
  if resource.is_a?(Decidim::Participable)
@@ -4,7 +4,7 @@ module Decidim
4
4
  # This holds the decidim-core version.
5
5
  module Core
6
6
  def self.version
7
- "0.30.0.rc3"
7
+ "0.30.0"
8
8
  end
9
9
  end
10
10
  end
@@ -60,15 +60,21 @@ module Decidim
60
60
  def send_notification_to_author
61
61
  return if affected_users.blank?
62
62
 
63
- data = {
64
- event: "decidim.events.reports.resource_hidden",
65
- event_class: Decidim::ResourceHiddenEvent,
63
+ data = if @reportable.moderation.reports.last&.reason == "parent_hidden"
64
+ { event: "decidim.events.reports.parent_hidden", event_class: Decidim::ParentHiddenEvent }
65
+ else
66
+ { event: "decidim.events.reports.resource_hidden", event_class: Decidim::ResourceHiddenEvent }
67
+ end
68
+
69
+ data.merge!(
66
70
  resource: @reportable,
67
71
  extra: {
68
- report_reasons:
72
+ report_reasons:,
73
+ force_email: true
69
74
  },
70
- affected_users:
71
- }
75
+ affected_users:,
76
+ force_send: true
77
+ )
72
78
 
73
79
  Decidim::EventsManager.publish(**data)
74
80
  end
@@ -95,7 +101,7 @@ module Decidim
95
101
 
96
102
  if @reportable.is_a?(Decidim::Comments::Commentable)
97
103
  @reportable.comment_threads.each do |comment|
98
- Decidim::HideChildResourcesJob.perform_later(comment, @current_user.id)
104
+ Decidim::HideChildResourcesJob.perform_later(comment, current_user.id)
99
105
  end
100
106
  end
101
107
 
@@ -109,7 +115,7 @@ module Decidim
109
115
  end
110
116
 
111
117
  def report_reasons
112
- @reportable.moderation.reports.pluck(:reason).uniq
118
+ [@reportable.moderation.reports.last&.reason]
113
119
  end
114
120
  end
115
121
  end
@@ -37,9 +37,7 @@ module Decidim
37
37
  raise "Not implemented"
38
38
  end
39
39
 
40
- def self.ransackable_attributes(auth_object = nil)
41
- return [] unless auth_object&.admin?
42
-
40
+ def self.ransackable_attributes(_auth_object = nil)
43
41
  %w(name nickname email invitation_accepted_at last_sign_in_at role)
44
42
  end
45
43
 
@@ -53,8 +53,12 @@ module Decidim
53
53
  # Public: The reported content url
54
54
  #
55
55
  # Returns String
56
- def reported_content_url
57
- raise NotImplementedError
56
+ def reported_content_url(options = {})
57
+ if hidden?
58
+ ResourceLocatorPresenter.new(self).index(options)
59
+ else
60
+ ResourceLocatorPresenter.new(self).url(options)
61
+ end
58
62
  end
59
63
 
60
64
  # Public: The collection of attribute names that are considered
@@ -62,7 +62,7 @@ module Decidim
62
62
  final = super(value)
63
63
  return unless final # Do not set the `nil` values for the parent hash
64
64
 
65
- final = value_type.serialize(final) if value_type
65
+ final = value_type.serialize(final) if value_type && !attachment?(final)
66
66
 
67
67
  public_send("#{name}=", field.merge(locale => final))
68
68
  end
@@ -127,5 +127,9 @@ module Decidim
127
127
  locale.to_s == try(:default_locale).to_s ||
128
128
  locale.to_s == try(:current_organization).try(:default_locale).to_s
129
129
  end
130
+
131
+ def attachment?(value)
132
+ value.is_a?(String) && value.include?(ActiveStorage.routes_prefix)
133
+ end
130
134
  end
131
135
  end
@@ -7,7 +7,7 @@ namespace :decidim do
7
7
  logger.info("Fixing user nicknames case...")
8
8
 
9
9
  has_changed = []
10
- Decidim::User.not_deleted.find_each do |user|
10
+ Decidim::UserBaseEntity.not_deleted.find_each do |user|
11
11
  user.nickname.downcase!
12
12
 
13
13
  begin
@@ -15,11 +15,11 @@ namespace :decidim do
15
15
  user.save!
16
16
  has_changed << user.id
17
17
  end
18
- rescue ActiveRecord::RecordInvalid
18
+ rescue ActiveRecord::RecordInvalid, ActiveRecord::RecordNotUnique
19
19
  update_user_nickname(user, Decidim::UserBaseEntity.nicknamize(user.nickname, organization: user.organization))
20
20
  has_changed << user.id
21
21
  rescue ActiveRecord::RecordInvalid # rubocop:disable Lint/DuplicateRescueException
22
- logger.warn("User ID (#{similar_user.id}) : #{e}")
22
+ logger.warn("User ID (#{user.id}) : #{e}")
23
23
  end
24
24
  end
25
25
  logger.info("Process terminated, #{has_changed.count} users nickname have been updated.")
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: decidim-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.30.0.rc3
4
+ version: 0.30.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Josep Jaume Rey Peroy
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2025-03-19 00:00:00.000000000 Z
13
+ date: 2025-04-29 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: concurrent-ruby
@@ -780,28 +780,28 @@ dependencies:
780
780
  requirements:
781
781
  - - '='
782
782
  - !ruby/object:Gem::Version
783
- version: 0.30.0.rc3
783
+ version: 0.30.0
784
784
  type: :development
785
785
  prerelease: false
786
786
  version_requirements: !ruby/object:Gem::Requirement
787
787
  requirements:
788
788
  - - '='
789
789
  - !ruby/object:Gem::Version
790
- version: 0.30.0.rc3
790
+ version: 0.30.0
791
791
  - !ruby/object:Gem::Dependency
792
792
  name: decidim-dev
793
793
  requirement: !ruby/object:Gem::Requirement
794
794
  requirements:
795
795
  - - '='
796
796
  - !ruby/object:Gem::Version
797
- version: 0.30.0.rc3
797
+ version: 0.30.0
798
798
  type: :development
799
799
  prerelease: false
800
800
  version_requirements: !ruby/object:Gem::Requirement
801
801
  requirements:
802
802
  - - '='
803
803
  - !ruby/object:Gem::Version
804
- version: 0.30.0.rc3
804
+ version: 0.30.0
805
805
  description: Adds core features so other engines can hook into the framework.
806
806
  email:
807
807
  - josepjaume@gmail.com
@@ -2199,6 +2199,7 @@ files:
2199
2199
  - config/locales/bg.yml
2200
2200
  - config/locales/bn-BD.yml
2201
2201
  - config/locales/bs-BA.yml
2202
+ - config/locales/ca-IT.yml
2202
2203
  - config/locales/ca.yml
2203
2204
  - config/locales/cs-CZ.yml
2204
2205
  - config/locales/cs.yml
@@ -3079,7 +3080,6 @@ files:
3079
3080
  - lib/tasks/decidim_taxonomies.rake
3080
3081
  - lib/tasks/decidim_webpacker_tasks.rake
3081
3082
  - lib/tasks/upgrade/clean.rake
3082
- - lib/tasks/upgrade/clean_hidden_resources.rake
3083
3083
  - lib/tasks/upgrade/decidim_active_storage_migration_tasks.rake
3084
3084
  - lib/tasks/upgrade/decidim_attachments.rake
3085
3085
  - lib/tasks/upgrade/decidim_content_blocks_tasks.rake
@@ -1,33 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- namespace :decidim do
4
- namespace :upgrade do
5
- namespace :clean do
6
- desc "Removes all related resources from hidden resource"
7
- task hidden_resources: :environment do
8
- logger.info("Removing child resources for hidden parents...")
9
- Decidim::Moderation.hidden.find_each do |moderation_for_hidden_resource|
10
- reportable = moderation_for_hidden_resource.reportable
11
-
12
- current_user = if Decidim.module_installed?(:ai)
13
- reportable.organization.users.find_by!(email: Decidim::Ai::SpamDetection.reporting_user_email)
14
- else
15
- reportable.organization.admins.first
16
- end
17
-
18
- tool = Decidim::ModerationTools.new(reportable, current_user)
19
- tool.hide!
20
- rescue NameError => e
21
- log_error "Could not hide child resources for reportable id #{moderation_for_hidden_resource.id} because: #{e.message}"
22
- end
23
- end
24
-
25
- private
26
-
27
- def log_error(msg)
28
- puts msg
29
- Rails.logger.error(msg)
30
- end
31
- end
32
- end
33
- end