decidim-core 0.31.0.rc1 → 0.31.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 (79) hide show
  1. checksums.yaml +4 -4
  2. data/app/cells/decidim/activity_cell.rb +6 -0
  3. data/app/cells/decidim/author/avatar.erb +1 -7
  4. data/app/cells/decidim/author/badge.erb +6 -0
  5. data/app/cells/decidim/author/name.erb +1 -5
  6. data/app/cells/decidim/author/show.erb +47 -15
  7. data/app/cells/decidim/author_cell.rb +10 -0
  8. data/app/cells/decidim/profile/avatar.erb +0 -2
  9. data/app/cells/decidim/profile/badge.erb +3 -3
  10. data/app/cells/decidim/profile/details.erb +2 -1
  11. data/app/cells/decidim/user_activity_cell.rb +6 -1
  12. data/app/controllers/decidim/download_your_data_controller.rb +5 -2
  13. data/app/helpers/decidim/map_helper.rb +1 -1
  14. data/app/helpers/decidim/menu_helper.rb +8 -2
  15. data/app/mailers/decidim/user_group_mailer.rb +21 -0
  16. data/app/models/decidim/private_export.rb +4 -0
  17. data/app/models/decidim/user.rb +2 -2
  18. data/app/packs/src/decidim/controllers/dropdown/controller.js +2 -2
  19. data/app/packs/src/decidim/controllers/editor/controller.js +4 -1
  20. data/app/packs/src/decidim/controllers/form_filter/controller.js +6 -0
  21. data/app/packs/src/decidim/datepicker/generate_datepicker.js +6 -0
  22. data/app/packs/src/decidim/datepicker/generate_timepicker.js +9 -0
  23. data/app/packs/src/decidim/index.js +10 -5
  24. data/app/packs/src/decidim/map/controller/markers.js +3 -1
  25. data/app/packs/src/decidim/refactor/moved/check_boxes_tree.js +1 -0
  26. data/app/packs/stylesheets/decidim/_accordion.scss +4 -4
  27. data/app/packs/stylesheets/decidim/_author.scss +15 -1
  28. data/app/packs/stylesheets/decidim/_cards.scss +5 -1
  29. data/app/packs/stylesheets/decidim/_dropdown.scss +22 -5
  30. data/app/packs/stylesheets/decidim/_filters.scss +1 -1
  31. data/app/packs/stylesheets/decidim/_footer.scss +5 -0
  32. data/app/packs/stylesheets/decidim/_profile.scss +6 -6
  33. data/app/packs/stylesheets/decidim/editor.scss +3 -1
  34. data/app/services/decidim/download_your_data_exporter.rb +15 -4
  35. data/app/services/decidim/open_data_exporter.rb +2 -1
  36. data/app/validators/etiquette_validator.rb +2 -2
  37. data/app/validators/password_validator.rb +3 -1
  38. data/app/views/decidim/application/_document.html.erb +2 -2
  39. data/app/views/decidim/download_your_data/_export.html.erb +1 -1
  40. data/app/views/decidim/export_mailer/download_your_data_export.html.erb +1 -1
  41. data/app/views/decidim/export_mailer/export.html.erb +1 -1
  42. data/app/views/decidim/shared/_filters.html.erb +1 -1
  43. data/app/views/decidim/user_group_mailer/notify_deprecation_to_member.html.erb +4 -1
  44. data/app/views/decidim/user_group_mailer/notify_deprecation_to_owner.html.erb +1 -4
  45. data/app/views/decidim/user_group_mailer/notify_user_group_patched.html.erb +21 -0
  46. data/app/views/layouts/decidim/_application.html.erb +1 -1
  47. data/config/locales/ca-IT.yml +30 -18
  48. data/config/locales/ca.yml +28 -16
  49. data/config/locales/cs.yml +6 -7
  50. data/config/locales/de.yml +2 -11
  51. data/config/locales/en.yml +22 -10
  52. data/config/locales/es-MX.yml +20 -8
  53. data/config/locales/es-PY.yml +20 -8
  54. data/config/locales/es.yml +20 -8
  55. data/config/locales/eu.yml +60 -48
  56. data/config/locales/fi-plain.yml +20 -9
  57. data/config/locales/fi.yml +20 -9
  58. data/config/locales/fr-CA.yml +22 -10
  59. data/config/locales/fr.yml +22 -10
  60. data/config/locales/it.yml +2 -0
  61. data/config/locales/ja.yml +22 -10
  62. data/config/locales/ro-RO.yml +1 -1
  63. data/config/locales/ru.yml +0 -1
  64. data/config/locales/sl.yml +0 -1
  65. data/db/data/20251108232118_add_dummy_migration.rb +11 -0
  66. data/db/migrate/20250217192438_convert_user_groups_into_users.rb +19 -1
  67. data/db/migrate/20250819110800_convert_private_exports_id_to_uuid.rb +55 -0
  68. data/decidim-core.gemspec +1 -0
  69. data/lib/decidim/asset_router/storage.rb +8 -8
  70. data/lib/decidim/core/engine.rb +9 -0
  71. data/lib/decidim/core/test/factories.rb +7 -2
  72. data/lib/decidim/core/test/shared_examples/comments_examples.rb +24 -0
  73. data/lib/decidim/core/version.rb +1 -1
  74. data/lib/decidim/form_builder.rb +1 -1
  75. data/lib/decidim/shakapacker/configuration.rb +5 -1
  76. data/lib/tasks/upgrade/clean.rake +11 -0
  77. data/lib/tasks/upgrade/decidim_fix_action_log.rake +28 -0
  78. data/lib/tasks/upgrade/user_groups_migration.rake +33 -0
  79. metadata +25 -6
@@ -1151,6 +1151,7 @@ fi:
1151
1151
  create_with_space: "%{user_name} loi %{resource_name} osallistumistilassa %{space_name}"
1152
1152
  delete: "%{user_name} poisti %{resource_name}"
1153
1153
  delete_with_space: "%{user_name} poisti %{resource_name} osallistumistilassa %{space_name}"
1154
+ publish: "%{user_name} julkaisi kohteen %{resource_name}"
1154
1155
  publish_with_space: "%{user_name} julkaisi %{resource_name} osallistumistilassa %{space_name}"
1155
1156
  unknown_action: "%{user_name} suoritti toimenpiteen koskien kohdetta %{resource_name}"
1156
1157
  unknown_action_with_space: "%{user_name} suoritti toimenpiteen koskien kohdetta %{resource_name} osallistumistilassa %{space_name}"
@@ -1726,20 +1727,30 @@ fi:
1726
1727
  body_2: Yksinkertaistaaksemme organisaatioiden kokemusta tällä alustalla, käyttäjäryhmät poistetaan alustalta. Käyttäjäryhmäsi profiili on nyt muutettu tavalliseksi osallistujaprofiiliksi.
1727
1728
  greeting: Hei %{name},
1728
1729
  instructions_1: Mikäli sinulla on pääsy kyseiselle sähköpostitilille, tarkasta kyseiseen sähköpostiin saapuneet ohjeet.
1729
- instructions_intro: Olemme lähettäneet ohjeet salasanan asettamiseksi tälle tilillä kyseiseen tiliin liitettyyn sähköpostiosoitteeseen.
1730
+ instructions_2: Mikäli sinulla ei ole pääsyä kyseiselle sähköpostitilille, pyydä kolleegaasi, jolla on pääsy kyseiselle tilille, asettamaan profiilille salasana ja jakamaan se kanssasi.
1731
+ instructions_intro: Ryhmän hallitsija voi kirjautua tälle tilille henkilökohtaisilla tunnuksillaan (sähköpostiosoite ja salasana). Näitä tunnuksia ei tule jakaa kenenkään kanssa. Olemme lähettäneet ohjeet uuden salasanan asettamiseen tälle tunnukselle sähköpostiosoitteeseen %{email}.
1730
1732
  instructions_title: "<strong>Mitä tämä tarkoittaa sinulle?</strong>"
1731
- subject: Tärkeä ilmoitus koskien käyttäjäryhmää, jonka jäsen olet
1733
+ subject: Tärkeä ryhmäprofiilia koskeva päivitys
1732
1734
  notify_deprecation_to_owner:
1733
1735
  body_1: Tämä viesti koskee tärkeää päivitystä käyttäjäryhmät-toiminnossa palvelussa %{organization_name}.
1734
1736
  body_2: Yksinkertaistaaksemme organisaatioiden kokemusta tällä alustalla, käyttäjäryhmät poistetaan alustalta. Käyttäjäryhmäsi <strong>%{name}</strong> profiili on nyt muutettu tavalliseksi osallistujaprofiiliksi.
1735
- body_3: Mikäli haluat jatkossa päästä ryhmäkäyttäjäsi tilille, sinun on asetettava salasana kyseiselle käyttäjätilille.
1737
+ body_3: Mikäli haluat jatkaa ryhmäkäyttäjänä toimimista, ryhmän tilille tulee asettaa salasana. Salasanaa ei tule jakaa kenenkään kanssa.
1736
1738
  greeting: Hei %{name},
1737
- instructions_1: 'Paina alla olevaa linkkiä asettaaksesi salasanan kyseiselle tilille:'
1738
- instructions_2: Syötä kyseiselle lomakkeelle tämä sähköpostiosoite, johon tämä viesti lähetettiin ja lähetä pyyntö.
1739
- instructions_3: Tarkasta saapuneet sähköpostiviestit, missä on tarkemmat ohjeet salasanan asettamiseen.
1740
- instructions_title: "<strong>Mitä sinun täytyy tehdä?</strong>"
1741
- set_password: Aloita salasanan asettaminen
1742
- subject: Tärkeä ilmoitus koskien käyttäjäryhmää
1739
+ instructions_1: 'Määritä tilille salasana seuraavan linkin avulla:'
1740
+ instructions_2: 'Älä jaa näitä tunnuksia kenenkään kanssa.'
1741
+ instructions_title: "<strong>Mitä sinun tulee tehdä</strong>"
1742
+ set_password: Määritä salasana
1743
+ subject: Tärkeä ryhmäprofiilia koskeva päivitys
1744
+ notify_user_group_patched:
1745
+ body_1_html: Tämä viesti koskee tärkeää päivitystä käyttäjäryhmät-toiminnossa palvelussa %{organization_name}.
1746
+ body_2_html: Yksinkertaistaaksemme organisaatioiden kokemusta tällä alustalla, käyttäjäryhmät poistetaan alustalta. Käyttäjäryhmäsi <strong>%{name}</strong> profiili on nyt muutettu tavalliseksi osallistujaprofiiliksi.
1747
+ body_3_html: Jatkaaksesi ryhmätilisi käyttöä, sinun tulee asettaa sille sähköpostiosoite ja salasana. Huomioithan, että jokainen ryhmäsi jäsen saa tämän sähköpostiviestin. Mikäli haluat jatkaa tilin käyttöä, yhden ryhmän jäsenen tulee jatkossa hallinnoida tiliä ryhmän sähköpostiosoitteella ja hänen asettamallaan salasanalla.
1748
+ greeting: Hei %{name},
1749
+ instructions_1_html: 'Käytä seuraavia väliaikaisia tunnuksia kirjautuaksesi sisään: <br><br> Sähköpostiosoite: <strong>%{email}</strong> <br> Salasana <strong>%{password}</strong><br><br>'
1750
+ instructions_2_html: Aseta uusi sähköpostiosoite ja salasana.
1751
+ instructions_3_html: Älä jaa näitä tunnuksia kenenkään kanssa. Ainoastaan ryhmän hallinnoija voi jatkossa kirjautua palveluun tällä tilillä.
1752
+ instructions_title_html: "<strong>Mitä sinun täytyy tehdä?</strong>"
1753
+ subject: Tärkeä ryhmäprofiilia koskeva päivitys
1743
1754
  user_report_mailer:
1744
1755
  notify:
1745
1756
  body_1: Käyttäjä %{user} on ilmoitettu käyttäjän %{token} toimesta
@@ -184,6 +184,7 @@ fr-CA:
184
184
  success: Votre compte a été supprimé avec succès.
185
185
  download_your_data_export:
186
186
  export_expired: L'export a expiré. Essayez de générer un nouvel export.
187
+ 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
187
188
  file_no_exists: Le fichier n'existe pas
188
189
  notice: Le téléchargement de vos données est en cours. Vous recevrez un email lorsque celui-ci sera terminé.
189
190
  email_change:
@@ -1024,6 +1025,7 @@ fr-CA:
1024
1025
  create_with_space: "%{user_name} a créé %{resource_name} dans %{space_name}"
1025
1026
  delete: "%{user_name} a supprimé %{resource_name}"
1026
1027
  delete_with_space: "%{user_name} a supprimé %{resource_name} dans %{space_name}"
1028
+ publish: "%{user_name} a publié %{resource_name}"
1027
1029
  publish_with_space: "%{user_name} a publié %{resource_name} dans %{space_name}"
1028
1030
  unknown_action: "%{user_name} a effectué une action sur %{resource_name}"
1029
1031
  unknown_action_with_space: "%{user_name} a effectué une action sur %{resource_name} dans %{space_name}"
@@ -1054,7 +1056,7 @@ fr-CA:
1054
1056
  latlng_text: 'latitude : %{latitude}, longitude : %{longitude}'
1055
1057
  map_service_brand: OpenStreetMap
1056
1058
  menu:
1057
- help: Aide
1059
+ help: Aidez-moi
1058
1060
  home: Accueil
1059
1061
  messaging:
1060
1062
  conversation_mailer:
@@ -1562,20 +1564,30 @@ fr-CA:
1562
1564
  body_2: Dans le cadre de nos efforts pour simplifier l'expérience des organisations, la fonctionnalité "Groupes d'utilisateurs" est dépréciée. Votre profil de groupe d'utilisateurs a maintenant été converti en un profil de simple participant.
1563
1565
  greeting: Cher(ère) %{name},
1564
1566
  instructions_1: Si vous avez accès à ce compte de messagerie, veuillez vérifier votre boîte de réception pour les instructions.
1565
- instructions_intro: Nous avons envoyé des instructions à l'adresse e-mail associée au compte pour définir un nouveau mot de passe pour le profil.
1566
- instructions_title: "<strong>Cce que ça signifie pour vous</strong>"
1567
- subject: Mise à jour importante à propos du groupe d'utilisateurs dont vous êtes membre
1567
+ instructions_2: Sinon, l'un de vos collègues qui a accès devra définir le mot de passe et partager les identifiants de connexion avec vous.
1568
+ instructions_intro: Les membres du groupe partageront désormais l'accès à ce profil en utilisant les identifiants de connexion partagés (email et mot de passe). Nous avons envoyé des instructions à %{email} pour définir un nouveau mot de passe pour le profil.
1569
+ instructions_title: "<strong>Ce que cela signifie pour vous</strong>"
1570
+ subject: Mise à jour importante concernant votre profil de groupe
1568
1571
  notify_deprecation_to_owner:
1569
1572
  body_1: Nous vous contactons pour vous informer d’une mise à jour importante concernant votre profil de groupe sur %{organization_name}.
1570
1573
  body_2: Dans le cadre de nos efforts pour simplifier et améliorer l'expérience des organisations comme la vôtre, nous déprécions la fonctionnalité "Groupes d'utilisateurs". Votre groupe, <strong>%{name}</strong>a été converti en simple compte.
1571
- body_3: Pour continuer à accéder à votre compte, nous avons besoin que vous définissiez un mot de passe.
1574
+ body_3: Pour continuer à accéder à votre compte et partager votre accès, nous avons besoin que vous définissiez un mot de passe. Une fois défini, vous pouvez partager les identifiants de connexion (e-mail et mot de passe) avec n'importe qui.
1572
1575
  greeting: Cher(ère) %{name},
1573
- instructions_1: 'Cliquez sur le lien ci-dessous pour démarrer le processus de définition du mot de passe :'
1574
- instructions_2: Dans le formulaire, entrez l'adresse e-mail à laquelle vous avez reçu ce message et soumettez la demande.
1575
- instructions_3: Consultez votre boîte de réception afin d'obtenir des instructions supplémentaires pour définir votre nouveau mot de passe.
1576
+ instructions_1: 'Cliquez sur le lien ci-dessous pour définir votre mot de passe :'
1577
+ instructions_2: 'Partagez les identifiants de connexion (email: %{email} et le nouveau mot de passe) avec vos collègues.'
1576
1578
  instructions_title: "<strong>Ce que vous devez faire</strong>"
1577
- set_password: Démarrer le processus de définition du mot de passe
1578
- subject: Mise à jour importante à propos du groupe d'utilisateurs
1579
+ set_password: Définissez votre mot de passe
1580
+ subject: Mise à jour importante concernant votre profil de groupe
1581
+ notify_user_group_patched:
1582
+ body_1_html: Nous vous contactons pour vous informer d’une mise à jour importante concernant votre profil de groupe sur %{organization_name}.
1583
+ body_2_html: Dans le cadre de nos efforts pour simplifier et améliorer l'expérience des organisations comme la vôtre, nous déprécions la fonctionnalité "Groupes d'utilisateurs". Votre groupe, <strong>%{name}</strong>a été converti en simple compte.
1584
+ body_3_html: Pour continuer à accéder à votre compte et partager votre accès, nous avons besoin que vous définissiez une nouvelle adresse e-mail et un nouveau mot de passe. Veuillez noter que chaque membre de votre groupe recevra ce courriel. Pour assurer la continuité de l'accès, vous devrez convenir en interne des identifiants partagés (adresse e-mail et mot de passe) que tout le monde utilisera.
1585
+ greeting: Cher(ère) %{name},
1586
+ instructions_1_html: 'Utilisez les identifiants temporaires suivants pour vous connecter : <br><br> Nom d''utilisateur : <strong>%{email}</strong> <br> Mot de passe : <strong>%{password}</strong><br><br>'
1587
+ instructions_2_html: Définir une nouvelle adresse e-mail et un nouveau mot de passe.
1588
+ instructions_3_html: Partagez les identifiants de connexion choisis avec vos collègues pour que l'ensemble du groupe puisse continuer à accéder au compte.
1589
+ instructions_title_html: "<strong>Ce que vous devez faire</strong>"
1590
+ subject: Mise à jour importante concernant votre profil de groupe
1579
1591
  user_report_mailer:
1580
1592
  notify:
1581
1593
  body_1: L'utilisateur %{user} a été signalé par %{token}
@@ -184,6 +184,7 @@ fr:
184
184
  success: Votre compte a été supprimé avec succès.
185
185
  download_your_data_export:
186
186
  export_expired: L'export a expiré. Essayez de générer un nouvel export.
187
+ 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
187
188
  file_no_exists: Le fichier n'existe pas
188
189
  notice: Le téléchargement de vos données est en cours. Vous recevrez un email lorsque celui-ci sera terminé.
189
190
  email_change:
@@ -1024,6 +1025,7 @@ fr:
1024
1025
  create_with_space: "%{user_name} a créé %{resource_name} dans %{space_name}"
1025
1026
  delete: "%{user_name} a supprimé %{resource_name}"
1026
1027
  delete_with_space: "%{user_name} a supprimé %{resource_name} dans %{space_name}"
1028
+ publish: "%{user_name} a publié %{resource_name}"
1027
1029
  publish_with_space: "%{user_name} a publié %{resource_name} dans %{space_name}"
1028
1030
  unknown_action: "%{user_name} a effectué une action sur %{resource_name}"
1029
1031
  unknown_action_with_space: "%{user_name} a effectué une action sur %{resource_name} dans %{space_name}"
@@ -1054,7 +1056,7 @@ fr:
1054
1056
  latlng_text: 'latitude : %{latitude}, longitude : %{longitude}'
1055
1057
  map_service_brand: OpenStreetMap
1056
1058
  menu:
1057
- help: Aide
1059
+ help: Aidez-moi
1058
1060
  home: Accueil
1059
1061
  messaging:
1060
1062
  conversation_mailer:
@@ -1562,20 +1564,30 @@ fr:
1562
1564
  body_2: Dans le cadre de nos efforts pour simplifier l'expérience des organisations, la fonctionnalité "Groupes d'utilisateurs" est dépréciée. Votre profil de groupe d'utilisateurs a maintenant été converti en un profil de simple participant.
1563
1565
  greeting: Cher(ère) %{name},
1564
1566
  instructions_1: Si vous avez accès à ce compte de messagerie, veuillez vérifier votre boîte de réception pour les instructions.
1565
- instructions_intro: Nous avons envoyé des instructions à l'adresse e-mail associée au compte pour définir un nouveau mot de passe pour le profil.
1566
- instructions_title: "<strong>Cce que ça signifie pour vous</strong>"
1567
- subject: Mise à jour importante à propos du groupe d'utilisateurs dont vous êtes membre
1567
+ instructions_2: Sinon, l'un de vos collègues qui a accès devra définir le mot de passe et partager les identifiants de connexion avec vous.
1568
+ instructions_intro: Les membres du groupe partageront désormais l'accès à ce profil en utilisant les identifiants de connexion partagés (email et mot de passe). Nous avons envoyé des instructions à %{email} pour définir un nouveau mot de passe pour le profil.
1569
+ instructions_title: "<strong>Ce que cela signifie pour vous</strong>"
1570
+ subject: Mise à jour importante concernant votre profil de groupe
1568
1571
  notify_deprecation_to_owner:
1569
1572
  body_1: Nous vous contactons pour vous informer d’une mise à jour importante concernant votre profil de groupe sur %{organization_name}.
1570
1573
  body_2: Dans le cadre de nos efforts pour simplifier et améliorer l'expérience des organisations comme la vôtre, nous déprécions la fonctionnalité "Groupes d'utilisateurs". Votre groupe, <strong>%{name}</strong>a été converti en simple compte.
1571
- body_3: Pour continuer à accéder à votre compte, nous avons besoin que vous définissiez un mot de passe.
1574
+ body_3: Pour continuer à accéder à votre compte et partager votre accès, nous avons besoin que vous définissiez un mot de passe. Une fois défini, vous pouvez partager les identifiants de connexion (e-mail et mot de passe) avec n'importe qui.
1572
1575
  greeting: Cher(ère) %{name},
1573
- instructions_1: 'Cliquez sur le lien ci-dessous pour démarrer le processus de définition du mot de passe :'
1574
- instructions_2: Dans le formulaire, entrez l'adresse e-mail à laquelle vous avez reçu ce message et soumettez la demande.
1575
- instructions_3: Consultez votre boîte de réception afin d'obtenir des instructions supplémentaires pour définir votre nouveau mot de passe.
1576
+ instructions_1: 'Cliquez sur le lien ci-dessous pour définir votre mot de passe :'
1577
+ instructions_2: 'Partagez les identifiants de connexion (email: %{email} et le nouveau mot de passe) avec vos collègues.'
1576
1578
  instructions_title: "<strong>Ce que vous devez faire</strong>"
1577
- set_password: Démarrer le processus de définition du mot de passe
1578
- subject: Mise à jour importante à propos du groupe d'utilisateurs
1579
+ set_password: Définissez votre mot de passe
1580
+ subject: Mise à jour importante concernant votre profil de groupe
1581
+ notify_user_group_patched:
1582
+ body_1_html: Nous vous contactons pour vous informer d’une mise à jour importante concernant votre profil de groupe sur %{organization_name}.
1583
+ body_2_html: Dans le cadre de nos efforts pour simplifier et améliorer l'expérience des organisations comme la vôtre, nous déprécions la fonctionnalité "Groupes d'utilisateurs". Votre groupe, <strong>%{name}</strong>a été converti en simple compte.
1584
+ body_3_html: Pour continuer à accéder à votre compte et partager votre accès, nous avons besoin que vous définissiez une nouvelle adresse e-mail et un nouveau mot de passe. Veuillez noter que chaque membre de votre groupe recevra ce courriel. Pour assurer la continuité de l'accès, vous devrez convenir en interne des identifiants partagés (adresse e-mail et mot de passe) que tout le monde utilisera.
1585
+ greeting: Cher(ère) %{name},
1586
+ instructions_1_html: 'Utilisez les identifiants temporaires suivants pour vous connecter : <br><br> Nom d''utilisateur : <strong>%{email}</strong> <br> Mot de passe : <strong>%{password}</strong><br><br>'
1587
+ instructions_2_html: Définir une nouvelle adresse e-mail et un nouveau mot de passe.
1588
+ instructions_3_html: Partagez les identifiants de connexion choisis avec vos collègues pour que l'ensemble du groupe puisse continuer à accéder au compte.
1589
+ instructions_title_html: "<strong>Ce que vous devez faire</strong>"
1590
+ subject: Mise à jour importante concernant votre profil de groupe
1579
1591
  user_report_mailer:
1580
1592
  notify:
1581
1593
  body_1: L'utilisateur %{user} a été signalé par %{token}
@@ -454,6 +454,8 @@ it:
454
454
  description: Descrisione
455
455
  footer_sub_hero:
456
456
  name: Banner di sub eroe di piè di pagina
457
+ global_menu:
458
+ name: Menu globale
457
459
  hero_settings_form:
458
460
  background_image: Immagine di sfondo
459
461
  welcome_text: Testo di benvenuto
@@ -186,6 +186,7 @@ ja:
186
186
  success: アカウントが正常に削除されました。
187
187
  download_your_data_export:
188
188
  export_expired: エクスポートの有効期限が切れています。新しいエクスポートを生成してください。
189
+ export_not_found: アクセスしたエクスポートが存在しないか、ダウンロードする権限がありません
189
190
  file_no_exists: ファイルが存在しません
190
191
  notice: データのダウンロードは現在進行中です。完了した際にはメールでお知らせします。
191
192
  email_change:
@@ -1133,6 +1134,7 @@ ja:
1133
1134
  create_with_space: "%{user_name} が %{resource_name} に %{space_name} を作成しました"
1134
1135
  delete: "%{user_name} が %{resource_name} を削除しました"
1135
1136
  delete_with_space: "%{user_name} が %{resource_name} で %{space_name} を削除しました"
1137
+ publish: "%{user_name} が %{resource_name}を公開しました"
1136
1138
  publish_with_space: "%{user_name} が %{space_name} の %{resource_name} を公開しました"
1137
1139
  unknown_action: "%{user_name} が %{resource_name} にいくつかのアクションを実行しました"
1138
1140
  unknown_action_with_space: "%{user_name} が %{resource_name} で %{space_name} にアクションを実行しました"
@@ -1706,20 +1708,30 @@ ja:
1706
1708
  body_2: 組織向けの利用体験を簡素化する取り組みの一環として、「ユーザーグループ」機能は廃止される予定です。あなたのユーザーグループのプロフィールは通常の参加者プロフィールに変更されました。
1707
1709
  greeting: こんにちは %{name} さん、
1708
1710
  instructions_1: そのメールアカウントにアクセスできる場合は、受信トレイに届いている案内をご確認ください。
1709
- instructions_intro: プロファイルの新しいパスワードを設定するために、アカウントに関連付けられているメールアドレスに指示を送信しました。
1710
- instructions_title: "<strong>これがあなたにとって何を意味するか</strong>"
1711
- subject: あなたが所属しているユーザーグループに関する重要な更新
1711
+ instructions_2: そうでない場合は、アクセス権を持つ同僚の一人がパスワードを設定し、ログイン情報をあなたと共有する必要があります。
1712
+ instructions_intro: グループメンバーは、共有ログインクレデンシャル(メールアドレスとパスワード)を使用して、このプロファイルへのアクセスを共有するようになりました。 プロファイルの新しいパスワードを設定するための指示を %{email} に送信しました。
1713
+ instructions_title: "<strong>あなたへの影響</strong>"
1714
+ subject: グループプロフィールに関する重要な更新情報
1712
1715
  notify_deprecation_to_owner:
1713
1716
  body_1: '%{organization_name}でのグループプロフィールに関する重要なアップデートについてお知らせするためにご連絡しています。'
1714
1717
  body_2: あなたのような組織向けの利用体験を簡素化・改善する取り組みの一環として、「ユーザーグループ」機能は廃止されます。あなたのグループ<strong>%{name}</strong>は通常のアカウントに変更されました。
1715
- body_3: アカウントに引き続きアクセスするために、パスワードの設定をお願いします。
1718
+ body_3: 引き続きアカウントへアクセスしてアクセス権限を共有するためには、パスワードを設定する必要があります。設定後、ログイン認証情報(メールアドレスとパスワード)を任意の相手と共有することが可能になります。
1716
1719
  greeting: こんにちは %{name} さん、
1717
- instructions_1: '以下のリンクをクリックして、パスワードの設定を開始してください:'
1718
- instructions_2: フォームに、このメッセージを受け取ったメールアドレスを入力し、リクエストを送信してください。
1719
- instructions_3: 新しいパスワードを設定するための詳しい手順が記載されたメールが届いているか、受信トレイをご確認ください。
1720
- instructions_title: "<strong>あなたが行うべきこと</strong>"
1721
- set_password: パスワード設定を開始
1722
- subject: ユーザーグループの重要なアップデート
1720
+ instructions_1: '以下のリンクをクリックしてパスワードを設定してください:'
1721
+ instructions_2: 'ログイン認証情報(メールアドレス:%{email}、新規パスワード)を同僚と共有してください。'
1722
+ instructions_title: "<strong>実施すべきこと</strong>"
1723
+ set_password: パスワードの設定
1724
+ subject: グループプロフィールに関する重要な更新事項
1725
+ notify_user_group_patched:
1726
+ body_1_html: '%{organization_name}におけるグループプロフィールに関する重要な更新についてお知らせします。'
1727
+ body_2_html: 組織の利便性向上とシステムの簡素化を図るため、「ユーザーグループ」機能の廃止を決定いたしました。あなたのグループ <strong>%{name}</strong> は、通常のアカウント形式に変更されています。
1728
+ body_3_html: 引き続きアカウントにアクセスしてアクセス権限を共有するためには、新しいメールアドレスとパスワードの設定が必要です。なお、グループの各メンバーにはこのメールが送信されます。継続的なアクセスを保証するため、共有する認証情報(メールアドレスとパスワード)について、グループ内で事前に合意していただく必要があります。
1729
+ greeting: こんにちは %{name} さん、
1730
+ instructions_1_html: '以下の仮認証情報を使用してログインしてください:<br><br> ユーザー名: <strong>%{email}</strong> <br> パスワード: <strong>%{password}</strong><br><br>'
1731
+ instructions_2_html: 新しいメールアドレスとパスワードを設定します。
1732
+ instructions_3_html: 選択したログイン認証情報を同僚の方々と共有し、グループ全体で引き続きアカウントにアクセスできるようにしてください。
1733
+ instructions_title_html: "<strong>実施が必要な事項</strong>"
1734
+ subject: グループプロフィールに関する重要なお知らせ
1723
1735
  user_report_mailer:
1724
1736
  notify:
1725
1737
  body_1: ユーザー %{user} が %{token} によって報告されました
@@ -1381,7 +1381,7 @@ ro:
1381
1381
  body_2: Ca parte a eforturilor noastre de a simplifica experiența organizațiilor, funcționalitatea "Grupuri de utilizatori" va fi înlăturată. Profilul dvs. de utilizator grup a fost acum convertit într-un profil de participant obișnuit.
1382
1382
  greeting: Dragă %{name},
1383
1383
  instructions_1: Dacă aveți acces la acest cont de e-mail, vă rugăm să verificați căsuța poștală pentru instrucțiuni.
1384
- subject: Grupul de utilizatori din care faceți parte are actualizări importante
1384
+ instructions_2: În caz contrar, unul dintre colegii dvs. care are acces va trebui să seteze parola și să partajeze credențialele de conectare cu dvs.
1385
1385
  user_report_mailer:
1386
1386
  notify:
1387
1387
  body_1: Utilizatorul %{user} a fost raportat de %{token}
@@ -378,7 +378,6 @@ ru:
378
378
  managed_users:
379
379
  expired_session: Текущий сеанс выступления в роли участника истек.
380
380
  menu:
381
- help: Справка
382
381
  home: Главная
383
382
  messaging:
384
383
  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,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ class AddDummyMigration < ActiveRecord::Migration[7.2]
4
+ def up
5
+ # This migration is not doing anything. It is just here as a mere placeholder.
6
+ end
7
+
8
+ def down
9
+ raise ActiveRecord::IrreversibleMigration
10
+ end
11
+ end
@@ -2,10 +2,12 @@
2
2
 
3
3
  class ConvertUserGroupsIntoUsers < ActiveRecord::Migration[7.0]
4
4
  class User < ApplicationRecord
5
+ belongs_to :organization, foreign_key: "decidim_organization_id", class_name: "Decidim::Organization"
6
+
5
7
  self.table_name = "decidim_users"
6
8
  self.inheritance_column = nil
7
9
 
8
- scope :new_group, -> { where("extended_data @> ?", Arel.sql({ group: true }.to_json)) }
10
+ scope :new_group, -> { where("extended_data @> ?", { group: true }.to_json) }
9
11
  scope :old_group, -> { where(type: "Decidim::UserGroup") }
10
12
 
11
13
  def verified_at
@@ -14,13 +16,29 @@ class ConvertUserGroupsIntoUsers < ActiveRecord::Migration[7.0]
14
16
  end
15
17
 
16
18
  class UserGroup < ApplicationRecord
19
+ belongs_to :organization, foreign_key: "decidim_organization_id", class_name: "Decidim::Organization"
20
+
17
21
  self.table_name = "decidim_users"
18
22
  self.inheritance_column = nil
19
23
  end
20
24
 
25
+ # Identify if there is another user with the same email in the same organization
26
+ # @param [User] group
27
+ # @return [Boolean]
28
+ def another_user_with_same_email_in_organization?(group)
29
+ User.where.not(id: group.id).exists?(decidim_organization_id: group.decidim_organization_id, email: group.email)
30
+ end
31
+
21
32
  # rubocop:disable Rails/SkipsModelValidations
22
33
  def up
23
34
  User.old_group.find_each do |group|
35
+ if group.email.blank? || another_user_with_same_email_in_organization?(group)
36
+ group.update_attribute(:email, "user_group_#{group.id}@#{group.organization.host}.invalid")
37
+ group.update_attribute(:extended_data, (group.extended_data || {}).merge("patched" => true, "previous_email" => group.email))
38
+
39
+ group.reload
40
+ end
41
+
24
42
  group.update_attribute(:extended_data, (group.extended_data || {}).merge("group" => true))
25
43
  group.update_attribute(:type, "Decidim::User")
26
44
  group.update_attribute(:officialized_at, group.verified_at) if group.verified_at.present?
@@ -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
data/decidim-core.gemspec CHANGED
@@ -41,6 +41,7 @@ Gem::Specification.new do |s|
41
41
  s.add_dependency "cells-rails", "~> 0.1.3"
42
42
  s.add_dependency "charlock_holmes", "~> 0.7"
43
43
  s.add_dependency "chartkick", "~> 5.1.2"
44
+ s.add_dependency "data_migrate", "~> 11.3"
44
45
  s.add_dependency "date_validator", "~> 0.12.0"
45
46
  s.add_dependency "devise", "~> 4.7"
46
47
  s.add_dependency "devise-i18n", "~> 1.2"
@@ -44,20 +44,20 @@ module Decidim
44
44
  # @param options The options for the URL that are the normal route options
45
45
  # Rails route helpers accept
46
46
  # @return [String] The URL of the asset
47
- def url(**)
47
+ def url(**options)
48
48
  case asset
49
49
  when ActiveStorage::Attached
50
- ensure_current_host(asset.record, **)
51
- blob_url(**)
50
+ ensure_current_host(asset.record, **options)
51
+ blob_url(**options.except(:host))
52
52
  when ActiveStorage::Blob
53
- blob_url(**)
53
+ blob_url(**options)
54
54
  else # ActiveStorage::VariantWithRecord, ActiveStorage::Variant
55
55
  if blob && blob.attachments.any?
56
- ensure_current_host(blob.attachments.first&.record, **)
57
- representation_url(**)
56
+ ensure_current_host(blob.attachments.first&.record, **options)
57
+ representation_url(**options.except(:host))
58
58
  else
59
- ensure_current_host(nil, **)
60
- representation_url(**, only_path: true)
59
+ ensure_current_host(nil, **options)
60
+ representation_url(**options.except(:host), only_path: true)
61
61
  end
62
62
  end
63
63
  end
@@ -38,6 +38,7 @@ require "ransack"
38
38
  require "wisper"
39
39
  require "chartkick"
40
40
  require "shakapacker"
41
+ require "data_migrate"
41
42
 
42
43
  require "decidim/api"
43
44
  require "decidim/core/content_blocks/registry_manager"
@@ -229,6 +230,13 @@ module Decidim
229
230
  Decidim.icons.register(name: "facebook-circle-line", icon: "facebook-circle-line", category: "social icon", description: "", engine: :core)
230
231
  end
231
232
 
233
+ initializer "decidim_core.data_migrate" do |app|
234
+ DataMigrate.configure do |config|
235
+ config.data_migrations_path = [app.root.join("db/data").to_s]
236
+ config.data_migrations_path << root.join("db/data").to_s
237
+ end
238
+ end
239
+
232
240
  initializer "decidim_core.patch_shakapacker", before: "shakapacker.version_checker" do
233
241
  ENV["SHAKAPACKER_CONFIG"] = Decidim::Shakapacker.configuration.configuration_file
234
242
  end
@@ -488,6 +496,7 @@ module Decidim
488
496
  end
489
497
 
490
498
  initializer "decidim_core.add_cells_view_paths" do
499
+ Cell::ViewModel.view_paths << Rails.root.join("app/views") # for partials
491
500
  Cell::ViewModel.view_paths << File.expand_path("#{Decidim::Core::Engine.root}/app/cells")
492
501
  Cell::ViewModel.view_paths << File.expand_path("#{Decidim::Core::Engine.root}/app/cells/amendable")
493
502
  Cell::ViewModel.view_paths << File.expand_path("#{Decidim::Core::Engine.root}/app/views") # for partials
@@ -871,9 +871,14 @@ FactoryBot.define do
871
871
  end
872
872
  expires_at { 1.week.from_now }
873
873
  attached_to { create(:user, organization:, skip_injection:) }
874
- export_type { "dummy" }
874
+ export_type { "download_your_data" }
875
875
  content_type { "application/zip" }
876
- file_size { 10.kilobytes }
876
+ file_size { 208.bytes }
877
+ file { Decidim::Dev.test_file("dummy-export.zip", "application/zip") }
878
+
879
+ trait :expired do
880
+ expires_at { 1.week.ago }
881
+ end
877
882
  end
878
883
 
879
884
  factory :searchable_resource, class: "Decidim::SearchableResource" do
@@ -873,6 +873,30 @@ shared_examples "comments" do
873
873
  expect(page.find("#comment-#{parent.id}-replies").text).to be_blank
874
874
  end
875
875
  end
876
+
877
+ context "when admin moderates the comment" do
878
+ let!(:user) { create(:user, :admin, :confirmed, organization:) }
879
+
880
+ before do
881
+ switch_to_host(organization.host)
882
+ login_as user, scope: :user
883
+ visit resource_path
884
+ end
885
+
886
+ it "hides the comment" do
887
+ within "#comment_#{comments.first.id}" do
888
+ page.find("[id^='dropdown-trigger']").click
889
+ click_on "Report"
890
+ end
891
+
892
+ within "#flagModalComment#{comments.first.id}" do
893
+ check "Hide this content"
894
+ click_on "Hide"
895
+ end
896
+
897
+ expect(page).to have_content("This resource has been hidden.")
898
+ end
899
+ end
876
900
  end
877
901
 
878
902
  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.31.0.rc1"
7
+ "0.31.0"
8
8
  end
9
9
  end
10
10
  end
@@ -204,7 +204,7 @@ module Decidim
204
204
  disabled: options[:disabled],
205
205
  options: editor_options[:editor]
206
206
  }
207
- ) { content_tag(:div, nil, class: "editor-input", style: "height: #{lines}rem") }
207
+ ) { content_tag(:div, nil, class: "editor-input", style: "min-height: #{lines}rem") }
208
208
  template += error_for(name, options) if error?(name)
209
209
  template += editor_upload(editor_image, editor_options[:upload])
210
210
  template.html_safe
@@ -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/shakapacker_runtime.yml")
67
+ @configuration_file_path ||= if defined?(Rails) && Rails.env.test?
68
+ File.join(app_path, "tmp/shakapacker_runtime#{ENV.fetch("TEST_ENV_NUMBER", "")}.yml")
69
+ else
70
+ File.join(app_path, "tmp/shakapacker_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