decidim-core 0.30.3 → 0.30.5

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 (96) hide show
  1. checksums.yaml +4 -4
  2. data/app/cells/decidim/activity_cell.rb +6 -0
  3. data/app/cells/decidim/card_g/show.erb +1 -1
  4. data/app/cells/decidim/notification/deleted.erb +12 -0
  5. data/app/cells/decidim/notification/not_available.erb +12 -0
  6. data/app/cells/decidim/notification_cell.rb +5 -1
  7. data/app/cells/decidim/share_widget/modal.erb +2 -1
  8. data/app/commands/decidim/destroy_account.rb +49 -4
  9. data/app/controllers/decidim/download_your_data_controller.rb +5 -2
  10. data/app/events/decidim/welcome_notification_event.rb +1 -1
  11. data/app/jobs/decidim/remove_search_indexes_job.rb +18 -0
  12. data/app/mailers/decidim/notifications_digest_mailer.rb +18 -1
  13. data/app/models/decidim/component.rb +3 -0
  14. data/app/models/decidim/notification.rb +10 -0
  15. data/app/models/decidim/private_export.rb +4 -0
  16. data/app/models/decidim/user.rb +4 -0
  17. data/app/models/decidim/user_base_entity.rb +1 -1
  18. data/app/packs/src/decidim/editor/extensions/link/index.js +0 -1
  19. data/app/packs/src/decidim/editor/index.js +5 -1
  20. data/app/packs/src/decidim/editor/test/extensions/link.test.js +2 -2
  21. data/app/packs/src/decidim/editor/test/toolbar/shared/behaves_like_basic_link.js +1 -1
  22. data/app/packs/src/decidim/map/controller/markers.js +3 -1
  23. data/app/packs/stylesheets/decidim/_footer.scss +5 -0
  24. data/app/packs/stylesheets/decidim/_modal.scss +5 -1
  25. data/app/packs/stylesheets/decidim/_modal_fingerprint.scss +1 -1
  26. data/app/presenters/decidim/log/user_presenter.rb +2 -1
  27. data/app/presenters/decidim/user_presenter.rb +6 -1
  28. data/app/services/decidim/download_your_data_exporter.rb +15 -4
  29. data/app/services/decidim/open_data_exporter.rb +2 -1
  30. data/app/views/decidim/download_your_data/_export.html.erb +1 -1
  31. data/app/views/decidim/export_mailer/download_your_data_export.html.erb +1 -1
  32. data/app/views/decidim/export_mailer/export.html.erb +1 -1
  33. data/app/views/decidim/pages/_tabbed.html.erb +1 -1
  34. data/app/views/decidim/shared/_orders.html.erb +1 -1
  35. data/app/views/layouts/decidim/header/_main_links_mobile_account.html.erb +15 -1
  36. data/config/locales/ar.yml +0 -4
  37. data/config/locales/bg.yml +0 -8
  38. data/config/locales/ca-IT.yml +17 -13
  39. data/config/locales/ca.yml +15 -11
  40. data/config/locales/cs.yml +9 -19
  41. data/config/locales/de.yml +5 -21
  42. data/config/locales/el.yml +0 -3
  43. data/config/locales/en.yml +21 -17
  44. data/config/locales/es-MX.yml +14 -10
  45. data/config/locales/es-PY.yml +14 -10
  46. data/config/locales/es.yml +13 -9
  47. data/config/locales/eu.yml +54 -51
  48. data/config/locales/fa-IR.yml +3 -0
  49. data/config/locales/fi-plain.yml +12 -8
  50. data/config/locales/fi.yml +12 -8
  51. data/config/locales/fr-CA.yml +23 -12
  52. data/config/locales/fr.yml +23 -12
  53. data/config/locales/ga-IE.yml +0 -4
  54. data/config/locales/gl.yml +0 -3
  55. data/config/locales/hu.yml +0 -6
  56. data/config/locales/id-ID.yml +0 -3
  57. data/config/locales/it.yml +3 -4
  58. data/config/locales/ja.yml +26 -22
  59. data/config/locales/ko.yml +3 -0
  60. data/config/locales/lb.yml +0 -3
  61. data/config/locales/lt.yml +0 -5
  62. data/config/locales/lv.yml +0 -3
  63. data/config/locales/mt.yml +3 -0
  64. data/config/locales/nl.yml +0 -3
  65. data/config/locales/no.yml +0 -3
  66. data/config/locales/pl.yml +11 -7
  67. data/config/locales/pt-BR.yml +552 -5
  68. data/config/locales/pt.yml +0 -3
  69. data/config/locales/ro-RO.yml +453 -126
  70. data/config/locales/ru.yml +0 -4
  71. data/config/locales/sk.yml +0 -3
  72. data/config/locales/sl.yml +0 -1
  73. data/config/locales/sv.yml +28 -13
  74. data/config/locales/tr-TR.yml +0 -5
  75. data/config/locales/uk.yml +0 -3
  76. data/config/locales/vi.yml +3 -0
  77. data/config/locales/zh-CN.yml +0 -3
  78. data/config/locales/zh-TW.yml +0 -5
  79. data/db/migrate/20250819110800_convert_private_exports_id_to_uuid.rb +55 -0
  80. data/decidim-core.gemspec +1 -0
  81. data/lib/decidim/core/engine.rb +1 -0
  82. data/lib/decidim/core/seeds.rb +3 -3
  83. data/lib/decidim/core/test/factories.rb +27 -2
  84. data/lib/decidim/core/test/shared_examples/comments_examples.rb +59 -5
  85. data/lib/decidim/core/test/shared_examples/fingerprint_examples.rb +13 -0
  86. data/lib/decidim/core/test/shared_examples/process_announcements_examples.rb +35 -1
  87. data/lib/decidim/core/version.rb +1 -1
  88. data/lib/decidim/events/base_event.rb +4 -0
  89. data/lib/decidim/has_private_users.rb +1 -0
  90. data/lib/decidim/seeds.rb +1 -1
  91. data/lib/decidim/webpacker/configuration.rb +5 -1
  92. data/lib/tasks/upgrade/clean.rake +11 -0
  93. data/lib/tasks/upgrade/decidim_fix_action_log.rake +28 -0
  94. data/lib/tasks/upgrade/decidim_remove_deleted_users_left_data_tasks.rake +30 -0
  95. data/lib/tasks/upgrade/fix_deleted_private_follows.rake +26 -0
  96. metadata +27 -6
@@ -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:
@@ -481,14 +480,11 @@ ru:
481
480
  proposals_explanation: Вносите новые предложения, поддерживайте уже внесенные и способствуйте изменениям, которые вы хотите видеть.
482
481
  footer_sub_hero:
483
482
  footer_sub_hero_headline: Добро пожаловать на площадку соучастия %{organization}!
484
- register: Зарегистрироваться
485
483
  hero:
486
484
  participate: Принять участие
487
485
  welcome: Добро пожаловать в %{organization}!
488
486
  statistics:
489
487
  headline: Текущее состояние %{organization}
490
- sub_hero:
491
- register: Зарегистрироваться
492
488
  profile:
493
489
  deleted: Удаленный участник
494
490
  profiles:
@@ -746,14 +746,11 @@ sk:
746
746
  proposals_explanation: Urobiť návrhy, podporiť existujúce a podporovať zmeny, ktoré chcete vidieť.
747
747
  footer_sub_hero:
748
748
  footer_sub_hero_headline: Vitajte na%{organization} participatívnej platforme.
749
- register: Registrovať
750
749
  hero:
751
750
  participate: zúčastniť sa
752
751
  welcome: Vitajte na%{organization}!
753
752
  statistics:
754
753
  headline: Aktuálny stav %{organization}
755
- sub_hero:
756
- register: Registrovať
757
754
  index:
758
755
  standalone_pages: Stránky
759
756
  subheading: Prechádzajte stránky pomocníka%{name}
@@ -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:
@@ -649,7 +649,7 @@ sv:
649
649
  email_already_exists: Ett annat konto använder samma e-postadress.
650
650
  new:
651
651
  complete_profile: Komplettera profil
652
- nickname_help: Ditt användarnamn i %{organization}. Kan bara innehålla bokstäver, siffror, '-' och '_'.
652
+ nickname_help: Ditt användarnamn i %{organization}. Kan bara innehålla små bokstäver a-z, siffror, '-' och '_'.
653
653
  sign_up: Var god slutför din profil
654
654
  subtitle: Slutför registreringen genom att fylla i följande formulär
655
655
  username_help: Offentligt namn som visas i dina inlägg. Du kan ange ett annat namn än ditt eget, om du vill vara anonym.
@@ -734,6 +734,8 @@ sv:
734
734
  created_at: Datum och tid då identiteten skapades
735
735
  id: Unikt id för identiteten
736
736
  provider: Leverantören av identiteten
737
+ messaging_conversations:
738
+ updated_at: Datum när denna konversation senast uppdaterades
737
739
  participatory_space_private_users:
738
740
  created_at: Datum och tid när den privata användaren skapades
739
741
  id: Unikt id för den privata användaren
@@ -756,7 +758,7 @@ sv:
756
758
  phone: Telefonnummer till användargruppen
757
759
  verified_at: Datum och tid för när användargruppen verifierades
758
760
  users:
759
- about: Presentation av användaren
761
+ about: Profilbeskrivningen för denna deltagare
760
762
  accepted_tos_version: Det datum då användarvillkoren godkändes av användaren
761
763
  admin: Om användaren är administratör
762
764
  confirmation_sent_at: Datum och tid då bekräftelsen skickades
@@ -776,8 +778,9 @@ sv:
776
778
  locale: Användarens valda språk
777
779
  managed: Om användare hanteras av en annan användare
778
780
  name: Namnet på användaren
779
- newsletter_notifications_at: Datum och tid när användaren senast fick ett nyhetsbrev
781
+ newsletter_notifications_at: Datum och tid när denna deltagare prenumererade på att få ett nyhetsbrev
780
782
  nickname: Användarens användarnamn
783
+ officialized_as: Officiantens titel (kommunalråd, borgmästare, etc)
781
784
  editor_images:
782
785
  create:
783
786
  error: Fel vid uppladdning av bild.
@@ -801,7 +804,7 @@ sv:
801
804
  files:
802
805
  file_cannot_be_processed: Filen kan inte bearbetas
803
806
  file_resolution_too_large: Filupplösningen är för stor
804
- not_inside_organization: Filen är inte kopplad till någon organisation
807
+ not_inside_organization: Filen är inte kopplad till någon organisation.
805
808
  internal_server_error:
806
809
  copied: Texten har kopierats!
807
810
  copy_error_message_clarification: Kopiera felmeddelandet till urklipp
@@ -947,7 +950,7 @@ sv:
947
950
  email_intro: |-
948
951
  Din %{resource_type} är inte längre synlig.<br>
949
952
  Detta hände därför att förslaget, mötet, debatten eller kommentaren du svarade på har modererats. Om den blir tillgänglig igen, kommer din kommentar automatiskt att återställas.
950
- email_outro: Du har fått det här meddelandet eftersom du är en författare till %{resource_type}.
953
+ email_outro: Du har fått det här meddelandet eftersom du är författare till %{resource_type}.
951
954
  email_subject: Din %{resource_type} är inte längre synlig
952
955
  notification_title: |-
953
956
  Din %{resource_type} är inte längre synlig.<br>
@@ -1035,6 +1038,7 @@ sv:
1035
1038
  file:
1036
1039
  explanation: 'Instruktioner för fil:'
1037
1040
  message_1: Måste vara en bild eller ett dokument.
1041
+ message_2: Om det är en bild så använd helst en landskapsbild som inte har någon text. Plattformen beskär bilden.
1038
1042
  icon:
1039
1043
  explanation: 'Instruktioner för ikon:'
1040
1044
  message_1: Måste vara en kvadratisk bild.
@@ -1065,6 +1069,7 @@ sv:
1065
1069
  title_required: Titel måste fyllas i!
1066
1070
  uploaded: Uppladdad
1067
1071
  validating: Validerar...
1072
+ validation_error: Valideringsfel! Kontrollera att filen har en tillåten filtyp eller storlek.
1068
1073
  select_file: Välj fil
1069
1074
  upload_help:
1070
1075
  dropzone: Släpp filer här eller klicka på knappen för att ladda upp
@@ -1394,8 +1399,10 @@ sv:
1394
1399
  action_error: Det gick inte att uppdatera inställningen för meddelanden.
1395
1400
  no_notifications: Inga meddelanden ännu.
1396
1401
  show:
1402
+ deleted: Innehållet har tagits bort av författaren.
1397
1403
  missing_event: Hoppsan, det här meddelandet tillhör ett objekt som inte längre är tillgängligt. Du kan kasta det.
1398
- moderated: Innehåll modererat
1404
+ moderated: Innehållet har dolts av moderator.
1405
+ not_available: Hoppsan, det här meddelandet tillhör ett objekt som inte längre är tillgängligt. Du kan kasta det.
1399
1406
  notifications_digest_mailer:
1400
1407
  header:
1401
1408
  daily: Dagligt sammandrag
@@ -1403,6 +1410,7 @@ sv:
1403
1410
  hello: Hej %{name},
1404
1411
  intro:
1405
1412
  daily: 'Det här är meddelandena från senaste dagen baserat på aktiviteterna du följer:'
1413
+ real_time: 'Detta är en notis om aktiviteten du följer:'
1406
1414
  weekly: 'Det här är meddelandena från senaste veckan baserat på aktiviteterna du följer:'
1407
1415
  outro: Du har fått de här meddelandena eftersom du följer det här innehållet eller dess författare. Du kan sluta följa dem från deras respektive sidor.
1408
1416
  see_more: Visa fler meddelanden
@@ -1442,11 +1450,15 @@ sv:
1442
1450
  message_2: Vänligen försök igen senare.
1443
1451
  retry: Försök igen
1444
1452
  open_data:
1453
+ index:
1454
+ license:
1455
+ license_contents_link: https://opendatacommons.org/licenses/dbcl/1.0/
1456
+ license_database_link: https://opendatacommons.org/licenses/odbl/1.0/
1445
1457
  not_available_yet: De öppna datafilerna är ännu inte tillgängliga, var vänlig försök igen om några minuter.
1446
1458
  pad_iframe:
1447
1459
  disclaimer: Innehållet i anteckningarna är skrivet av registrerade användare och uttrycker deras åsikter. %{organization} kan inte hållas ansvarig för innehållet.
1448
1460
  explanation: Använd den här anteckningsytan för att gemensamt ta anteckningar under mötet så att det går lättare att skriva protokollet efteråt.
1449
- pad: Memo
1461
+ pad: Anteckningar
1450
1462
  pages:
1451
1463
  home:
1452
1464
  extended:
@@ -1461,7 +1473,7 @@ sv:
1461
1473
  footer_sub_hero:
1462
1474
  footer_sub_hero_body_html: Låt oss skapa ett mer öppet, transparent och deltagande samhälle.<br /> Gå med, delta och fatta beslut.
1463
1475
  footer_sub_hero_headline: Välkommen till %{organization} deltagarplattform.
1464
- register: Registrera dig
1476
+ register: Skapa ett konto
1465
1477
  hero:
1466
1478
  participate: Delta
1467
1479
  participate_title: Delta i plattformens processer
@@ -1469,7 +1481,7 @@ sv:
1469
1481
  statistics:
1470
1482
  headline: Aktuellt läge för %{organization}
1471
1483
  sub_hero:
1472
- register: Registrera
1484
+ register: Skapa ett konto
1473
1485
  register_title: Skapa ett konto
1474
1486
  index:
1475
1487
  standalone_pages: Sidor
@@ -1675,7 +1687,10 @@ sv:
1675
1687
  no_stats: Det finns ingen statistik ännu.
1676
1688
  pages_count: Sidor
1677
1689
  participants_count: Deltagare
1690
+ surveys_count: Enkäter
1678
1691
  users_count: Deltagare
1692
+ tags:
1693
+ filter_results_for_taxonomy: 'Filtrera resultat: %{resource}'
1679
1694
  translation_bar:
1680
1695
  help_text: "<strong>Obs:</strong> Innehåll kan ha översatts automatiskt och inte vara 100% korrekt."
1681
1696
  show_original: Visa originaltexten
@@ -1715,7 +1730,7 @@ sv:
1715
1730
  version:
1716
1731
  show:
1717
1732
  back_to_resource: Gå tillbaka
1718
- changes_at_title: Ändringar "%{title}"
1733
+ changes_at_title: Ändringar av "%{title}"
1719
1734
  number_of_versions: Versioner
1720
1735
  version_created_at: Version skapad
1721
1736
  versions:
@@ -1755,7 +1770,7 @@ sv:
1755
1770
  invitations:
1756
1771
  edit:
1757
1772
  header: Slutför skapandet av ditt konto
1758
- nickname_help: Ditt användarnamn för %{organization}. Kan bara innehålla bokstäver, siffror, '-' och '_'.
1773
+ nickname_help: Ditt användarnamn i %{organization}. Kan bara innehålla små bokstäver a-z, siffror, '-' och '_'.
1759
1774
  submit_button: Spara
1760
1775
  subtitle: Om du godkänner inbjudan väljer du ditt användarnamn och lösenord.
1761
1776
  invitation_removed: Din inbjudan har tagits bort.
@@ -1795,8 +1810,6 @@ sv:
1795
1810
  subject: Du har blivit inbjuden att hantera %{organization}
1796
1811
  invite_collaborator:
1797
1812
  subject: Du har blivit inbjuden att samarbeta på %{organization}
1798
- invite_private_user:
1799
- subject: Du har blivit inbjuden till en privat deltagarprocess på %{organization}
1800
1813
  organization_admin_invitation_instructions:
1801
1814
  subject: Du har blivit inbjuden att hantera %{organization}
1802
1815
  password_change:
@@ -2074,6 +2087,8 @@ sv:
2074
2087
  expire_time_html: Din session kommer löpa ut om <b><span class="minutes">%{minutes}</span> minuter</b>.
2075
2088
  language_chooser:
2076
2089
  choose_language: Välj språk
2090
+ navigation:
2091
+ aria_label: 'Navigation menu: %{title}'
2077
2092
  notifications_dashboard:
2078
2093
  mark_all_as_read: Markera allt som läst
2079
2094
  mark_as_read: Markera som läst
@@ -828,8 +828,6 @@ tr:
828
828
  subject: '%{organization_name} ile ilgili bilgileri almaya devam etmek istiyor musunuz?'
829
829
  notifications:
830
830
  no_notifications: Henüz bildirim yok.
831
- show:
832
- moderated: İçerik Denetlendi
833
831
  notifications_settings:
834
832
  show:
835
833
  direct_messages: Herkesten doğrudan mesaj alın
@@ -860,14 +858,11 @@ tr:
860
858
  proposals_explanation: Öneriler yapın, mevcut olanları destekleyin ve görmek istediğiniz değişiklikleri tanıtın.
861
859
  footer_sub_hero:
862
860
  footer_sub_hero_headline: '%{organization} katılımcı platformuna hoş geldiniz.'
863
- register: Kayıt Ol
864
861
  hero:
865
862
  participate: Katıl
866
863
  welcome: '%{organization} hoşgeldin!'
867
864
  statistics:
868
865
  headline: Mevcut durum %{organization}
869
- sub_hero:
870
- register: Kayıt Ol
871
866
  index:
872
867
  standalone_pages: Sayfalar
873
868
  subheading: '%{name} yardım sayfalarını ziyaret edin'
@@ -375,14 +375,11 @@ uk:
375
375
  proposals_explanation: Вносьте нові пропозиції, підтримуйте існуючі та сприяйте змінам, які ви хочете бачити.
376
376
  footer_sub_hero:
377
377
  footer_sub_hero_headline: Ласкаво просимо до майданчику співучасті %{organization}!
378
- register: Зареєструватися
379
378
  hero:
380
379
  participate: Взяти участь
381
380
  welcome: Ласкаво просимо до %{organization}!
382
381
  statistics:
383
382
  headline: Поточний стан %{organization}
384
- sub_hero:
385
- register: Зареєструватися
386
383
  profile:
387
384
  deleted: Видалений учасник
388
385
  profiles:
@@ -1 +1,4 @@
1
+ ---
1
2
  vi:
3
+ locale:
4
+ name: tiếng Việt
@@ -769,14 +769,11 @@ zh-CN:
769
769
  proposals_explanation: 提出建议、支持现有建议并促进你想要看到的更改。
770
770
  footer_sub_hero:
771
771
  footer_sub_hero_headline: 欢迎使用 %{organization} 参与式平台。
772
- register: 注册
773
772
  hero:
774
773
  participate: 参与
775
774
  welcome: 欢迎使用 %{organization}!
776
775
  statistics:
777
776
  headline: 当前状态 %{organization}
778
- sub_hero:
779
- register: 注册
780
777
  index:
781
778
  standalone_pages: 页 次
782
779
  subheading: 浏览 %{name} 的帮助页面
@@ -1138,15 +1138,12 @@ zh-TW:
1138
1138
  proposals_explanation: 提出建議、支持現有建議並推動您希望看到的變化。
1139
1139
  footer_sub_hero:
1140
1140
  footer_sub_hero_headline: 歡迎來到 %{organization} 的參與平台。
1141
- register: 註冊
1142
1141
  hero:
1143
1142
  participate: 參與
1144
1143
  participate_title: 參與平台的流程
1145
1144
  welcome: 歡迎來到 %{organization}!
1146
1145
  statistics:
1147
1146
  headline: '%{organization} 的目前狀態'
1148
- sub_hero:
1149
- register: 註冊
1150
1147
  index:
1151
1148
  standalone_pages: 頁
1152
1149
  subheading: 瀏覽 %{name} 的幫助頁面
@@ -1426,8 +1423,6 @@ zh-TW:
1426
1423
  subject: 你已經被邀請成為 %{organization} 的管理者
1427
1424
  invite_collaborator:
1428
1425
  subject: 你已獲邀成為 %{organization} 的協作者
1429
- invite_private_user:
1430
- subject: 您已被邀請參加 %{organization} 的私密參與過程。
1431
1426
  organization_admin_invitation_instructions:
1432
1427
  subject: 你已經被邀請成為 %{organization} 的管理者
1433
1428
  password_change:
@@ -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
@@ -42,6 +42,7 @@ Gem::Specification.new do |s|
42
42
  s.add_dependency "cells-rails", "~> 0.1.3"
43
43
  s.add_dependency "charlock_holmes", "~> 0.7"
44
44
  s.add_dependency "chartkick", "~> 5.1.2"
45
+ s.add_dependency "connection_pool", "< 3"
45
46
  s.add_dependency "date_validator", "~> 0.12.0"
46
47
  s.add_dependency "devise", "~> 4.7"
47
48
  s.add_dependency "devise-i18n", "~> 1.2"
@@ -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
@@ -146,7 +146,7 @@ module Decidim
146
146
  end
147
147
 
148
148
  def create_organization!
149
- smtp_label = ENV.fetch("SMTP_FROM_LABEL", ::Faker::Twitter.unique.screen_name)
149
+ smtp_label = ENV.fetch("SMTP_FROM_LABEL", ::Faker::X.unique.screen_name)
150
150
  smtp_email = ENV.fetch("SMTP_FROM_EMAIL", ::Faker::Internet.email)
151
151
 
152
152
  primary_color, secondary_color, tertiary_color = [
@@ -174,7 +174,7 @@ module Decidim
174
174
  from: "#{smtp_label} <#{smtp_email}>",
175
175
  from_email: smtp_email,
176
176
  from_label: smtp_label,
177
- user_name: ENV.fetch("SMTP_USERNAME", ::Faker::Twitter.unique.screen_name),
177
+ user_name: ENV.fetch("SMTP_USERNAME", ::Faker::X.unique.screen_name),
178
178
  encrypted_password: Decidim::AttributeEncryptor.encrypt(ENV.fetch("SMTP_PASSWORD", ::Faker::Internet.password(min_length: 8))),
179
179
  address: ENV.fetch("SMTP_ADDRESS", nil) || ENV.fetch("DECIDIM_HOST", "localhost"),
180
180
  port: ENV.fetch("SMTP_PORT", nil) || ENV.fetch("DECIDIM_SMTP_PORT", "25")
@@ -242,7 +242,7 @@ module Decidim
242
242
  def create_user_group!(user:, verified_at:)
243
243
  user_group = Decidim::UserGroup.create!(
244
244
  name: ::Faker::Company.unique.name,
245
- nickname: ::Faker::Twitter.unique.screen_name,
245
+ nickname: ::Faker::X.unique.screen_name,
246
246
  email: ::Faker::Internet.email,
247
247
  confirmed_at: Time.current,
248
248
  extended_data: {
@@ -207,6 +207,14 @@ FactoryBot.define do
207
207
  previous_passwords { [] }
208
208
  extended_data { {} }
209
209
 
210
+ trait :malicious do
211
+ after :create do |user|
212
+ # rubocop:disable Rails/SkipsModelValidations
213
+ user.update_column(:name, "user_#{user.id}\n<script>alert('name')</script>")
214
+ # rubocop:enable Rails/SkipsModelValidations
215
+ end
216
+ end
217
+
210
218
  trait :confirmed do
211
219
  confirmed_at { Time.current }
212
220
  end
@@ -932,6 +940,18 @@ FactoryBot.define do
932
940
  scopes { "public" }
933
941
  end
934
942
 
943
+ factory :oauth_access_grant, class: "Doorkeeper::AccessGrant" do
944
+ transient do
945
+ skip_injection { false }
946
+ organization { create(:organization) }
947
+ end
948
+ resource_owner_id { create(:user, organization: application.organization, skip_injection:).id }
949
+ application { create(:oauth_application, organization:, skip_injection:) }
950
+ redirect_uri { "https://app.com/callback" }
951
+ expires_in { 100 }
952
+ scopes { "public write" }
953
+ end
954
+
935
955
  factory :private_export, class: "Decidim::PrivateExport" do
936
956
  transient do
937
957
  skip_injection { false }
@@ -939,9 +959,14 @@ FactoryBot.define do
939
959
  end
940
960
  expires_at { 1.week.from_now }
941
961
  attached_to { create(:user, organization:, skip_injection:) }
942
- export_type { "dummy" }
962
+ export_type { "download_your_data" }
943
963
  content_type { "application/zip" }
944
- file_size { 10.kilobytes }
964
+ file_size { 208.bytes }
965
+ file { Decidim::Dev.test_file("dummy-export.zip", "application/zip") }
966
+
967
+ trait :expired do
968
+ expires_at { 1.week.ago }
969
+ end
945
970
  end
946
971
 
947
972
  factory :searchable_resource, class: "Decidim::SearchableResource" do
@@ -13,6 +13,34 @@ shared_examples "comments" do
13
13
  expect_no_js_errors
14
14
  end
15
15
 
16
+ context "when user name is improperly formatted" do
17
+ let!(:user) { create(:user, :malicious, :confirmed, organization:) }
18
+ let(:user_group) { create(:user_group, :verified, organization:) }
19
+ let!(:user_group_membership) { create(:user_group_membership, user:, user_group:) }
20
+
21
+ before do
22
+ # rubocop:disable Rails/SkipsModelValidations
23
+ comments.each do |comment|
24
+ comment.author.update_column(:name, "user_#{comment.author.id}\n<script>alert('name')</script>") if comment.author.is_a?(Decidim::UserBaseEntity)
25
+ end
26
+ # rubocop:enable Rails/SkipsModelValidations
27
+ end
28
+
29
+ it "properly displays the user name" do
30
+ login_as user, scope: :user
31
+ visit resource_path
32
+
33
+ within "#add-comment-anchor" do
34
+ within "form#new_comment_for_#{commentable.commentable_type.demodulize}_#{commentable.id}" do
35
+ expect(page).to have_css("p.comment__as-author-name")
36
+ within "p.comment__as-author-name" do
37
+ expect(page).to have_content("user_#{user.id} alert('name')")
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+
16
44
  it "shows the list of comments for the resource" do
17
45
  visit resource_path
18
46
 
@@ -21,7 +49,7 @@ shared_examples "comments" do
21
49
 
22
50
  within "#comments" do
23
51
  comments.each do |comment|
24
- expect(page).to have_content comment.author.name
52
+ expect(page).to have_content decidim_sanitize_translated(comment.author.name).gsub("\n", " ")
25
53
  expect(page).to have_content comment.body.values.first
26
54
  end
27
55
  end
@@ -707,19 +735,21 @@ shared_examples "comments" do
707
735
 
708
736
  context "when the user has verified organizations" do
709
737
  let(:user_group) { create(:user_group, :verified, organization:) }
738
+ let!(:user_group_membership) { create(:user_group_membership, user:, user_group:) }
710
739
  let(:content) { "This is a new comment" }
711
740
 
712
- before do
713
- create(:user_group_membership, user:, user_group:)
714
- end
715
-
716
741
  it "adds new comment as a user group" do
742
+ organization.update!(user_groups_enabled: true)
717
743
  visit resource_path
718
744
 
719
745
  within "form#new_comment_for_#{commentable.commentable_type.demodulize}_#{commentable.id}" do
746
+ click_on "Your profile"
747
+ choose "comment[user_group_id]"
748
+
720
749
  field = find("#add-comment-#{commentable.commentable_type.demodulize}-#{commentable.id}")
721
750
  field.set " "
722
751
  field.native.send_keys content
752
+
723
753
  click_on "Publish comment"
724
754
  end
725
755
 
@@ -892,6 +922,30 @@ shared_examples "comments" do
892
922
  expect(page.find("#comment-#{parent.id}-replies").text).to be_blank
893
923
  end
894
924
  end
925
+
926
+ context "when admin moderates the comment" do
927
+ let!(:user) { create(:user, :admin, :confirmed, organization:) }
928
+
929
+ before do
930
+ switch_to_host(organization.host)
931
+ login_as user, scope: :user
932
+ visit resource_path
933
+ end
934
+
935
+ it "hides the comment" do
936
+ within "#comment_#{comments.first.id}" do
937
+ page.find("[id^='dropdown-trigger']").click
938
+ click_on "Report"
939
+ end
940
+
941
+ within "#flagModalComment#{comments.first.id}" do
942
+ check "Hide this content"
943
+ click_on "Hide"
944
+ end
945
+
946
+ expect(page).to have_content("This resource has been hidden.")
947
+ end
948
+ end
895
949
  end
896
950
 
897
951
  describe "arguable option" do
@@ -13,3 +13,16 @@ shared_examples "fingerprint" do
13
13
  end
14
14
  end
15
15
  end
16
+
17
+ shared_examples "consistent fingerprint" do
18
+ include_context("with a component")
19
+
20
+ it "shows the fingerprint source with correct spacing" do
21
+ visit(resource_locator(fingerprintable).path)
22
+ click_on("Check fingerprint")
23
+
24
+ within ".fingerprint-modal" do
25
+ expect(page).to(have_content(fingerprintable.body.to_json))
26
+ end
27
+ end
28
+ end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  shared_examples "manage processes announcements" do
4
- let!(:participatory_process) { create(:participatory_process, :with_content_blocks, organization:, blocks_manifests: [:announcement]) }
4
+ let!(:participatory_process) { create(:participatory_process, :with_content_blocks, organization:, blocks_manifests: [:announcement], announcement: {}) }
5
5
 
6
6
  it "can customize a general announcement for the process" do
7
7
  within "tr", text: translated(participatory_process.title) do
@@ -34,4 +34,38 @@ shared_examples "manage processes announcements" do
34
34
  expect(page).to have_content("An important announcement")
35
35
  end
36
36
  end
37
+
38
+ it "remove announcement element if announcement body is empty" do
39
+ within "tr", text: translated(participatory_process.title) do
40
+ click_on translated(participatory_process.title)
41
+ end
42
+
43
+ within_admin_sidebar_menu do
44
+ click_on "About this process"
45
+ end
46
+
47
+ find_by_id("participatory_process-announcement-tabs").click
48
+ send_keys("T")
49
+ send_keys(:backspace)
50
+
51
+ within ".edit_participatory_process" do
52
+ find("*[type=submit]").click
53
+ end
54
+
55
+ expect(page).to have_admin_callout("successfully")
56
+
57
+ visit decidim_admin_participatory_processes.participatory_processes_path
58
+
59
+ new_window = window_opened_by do
60
+ within("tr", text: translated(participatory_process.title)) do
61
+ click_on "Preview"
62
+ end
63
+ end
64
+
65
+ page.within_window(new_window) do
66
+ expect(page).to have_no_css(".flash")
67
+ expect(page).to have_no_css(".flash__message")
68
+ expect(page).to have_no_css(".announcement")
69
+ end
70
+ end
37
71
  end
@@ -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.5"
8
8
  end
9
9
  end
10
10
  end
@@ -134,6 +134,10 @@ module Decidim
134
134
  resource.respond_to?(:hidden?) && resource.hidden?
135
135
  end
136
136
 
137
+ def deleted_resource?
138
+ resource.respond_to?(:deleted?) && resource.deleted?
139
+ end
140
+
137
141
  private
138
142
 
139
143
  def component
@@ -38,6 +38,7 @@ module Decidim
38
38
  end
39
39
 
40
40
  def can_participate?(user)
41
+ return false unless published?
41
42
  return true unless private_space?
42
43
  return false unless user
43
44
 
data/lib/decidim/seeds.rb CHANGED
@@ -21,7 +21,7 @@ module Decidim
21
21
  user = Decidim::User.find_or_initialize_by(email:)
22
22
  user.update!(
23
23
  name: ::Faker::Name.name,
24
- nickname: "#{::Faker::Twitter.unique.screen_name}-#{rand(10_000)}"[0...20],
24
+ nickname: "#{::Faker::X.unique.screen_name}-#{rand(10_000)}"[0...20],
25
25
  password: "decidim123456789",
26
26
  organization:,
27
27
  confirmed_at: Time.current,