decidim-core 0.30.3 → 0.30.4

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 (36) hide show
  1. checksums.yaml +4 -4
  2. data/app/cells/decidim/activity_cell.rb +6 -0
  3. data/app/controllers/decidim/download_your_data_controller.rb +5 -2
  4. data/app/models/decidim/private_export.rb +4 -0
  5. data/app/packs/src/decidim/map/controller/markers.js +3 -1
  6. data/app/packs/stylesheets/decidim/_footer.scss +5 -0
  7. data/app/services/decidim/download_your_data_exporter.rb +15 -4
  8. data/app/services/decidim/open_data_exporter.rb +2 -1
  9. data/app/views/decidim/download_your_data/_export.html.erb +1 -1
  10. data/app/views/decidim/export_mailer/download_your_data_export.html.erb +1 -1
  11. data/app/views/decidim/export_mailer/export.html.erb +1 -1
  12. data/config/locales/ca-IT.yml +4 -2
  13. data/config/locales/ca.yml +2 -0
  14. data/config/locales/de.yml +1 -1
  15. data/config/locales/en.yml +2 -0
  16. data/config/locales/es-MX.yml +2 -0
  17. data/config/locales/es-PY.yml +2 -0
  18. data/config/locales/es.yml +2 -0
  19. data/config/locales/eu.yml +12 -10
  20. data/config/locales/fi-plain.yml +1 -0
  21. data/config/locales/fi.yml +1 -0
  22. data/config/locales/fr-CA.yml +3 -1
  23. data/config/locales/fr.yml +3 -1
  24. data/config/locales/it.yml +2 -0
  25. data/config/locales/ja.yml +2 -0
  26. data/config/locales/ru.yml +0 -1
  27. data/config/locales/sl.yml +0 -1
  28. data/db/migrate/20250819110800_convert_private_exports_id_to_uuid.rb +55 -0
  29. data/lib/decidim/core/engine.rb +1 -0
  30. data/lib/decidim/core/test/factories.rb +7 -2
  31. data/lib/decidim/core/test/shared_examples/comments_examples.rb +24 -0
  32. data/lib/decidim/core/version.rb +1 -1
  33. data/lib/decidim/webpacker/configuration.rb +5 -1
  34. data/lib/tasks/upgrade/clean.rake +11 -0
  35. data/lib/tasks/upgrade/decidim_fix_action_log.rake +28 -0
  36. metadata +8 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: df5ddb6f2f1e3c2557f89a0a2b9bab41c3108ad0ce0e728bfb317502cc6aa1a9
4
- data.tar.gz: ed7e8f76a6f52fd5040a7bfbb462276d891406a13198df8571d6e154fb504a2f
3
+ metadata.gz: 170c5d444f05cfbcae31786562762966232e9fadad30da014a19a6ceb239a768
4
+ data.tar.gz: cb838708158da84fdea7082175501cd7d2bed5499b7a2450c10e3ab1b79858b9
5
5
  SHA512:
6
- metadata.gz: e3ee0aa2b315e4038a9737c46b8453b075d4d058569d060b777c530a4cb62b71edd37f99bddecdf50fc810e7d9995a89729c60b10cbd10363b6c14d217b069d4
7
- data.tar.gz: 7f2b0baa65e1c613ee50d8ff74c4d1bb0a38c2224d51bfa76b34da5a44ec2024fd0e4bcba51a6664d283786ce62f0a4dbd05f4125011b8136750599106e6369d
6
+ metadata.gz: db97bde00dcc402180828529bb1801c527a4565d7205ce1432f6eba97348c83ce58770548fddd6c71421c6202bb70cd269bd898d7059e5cb61db3d9d84fd903c
7
+ data.tar.gz: c5cb74531f7240c2d1a9feb356c5e3b44e9da7016b127b048d081dc968796ce546d59bbd0088b4d1134aad40c4abe65db9cd358981c93c3ca84d9964365eebab
@@ -12,6 +12,12 @@ module Decidim
12
12
  return unless renderable?
13
13
 
14
14
  render
15
+ rescue NoMethodError => e
16
+ # Soft-deleted components or participatory spaces could cause errors
17
+ # when rendering activities. We log them for further inspection but
18
+ # avoid breaking the entire activity feed.
19
+ Rails.logger.error("Error rendering activity cell for #{model.id}: #{e.message}")
20
+ nil
15
21
  end
16
22
 
17
23
  # Since activity logs could be linked to resource no longer available
@@ -43,7 +43,10 @@ module Decidim
43
43
  def download_file
44
44
  enforce_permission_to(:download, :user, current_user:)
45
45
 
46
- if private_export.expired?
46
+ if private_export.blank?
47
+ flash[:error] = t("decidim.account.download_your_data_export.export_not_found")
48
+ redirect_to download_your_data_path
49
+ elsif private_export.expired?
47
50
  flash[:error] = t("decidim.account.download_your_data_export.export_expired")
48
51
  redirect_to download_your_data_path
49
52
  elsif private_export.file.attached?
@@ -57,7 +60,7 @@ module Decidim
57
60
  private
58
61
 
59
62
  def private_export
60
- @private_export ||= current_user.private_exports.find(params[:uuid])
63
+ @private_export ||= current_user.private_exports.where(uuid: params[:uuid]).first
61
64
  end
62
65
 
63
66
  def help_definitions
@@ -12,6 +12,10 @@ module Decidim
12
12
 
13
13
  default_scope { order(created_at: :desc) }
14
14
 
15
+ before_create do |record|
16
+ record.uuid = SecureRandom.uuid
17
+ end
18
+
15
19
  def expired?
16
20
  expires_at < Time.zone.now
17
21
  end
@@ -67,7 +67,9 @@ export default class MapMarkersController extends MapController {
67
67
  }
68
68
 
69
69
  clearMarkers() {
70
- this.map.removeLayer(this.markerClusters);
70
+ if (this.markerClusters !== null) {
71
+ this.map.removeLayer(this.markerClusters);
72
+ }
71
73
  this.markerClusters = new L.MarkerClusterGroup();
72
74
  this.map.addLayer(this.markerClusters);
73
75
  }
@@ -4,6 +4,11 @@ footer {
4
4
 
5
5
  &__top {
6
6
  @apply hidden lg:flex flex-row gap-8 container py-10;
7
+
8
+ .prose a,
9
+ .prose strong {
10
+ @apply text-white;
11
+ }
7
12
  }
8
13
 
9
14
  &__down {
@@ -22,14 +22,21 @@ module Decidim
22
22
  end
23
23
 
24
24
  # i18n-tasks-use t("decidim.download_your_data.show.download_your_data")
25
- def export
26
- user_export = user.private_exports.build
25
+ def export(retries: 0)
26
+ data.rewind
27
+ user_export = user.private_exports.build(file_size: data.length)
27
28
  user_export.export_type = name
28
- user_export.file.attach(io: data, filename: "#{name}.zip", content_type: "application/zip")
29
+ user_export.content_type = "application/zip"
29
30
  user_export.expires_at = Decidim.download_your_data_expiry_time.from_now
30
31
  user_export.metadata = {}
31
32
  user_export.save!
32
- user_export
33
+ user_export.file.attach(io: data, filename: "#{name}.zip", content_type: "application/zip")
34
+
35
+ return user_export.reload if user_export.reload.file.attached?
36
+ return user_export.reload if retries >= 3
37
+
38
+ user_export.destroy!
39
+ export(retries: retries + 1)
33
40
  end
34
41
 
35
42
  private
@@ -37,6 +44,10 @@ module Decidim
37
44
  attr_reader :user, :export_format, :name
38
45
 
39
46
  def data
47
+ @data ||= load_data!
48
+ end
49
+
50
+ def load_data!
40
51
  user_data, user_attachments = data_and_attachments_for_user
41
52
  buffer = Zip::OutputStream.write_buffer do |out|
42
53
  save_user_data(out, user_data)
@@ -116,9 +116,10 @@ module Decidim
116
116
  end
117
117
 
118
118
  def data_for_participatory_space(export_manifest)
119
- collection = participatory_spaces.flat_map do |participatory_space|
119
+ collection = participatory_spaces.filter { |space| space.manifest.name == export_manifest.manifest.name }.flat_map do |participatory_space|
120
120
  export_manifest.collection.call(participatory_space)
121
121
  end
122
+
122
123
  serializer = export_manifest.open_data_serializer.nil? ? export_manifest.serializer : export_manifest.open_data_serializer
123
124
  exporter = Decidim::Exporters::CSV.new(collection, serializer)
124
125
  get_help_definition(:spaces, exporter, export_manifest) unless collection.empty?
@@ -2,7 +2,7 @@
2
2
  <td class="text-left p-4"><%= t(export.export_type, scope:"decidim.download_your_data.show") %></td>
3
3
  <td class="text-center"><%= export.expired? ? t("expired", scope:"decidim.download_your_data.show") : l(export.expires_at, format: :decidim_short) %></td>
4
4
  <td class="py-4">
5
- <%= button_to download_download_your_data_path(export),
5
+ <%= button_to download_download_your_data_path(uuid: export.uuid),
6
6
  class: "button button__sm button__transparent-secondary m-auto block",
7
7
  disabled: export.expired?,
8
8
  aria: { label: t("download", scope:"decidim.download_your_data.show") },
@@ -3,5 +3,5 @@
3
3
  </p>
4
4
 
5
5
  <p class="email-button email-button__cta">
6
- <%= link_to t(".download"), download_download_your_data_url(@private_export, host: @organization.host), class: "button expanded hollow button--sc" %>
6
+ <%= link_to t(".download"), download_download_your_data_url(uuid: @private_export.uuid, host: @organization.host), class: "button expanded hollow button--sc" %>
7
7
  </p>
@@ -3,5 +3,5 @@
3
3
  </p>
4
4
 
5
5
  <p class="email-button email-button__cta">
6
- <%= link_to t(".download"), download_download_your_data_url(@private_export, host: @organization.host), class: "button expanded hollow button--sc" %>
6
+ <%= link_to t(".download"), download_download_your_data_url(uuid: @private_export.uuid, host: @organization.host), class: "button expanded hollow button--sc" %>
7
7
  </p>
@@ -204,6 +204,7 @@ ca-IT:
204
204
  success: El teu compte s'ha eliminat correctament.
205
205
  download_your_data_export:
206
206
  export_expired: L'exportació ha caducat. Intenta generar una nova exportació.
207
+ export_not_found: L'exportació a la qual has accedit no existeix o no tens accés o permisos per descarregar-la
207
208
  file_no_exists: L'arxiu no existeix
208
209
  notice: La descàrrega de les teves dades està en curs. Rebràs un correu electrònic quan estigui completa.
209
210
  email_change:
@@ -1292,6 +1293,7 @@ ca-IT:
1292
1293
  create_with_space: "%{user_name} ha creat %{resource_name} a %{space_name}"
1293
1294
  delete: "%{user_name} ha eliminat %{resource_name}"
1294
1295
  delete_with_space: "%{user_name} ha eliminat %{resource_name} en %{space_name}"
1296
+ publish: "%{user_name} ha publicat %{resource_name}"
1295
1297
  publish_with_space: "%{user_name} ha publicat %{resource_name} en %{space_name}"
1296
1298
  unknown_action: "%{user_name} ha realitzat una acció a %{resource_name}"
1297
1299
  unknown_action_with_space: "%{user_name} ha realitzat una acció a %{resource_name} en %{space_name}"
@@ -2339,8 +2341,8 @@ ca-IT:
2339
2341
  title: Configuració de la participant
2340
2342
  user_groups: Grups
2341
2343
  locale:
2342
- name: Català
2343
- name_with_error: Català (error!)
2344
+ name: Alguerés
2345
+ name_with_error: Alguerés (error!)
2344
2346
  password_validator:
2345
2347
  denied: no és vàlid
2346
2348
  domain_included_in_password: és massa semblant a aquest nom de domini
@@ -204,6 +204,7 @@ ca:
204
204
  success: El teu compte s'ha eliminat correctament.
205
205
  download_your_data_export:
206
206
  export_expired: L'exportació ha caducat. Intenta generar una nova exportació.
207
+ export_not_found: L'exportació a la qual has accedit no existeix o no tens accés o permisos per descarregar-la
207
208
  file_no_exists: L'arxiu no existeix
208
209
  notice: La descàrrega de les teves dades està en curs. Rebràs un correu electrònic quan estigui completa.
209
210
  email_change:
@@ -1292,6 +1293,7 @@ ca:
1292
1293
  create_with_space: "%{user_name} ha creat %{resource_name} a %{space_name}"
1293
1294
  delete: "%{user_name} ha eliminat %{resource_name}"
1294
1295
  delete_with_space: "%{user_name} ha eliminat %{resource_name} en %{space_name}"
1296
+ publish: "%{user_name} ha publicat %{resource_name}"
1295
1297
  publish_with_space: "%{user_name} ha publicat %{resource_name} en %{space_name}"
1296
1298
  unknown_action: "%{user_name} ha realitzat una acció a %{resource_name}"
1297
1299
  unknown_action_with_space: "%{user_name} ha realitzat una acció a %{resource_name} en %{space_name}"
@@ -684,7 +684,7 @@ de:
684
684
  newsletter_title: Kontakterlaubnis
685
685
  sign_up: Konto erstellen
686
686
  subtitle: Erstellen Sie ein Konto, um auf der Plattform teilzunehmen.
687
- terms: die Nutzungsbedingungen
687
+ terms: den Nutzungsbedingungen
688
688
  tos_agreement: Mit der Anmeldung stimmen Sie %{link} zu.
689
689
  tos_title: Nutzungsbedingungen
690
690
  username_help: Öffentlich sichtbarer Name, der in Ihren Beiträgen angezeigt wird. Um Anonymität zu gewährleisten, kann es sich um einen beliebigen Namen handeln.
@@ -204,6 +204,7 @@ en:
204
204
  success: Your account was successfully deleted.
205
205
  download_your_data_export:
206
206
  export_expired: The export has expired. Try to generate a new export.
207
+ export_not_found: The export you have accessed does not exist, or you do not have access to download it
207
208
  file_no_exists: File does not exist
208
209
  notice: The download of your data is currently in progress. You will receive an email when it is complete.
209
210
  email_change:
@@ -1299,6 +1300,7 @@ en:
1299
1300
  create_with_space: "%{user_name} created %{resource_name} in %{space_name}"
1300
1301
  delete: "%{user_name} deleted %{resource_name}"
1301
1302
  delete_with_space: "%{user_name} deleted %{resource_name} in %{space_name}"
1303
+ publish: "%{user_name} published %{resource_name}"
1302
1304
  publish_with_space: "%{user_name} published %{resource_name} in %{space_name}"
1303
1305
  unknown_action: "%{user_name} performed some action on %{resource_name}"
1304
1306
  unknown_action_with_space: "%{user_name} performed some action on %{resource_name} in %{space_name}"
@@ -204,6 +204,7 @@ es-MX:
204
204
  success: Tu cuenta se ha eliminado correctamente.
205
205
  download_your_data_export:
206
206
  export_expired: La exportación ha caducado. Intenta generar una nueva exportación.
207
+ export_not_found: La exportación a la que has accedido no existe o no tienes acceso o permisos para descargarla
207
208
  file_no_exists: El archivo no existe
208
209
  notice: La descarga de tus datos está en curso. Recibirás un correo electrónico cuando se complete.
209
210
  email_change:
@@ -1295,6 +1296,7 @@ es-MX:
1295
1296
  create_with_space: "%{user_name} creó %{resource_name} en %{space_name}"
1296
1297
  delete: "%{user_name} eliminó %{resource_name}"
1297
1298
  delete_with_space: "%{user_name} eliminó %{resource_name} en %{space_name}"
1299
+ publish: "%{user_name} publicó %{resource_name}"
1298
1300
  publish_with_space: "%{user_name} ha publicado %{resource_name} en %{space_name}"
1299
1301
  unknown_action: "%{user_name} realizó una acción en %{resource_name}"
1300
1302
  unknown_action_with_space: "%{user_name} realizó una acción en %{resource_name} en %{space_name}"
@@ -204,6 +204,7 @@ es-PY:
204
204
  success: Tu cuenta se ha eliminado correctamente.
205
205
  download_your_data_export:
206
206
  export_expired: La exportación ha caducado. Intenta generar una nueva exportación.
207
+ export_not_found: La exportación a la que has accedido no existe o no tienes acceso o permisos para descargarla
207
208
  file_no_exists: El archivo no existe
208
209
  notice: La descarga de tus datos está en curso. Recibirás un correo electrónico cuando se complete.
209
210
  email_change:
@@ -1295,6 +1296,7 @@ es-PY:
1295
1296
  create_with_space: "%{user_name} creó %{resource_name} en %{space_name}"
1296
1297
  delete: "%{user_name} eliminó %{resource_name}"
1297
1298
  delete_with_space: "%{user_name} eliminó %{resource_name} en %{space_name}"
1299
+ publish: "%{user_name} publicó %{resource_name}"
1298
1300
  publish_with_space: "%{user_name} ha publicado %{resource_name} en %{space_name}"
1299
1301
  unknown_action: "%{user_name} realizó una acción en %{resource_name}"
1300
1302
  unknown_action_with_space: "%{user_name} realizó una acción en %{resource_name} en %{space_name}"
@@ -204,6 +204,7 @@ es:
204
204
  success: Tu cuenta se ha eliminado correctamente.
205
205
  download_your_data_export:
206
206
  export_expired: La exportación ha caducado. Intenta generar una nueva exportación.
207
+ export_not_found: La exportación a la que has accedido no existe o no tienes acceso o permisos para descargarla
207
208
  file_no_exists: El archivo no existe
208
209
  notice: La descarga de tus datos está en curso. Recibirás un correo electrónico cuando se complete.
209
210
  email_change:
@@ -1292,6 +1293,7 @@ es:
1292
1293
  create_with_space: "%{user_name} creó %{resource_name} en %{space_name}"
1293
1294
  delete: "%{user_name} eliminó %{resource_name}"
1294
1295
  delete_with_space: "%{user_name} eliminó %{resource_name} en %{space_name}"
1296
+ publish: "%{user_name} publicó %{resource_name}"
1295
1297
  publish_with_space: "%{user_name} ha publicado %{resource_name} en %{space_name}"
1296
1298
  unknown_action: "%{user_name} realizó una acción en %{resource_name}"
1297
1299
  unknown_action_with_space: "%{user_name} realizó una acción en %{resource_name} en %{space_name}"
@@ -204,6 +204,7 @@ eu:
204
204
  success: Zure kontua ezabatu egin da.
205
205
  download_your_data_export:
206
206
  export_expired: Esportazioa amaitu da. Saiatu beste esportazio bat sortzen.
207
+ export_not_found: Sartu zaren esportazioa ez da existitzen, edo ez duzu deskargatzeko aukerarik
207
208
  file_no_exists: Fitxategia ez dago
208
209
  notice: Une honetan zure datuak deskargatzen ari dira. Mezu elektroniko bat jasoko duzu amaitutakoan.
209
210
  email_change:
@@ -420,7 +421,7 @@ eu:
420
421
  heading: Aldaketa berrikustea
421
422
  send: Onartu aldaketa
422
423
  update_draft:
423
- error: Arazoa egon da zuzenketa-zirriborroa eguneratzean.
424
+ error: Arazo bat egon da zuzenketa-zirriborroa eguneratzean.
424
425
  success: Zuzenketa-zirriborroa zuzen eguneratu da.
425
426
  withdraw:
426
427
  error: Arazo bat izan da zuzenketa kentzean.
@@ -669,7 +670,7 @@ eu:
669
670
  nickname_help: Zure ezizena %{organization}-an. Letrak, zenbakiak, '-' eta '_' soilik eduki ditzake.
670
671
  sign_up: Mesedez, osatu zure profila
671
672
  subtitle: Mesedez, bete hurrengo formularioa kontua sortzen amaitzeko
672
- username_help: Zure mezuetan agertuko den izen publikoa. Anonimatua bermatze aldera, edozein izen izan daiteke.
673
+ username_help: Zure mezuetan agertzen den izen publikoa. Anonimotasuna bermatzeko helburuarekin, edozein izen izan daiteke.
673
674
  new_tos_fields:
674
675
  sign_up: Sortu kontu bat
675
676
  sign_up_title: Zure kontua sortzen amaitu
@@ -686,7 +687,7 @@ eu:
686
687
  terms: zerbitzuaren baldintzak
687
688
  tos_agreement: 'Erregistratzean, hau onartzen duzu: %{link}.'
688
689
  tos_title: Zerbitzuaren baldintzak
689
- username_help: Zure mezuetan agertuko den izen publikoa. Anonimatua bermatze aldera, edozein izen izan daiteke.
690
+ username_help: Zure mezuetan agertzen den izen publikoa. Anonimotasuna bermatzeko helburuarekin, edozein izen izan daiteke.
690
691
  sessions:
691
692
  new:
692
693
  are_you_new?: Oraindik erregistratu gabe?
@@ -826,7 +827,7 @@ eu:
826
827
  reset_password_sent_at: Zein datatan eta zein ordutan bidali zen pasahitza berriro
827
828
  roles: Parte-hartzaile honek duen rola, baldin badute
828
829
  sign_in_count: Zenbat aldiz hasi duen saioa parte-hartzaile honek
829
- type: Parte-hartzaile honek zer mota duen
830
+ type: Erabiltzaile honek dituen aukerak
830
831
  unconfirmed_email: Parte-hartzaile honek oraindik baieztatu ez duen helbide elektronikoa
831
832
  updated_at: Zein datatan eta zein ordutan eguneratu zen parte-hartzaile hau azken aldiz
832
833
  show:
@@ -925,12 +926,12 @@ eu:
925
926
  affected_user:
926
927
  email_intro: '%{amendable_title} k zuzenketa ukatu egin du. Orrialde honetan ikus dezakezu:'
927
928
  email_outro: 'Jakinarazpen hau jaso duzu honen egilea zarelako: %{amendable_title}.'
928
- email_subject: Aldaketa %{amendable_title} %{emendation_author_nickname} k ukatua
929
+ email_subject: Aldaketa %{amendable_title} %{emendation_author_nickname} egileak ukatua
929
930
  notification_title: <a href="%{emendation_author_path}">%{emendation_author_nickname}</a> k egindako <a href="%{emendation_path}">zuzenketa <a href="%{amendable_path}">%{amendable_title}</a> k ukatu du.
930
931
  follower:
931
932
  email_intro: 'Aldaketa ukatu egin da %{amendable_title}. Orrialde honetatik ikus dezakezu:'
932
933
  email_outro: Jakinarazpen hau jaso duzu %{amendable_title} jarraitzen duzulako. Aurreko estekan jakinarazpenak jasotzeari utzi ahal diozu.
933
- email_subject: '%{emendation_author_nickname} k baztertu du %{amendable_title} aldaketa'
934
+ email_subject: '%{emendation_author_nickname} egileak baztertu du %{amendable_title} aldaketa'
934
935
  notification_title: <a href="%{emendation_author_path}">%{emendation_author_nickname}</a> k sortutako <a href="%{emendation_path}">zuzenketa </a> <a href="%{amendable_path}">%{amendable_title}</a> k ukatu du.
935
936
  emendation_promoted:
936
937
  follower:
@@ -1148,7 +1149,7 @@ eu:
1148
1149
  dropzone: Bota fitxategiak hona edo egin klik igotzeko
1149
1150
  explanation: Gida honetarako %{attribute}
1150
1151
  gamification:
1151
- all_badges_link: Ikusi eskuragarri dauden txapak.
1152
+ all_badges_link: Ikusi eskuragarri dauden bereizgarri guztiak.
1152
1153
  badges:
1153
1154
  followers:
1154
1155
  conditions:
@@ -1293,6 +1294,7 @@ eu:
1293
1294
  create_with_space: "%{user_name} sortu %{resource_name} en %{space_name}"
1294
1295
  delete: "%{user_name} parte-hartzaileak %{resource_name} ezabatu du"
1295
1296
  delete_with_space: "%{user_name} parte-hartzaileak %{resource_name} ezabatu du %{space_name} espazioan"
1297
+ publish: "%{user_name} parte-hartzaileak %{resource_name} argitaratu du"
1296
1298
  publish_with_space: "%{user_name} parte-hartzaileak %{resource_name} argitaratu du %{space_name} espazioan"
1297
1299
  unknown_action: "%{user_name} parte-hartzaileak ekintza batzuk egin ditu %{resource_name} ean"
1298
1300
  unknown_action_with_space: "%{user_name} parte-hartzaileak ekintza batzuk egin ditu %{resource_name} ean %{space_name} espazioan"
@@ -1581,7 +1583,7 @@ eu:
1581
1583
  name: Taxonomia honen izena
1582
1584
  parent_id: Taxonomia nagusi honen identifikatzaile bakarrak (baldin badago)
1583
1585
  part_of: Taxonomia hau beste taxonomia baten parte den jakiteko erabiltzen da
1584
- taxonomizations_count: Taxonomia hau erabiltzen duten baliabideen zenbaketa
1586
+ taxonomizations_count: Taxonomia hori erabiltzen duten baliabideen zenbaketa
1585
1587
  updated_at: Zein datatan eguneratu zen taxonomia hau azkenekoz
1586
1588
  weight: Zein ordenatan erakusten den taxonomia hau
1587
1589
  user_groups:
@@ -2029,7 +2031,7 @@ eu:
2029
2031
  reset_password_instructions:
2030
2032
  action: Nire pasahitza aldatu
2031
2033
  greeting: Kaixo %{recipient}!
2032
- instruction: Norbaitek zure pasahitza aldatzeko esteka eskatu du, eta beheko estekan egin dezakezu.
2034
+ instruction: Norbaitek esteka bat eskatu du zure pasahitza aldatzeko, eta beheko estekaren bidez egin dezakezu.
2033
2035
  instruction_2: Ez baduzu hori eskatu, ez egin kasurik mezu honi.
2034
2036
  instruction_3: Zure pasahitza ez da aldatuko aurreko estekara sartu eta beste bat sortu arte.
2035
2037
  subject: Berrezarri pasahitzaren argibideak
@@ -2198,7 +2200,7 @@ eu:
2198
2200
  long_words: luzeegiak diren hitzak ditu (35 karaktere baino gehiago)
2199
2201
  must_start_with_caps: letra larriz hasi behartu
2200
2202
  nesting_too_deep: ezin da egon azpikategoria batean
2201
- not_found: ezin izan da aurkitu. Lehenago konturik sortu duzu?
2203
+ not_found: ezin izan da aurkitu. Aurretik kontu bat sortu duzu?
2202
2204
  not_locked: ez dago itxita
2203
2205
  not_saved:
2204
2206
  one: 'Errore bat izan da zure eskaera prozesatzean:'
@@ -1294,6 +1294,7 @@ fi-pl:
1294
1294
  create_with_space: "%{user_name} loi %{resource_name} tilassa %{space_name}"
1295
1295
  delete: "%{user_name} poisti %{resource_name}"
1296
1296
  delete_with_space: "%{user_name} poisti %{resource_name} tilassa %{space_name}"
1297
+ publish: "%{user_name} julkaisi kohteen %{resource_name}"
1297
1298
  publish_with_space: "%{user_name} julkaisi %{resource_name} osallistumistilassa %{space_name}"
1298
1299
  unknown_action: "%{user_name} suoritti toimenpiteen koskien kohdetta %{resource_name}"
1299
1300
  unknown_action_with_space: "%{user_name} suoritti toimenpiteen koskien kohdetta %{resource_name} tilassa %{space_name}"
@@ -1294,6 +1294,7 @@ fi:
1294
1294
  create_with_space: "%{user_name} loi %{resource_name} osallistumistilassa %{space_name}"
1295
1295
  delete: "%{user_name} poisti %{resource_name}"
1296
1296
  delete_with_space: "%{user_name} poisti %{resource_name} osallistumistilassa %{space_name}"
1297
+ publish: "%{user_name} julkaisi kohteen %{resource_name}"
1297
1298
  publish_with_space: "%{user_name} julkaisi %{resource_name} osallistumistilassa %{space_name}"
1298
1299
  unknown_action: "%{user_name} suoritti toimenpiteen koskien kohdetta %{resource_name}"
1299
1300
  unknown_action_with_space: "%{user_name} suoritti toimenpiteen koskien kohdetta %{resource_name} osallistumistilassa %{space_name}"
@@ -193,6 +193,7 @@ fr-CA:
193
193
  success: Votre compte a été supprimé avec succès.
194
194
  download_your_data_export:
195
195
  export_expired: L'export a expiré. Essayez de générer un nouvel export.
196
+ export_not_found: L'export auquel vous avez tenté d'accéder n'existe pas, ou vous n'avez pas l'accès pour le télécharger
196
197
  file_no_exists: Le fichier n'existe pas
197
198
  notice: Le téléchargement de vos données est en cours. Vous recevrez un email lorsque celui-ci sera terminé.
198
199
  email_change:
@@ -1180,6 +1181,7 @@ fr-CA:
1180
1181
  create_with_space: "%{user_name} a créé %{resource_name} dans %{space_name}"
1181
1182
  delete: "%{user_name} a supprimé %{resource_name}"
1182
1183
  delete_with_space: "%{user_name} a supprimé %{resource_name} dans %{space_name}"
1184
+ publish: "%{user_name} a publié %{resource_name}"
1183
1185
  publish_with_space: "%{user_name} a publié %{resource_name} dans %{space_name}"
1184
1186
  unknown_action: "%{user_name} a effectué une action sur %{resource_name}"
1185
1187
  unknown_action_with_space: "%{user_name} a effectué une action sur %{resource_name} dans %{space_name}"
@@ -1212,7 +1214,7 @@ fr-CA:
1212
1214
  members:
1213
1215
  no_members: Ce groupe d'utilisateurs n'a encore aucun membre.
1214
1216
  menu:
1215
- help: Aide
1217
+ help: Aidez-moi
1216
1218
  home: Accueil
1217
1219
  messaging:
1218
1220
  conversation_mailer:
@@ -193,6 +193,7 @@ fr:
193
193
  success: Votre compte a été supprimé avec succès.
194
194
  download_your_data_export:
195
195
  export_expired: L'export a expiré. Essayez de générer un nouvel export.
196
+ export_not_found: L'export auquel vous avez tenté d'accéder n'existe pas, ou vous n'avez pas l'accès pour le télécharger
196
197
  file_no_exists: Le fichier n'existe pas
197
198
  notice: Le téléchargement de vos données est en cours. Vous recevrez un email lorsque celui-ci sera terminé.
198
199
  email_change:
@@ -1180,6 +1181,7 @@ fr:
1180
1181
  create_with_space: "%{user_name} a créé %{resource_name} dans %{space_name}"
1181
1182
  delete: "%{user_name} a supprimé %{resource_name}"
1182
1183
  delete_with_space: "%{user_name} a supprimé %{resource_name} dans %{space_name}"
1184
+ publish: "%{user_name} a publié %{resource_name}"
1183
1185
  publish_with_space: "%{user_name} a publié %{resource_name} dans %{space_name}"
1184
1186
  unknown_action: "%{user_name} a effectué une action sur %{resource_name}"
1185
1187
  unknown_action_with_space: "%{user_name} a effectué une action sur %{resource_name} dans %{space_name}"
@@ -1212,7 +1214,7 @@ fr:
1212
1214
  members:
1213
1215
  no_members: Ce groupe d'utilisateurs n'a encore aucun membre.
1214
1216
  menu:
1215
- help: Aide
1217
+ help: Aidez-moi
1216
1218
  home: Accueil
1217
1219
  messaging:
1218
1220
  conversation_mailer:
@@ -467,6 +467,8 @@ it:
467
467
  description: Descrisione
468
468
  footer_sub_hero:
469
469
  name: Banner di sub eroe di piè di pagina
470
+ global_menu:
471
+ name: Menu globale
470
472
  hero_settings_form:
471
473
  background_image: Immagine di sfondo
472
474
  welcome_text: Testo di benvenuto
@@ -190,6 +190,7 @@ ja:
190
190
  success: アカウントが正常に削除されました。
191
191
  download_your_data_export:
192
192
  export_expired: エクスポートの有効期限が切れています。新しいエクスポートを生成してください。
193
+ export_not_found: アクセスしたエクスポートが存在しないか、ダウンロードする権限がありません
193
194
  file_no_exists: ファイルが存在しません
194
195
  notice: データのダウンロードは現在進行中です。完了した際にはメールでお知らせします。
195
196
  email_change:
@@ -1275,6 +1276,7 @@ ja:
1275
1276
  create_with_space: "%{user_name} が %{resource_name} に %{space_name} を作成しました"
1276
1277
  delete: "%{user_name} が %{resource_name} を削除しました"
1277
1278
  delete_with_space: "%{user_name} が %{resource_name} で %{space_name} を削除しました"
1279
+ publish: "%{user_name} が %{resource_name}を公開しました"
1278
1280
  publish_with_space: "%{user_name} が %{space_name} の %{resource_name} を公開しました"
1279
1281
  unknown_action: "%{user_name} が %{resource_name} にいくつかのアクションを実行しました"
1280
1282
  unknown_action_with_space: "%{user_name} が %{resource_name} で %{space_name} にアクションを実行しました"
@@ -417,7 +417,6 @@ ru:
417
417
  managed_users:
418
418
  expired_session: Текущий сеанс выступления в роли участника истек.
419
419
  menu:
420
- help: Справка
421
420
  home: Главная
422
421
  messaging:
423
422
  conversation_mailer:
@@ -16,7 +16,6 @@ sl:
16
16
  linked_classes:
17
17
  meeting: Sestanki
18
18
  menu:
19
- help: Pomoč
20
19
  home: Domov
21
20
  messaging:
22
21
  conversations:
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ # This migration comes from decidim (originally 20250819110800)
4
+ class ConvertPrivateExportsIdToUuid < ActiveRecord::Migration[7.0]
5
+ def up
6
+ create_table :decidim_private_exports_new, force: :cascade do |t|
7
+ t.uuid :uuid, null: false
8
+ t.string :export_type, null: false
9
+ t.string :attached_to_type
10
+ t.integer :attached_to_id
11
+ t.string :file
12
+ t.string :content_type, null: false
13
+ t.string :file_size, null: false
14
+ t.datetime :expires_at
15
+ t.jsonb :metadata, default: {}
16
+ t.timestamps
17
+
18
+ t.index [:uuid], name: "index_decidim_private_exports_on_uuid", unique: true
19
+ end
20
+ # Copy data from old table to new table
21
+ execute <<-SQL.squish
22
+ INSERT INTO decidim_private_exports_new (uuid, export_type, attached_to_type, attached_to_id, file, content_type, file_size, expires_at, metadata, created_at, updated_at)
23
+ SELECT id, export_type, attached_to_type, attached_to_id, file, content_type, file_size, NOW(), metadata, created_at, updated_at
24
+ FROM decidim_private_exports
25
+ SQL
26
+
27
+ # Drop old table and rename new table
28
+ drop_table :decidim_private_exports
29
+ rename_table :decidim_private_exports_new, :decidim_private_exports
30
+ end
31
+
32
+ def down
33
+ # Similar approach for rollback
34
+ create_table :decidim_private_exports_new, id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
35
+ t.string :export_type, null: false
36
+ t.string :attached_to_type
37
+ t.integer :attached_to_id
38
+ t.string :file
39
+ t.string :content_type, null: false
40
+ t.string :file_size, null: false
41
+ t.datetime :expires_at
42
+ t.jsonb :metadata, default: {}
43
+ t.timestamps
44
+ end
45
+
46
+ execute <<-SQL.squish
47
+ INSERT INTO decidim_private_exports_new (id, export_type, attached_to_type, attached_to_id, file, content_type, file_size, expires_at, metadata, created_at, updated_at)
48
+ SELECT uuid, export_type, attached_to_type, attached_to_id, file, content_type, file_size, expires_at, metadata, created_at, updated_at
49
+ FROM decidim_private_exports
50
+ SQL
51
+
52
+ drop_table :decidim_private_exports
53
+ rename_table :decidim_private_exports_new, :decidim_private_exports
54
+ end
55
+ end
@@ -459,6 +459,7 @@ module Decidim
459
459
  end
460
460
 
461
461
  initializer "decidim_core.add_cells_view_paths" do
462
+ Cell::ViewModel.view_paths << Rails.root.join("app/views") # for partials
462
463
  Cell::ViewModel.view_paths << File.expand_path("#{Decidim::Core::Engine.root}/app/cells")
463
464
  Cell::ViewModel.view_paths << File.expand_path("#{Decidim::Core::Engine.root}/app/cells/amendable")
464
465
  Cell::ViewModel.view_paths << File.expand_path("#{Decidim::Core::Engine.root}/app/views") # for partials
@@ -939,9 +939,14 @@ FactoryBot.define do
939
939
  end
940
940
  expires_at { 1.week.from_now }
941
941
  attached_to { create(:user, organization:, skip_injection:) }
942
- export_type { "dummy" }
942
+ export_type { "download_your_data" }
943
943
  content_type { "application/zip" }
944
- file_size { 10.kilobytes }
944
+ file_size { 208.bytes }
945
+ file { Decidim::Dev.test_file("dummy-export.zip", "application/zip") }
946
+
947
+ trait :expired do
948
+ expires_at { 1.week.ago }
949
+ end
945
950
  end
946
951
 
947
952
  factory :searchable_resource, class: "Decidim::SearchableResource" do
@@ -892,6 +892,30 @@ shared_examples "comments" do
892
892
  expect(page.find("#comment-#{parent.id}-replies").text).to be_blank
893
893
  end
894
894
  end
895
+
896
+ context "when admin moderates the comment" do
897
+ let!(:user) { create(:user, :admin, :confirmed, organization:) }
898
+
899
+ before do
900
+ switch_to_host(organization.host)
901
+ login_as user, scope: :user
902
+ visit resource_path
903
+ end
904
+
905
+ it "hides the comment" do
906
+ within "#comment_#{comments.first.id}" do
907
+ page.find("[id^='dropdown-trigger']").click
908
+ click_on "Report"
909
+ end
910
+
911
+ within "#flagModalComment#{comments.first.id}" do
912
+ check "Hide this content"
913
+ click_on "Hide"
914
+ end
915
+
916
+ expect(page).to have_content("This resource has been hidden.")
917
+ end
918
+ end
895
919
  end
896
920
 
897
921
  describe "arguable option" do
@@ -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.3"
7
+ "0.30.4"
8
8
  end
9
9
  end
10
10
  end
@@ -64,7 +64,11 @@ module Decidim
64
64
  end
65
65
 
66
66
  def configuration_file_path
67
- @configuration_file_path ||= File.join(app_path, "tmp/webpacker_runtime.yml")
67
+ @configuration_file_path ||= if defined?(Rails) && Rails.env.test?
68
+ File.join(app_path, "tmp/webpacker_runtime#{ENV.fetch("TEST_ENV_NUMBER", "")}.yml")
69
+ else
70
+ File.join(app_path, "tmp/webpacker_runtime.yml")
71
+ end
68
72
  end
69
73
 
70
74
  def original_configuration_file_path
@@ -148,6 +148,17 @@ namespace :decidim do
148
148
  invalid_private_exports.delete_all
149
149
  end
150
150
 
151
+ desc "Remove invalid exports from ActiveStorage"
152
+ task remove_private_exports_attachments: :environment do
153
+ invalid = ActiveStorage::Attachment.where(record_type: "Decidim::PrivateExport", record_id: 0)
154
+ logger.info("=== Removing #{invalid.length} invalid PrivateExports attachments")
155
+ invalid.each(&:purge_later)
156
+
157
+ expired = Decidim::PrivateExport.where(expires_at: ..Time.zone.now).collect(&:file).compact_blank
158
+ logger.info("=== Removing #{expired.length} expired attachments from PrivateExports")
159
+ expired.each(&:purge_later) if expired.any?
160
+ end
161
+
151
162
  def logger
152
163
  @logger ||= Logger.new($stdout)
153
164
  end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ namespace :decidim do
4
+ namespace :upgrade do
5
+ desc "Fixes the visibility of menu_hidden action logs"
6
+ task :fix_action_log => :environment do
7
+ logger.info("Fixing action log menu_hidden actions...")
8
+
9
+ count = Decidim::ActionLog.where(action: "menu_hidden").where.not(visibility: "admin-only").count
10
+ logger.info "Found #{count} action logs to update."
11
+ if count.positive?
12
+ # ActionLog is a read-only model, so we need to use raw SQL to update the records
13
+ ActiveRecord::Base.connection.execute("UPDATE decidim_action_logs SET visibility = 'admin-only' WHERE action = 'menu_hidden'")
14
+ if Decidim::ActionLog.where(action: "menu_hidden").where.not(visibility: "admin-only").count.zero?
15
+ logger.info("Successfully updated #{count} action logs.")
16
+ else
17
+ logger.error("Failed to update all action logs. Please check the database.")
18
+ end
19
+ end
20
+ end
21
+
22
+ private
23
+
24
+ def logger
25
+ @logger ||= Logger.new($stdout)
26
+ end
27
+ end
28
+ end
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.3
4
+ version: 0.30.4
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-10-28 00:00:00.000000000 Z
13
+ date: 2025-11-20 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.3
783
+ version: 0.30.4
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.3
790
+ version: 0.30.4
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.3
797
+ version: 0.30.4
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.3
804
+ version: 0.30.4
805
805
  description: Adds core features so other engines can hook into the framework.
806
806
  email:
807
807
  - josepjaume@gmail.com
@@ -2511,6 +2511,7 @@ files:
2511
2511
  - db/migrate/20241111104357_add_names_and_space_boolean_to_taxonomy_filters.rb
2512
2512
  - db/migrate/20241127093708_add_taxonomy_to_metrics.rb
2513
2513
  - db/migrate/20241204121445_add_participatory_space_manifests_from_taxonomy_filters.rb
2514
+ - db/migrate/20250819110800_convert_private_exports_id_to_uuid.rb
2514
2515
  - db/seeds.rb
2515
2516
  - db/seeds/Exampledocument.pdf
2516
2517
  - db/seeds/avatars/001.jpg
@@ -3087,6 +3088,7 @@ files:
3087
3088
  - lib/tasks/upgrade/decidim_attachments.rake
3088
3089
  - lib/tasks/upgrade/decidim_content_blocks_tasks.rake
3089
3090
  - lib/tasks/upgrade/decidim_deduplicate_endorsements.rake
3091
+ - lib/tasks/upgrade/decidim_fix_action_log.rake
3090
3092
  - lib/tasks/upgrade/decidim_fix_nickname_uniqueness.rake
3091
3093
  - lib/tasks/upgrade/decidim_fix_short_url_resolver.rake
3092
3094
  - lib/tasks/upgrade/decidim_migrate_wysiwyg_content.rake