decidim-core 0.30.4 → 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 (80) hide show
  1. checksums.yaml +4 -4
  2. data/app/cells/decidim/card_g/show.erb +1 -1
  3. data/app/cells/decidim/notification/deleted.erb +12 -0
  4. data/app/cells/decidim/notification/not_available.erb +12 -0
  5. data/app/cells/decidim/notification_cell.rb +5 -1
  6. data/app/cells/decidim/share_widget/modal.erb +2 -1
  7. data/app/commands/decidim/destroy_account.rb +49 -4
  8. data/app/events/decidim/welcome_notification_event.rb +1 -1
  9. data/app/jobs/decidim/remove_search_indexes_job.rb +18 -0
  10. data/app/mailers/decidim/notifications_digest_mailer.rb +18 -1
  11. data/app/models/decidim/component.rb +3 -0
  12. data/app/models/decidim/notification.rb +10 -0
  13. data/app/models/decidim/user.rb +4 -0
  14. data/app/models/decidim/user_base_entity.rb +1 -1
  15. data/app/packs/src/decidim/editor/extensions/link/index.js +0 -1
  16. data/app/packs/src/decidim/editor/index.js +5 -1
  17. data/app/packs/src/decidim/editor/test/extensions/link.test.js +2 -2
  18. data/app/packs/src/decidim/editor/test/toolbar/shared/behaves_like_basic_link.js +1 -1
  19. data/app/packs/stylesheets/decidim/_modal.scss +5 -1
  20. data/app/packs/stylesheets/decidim/_modal_fingerprint.scss +1 -1
  21. data/app/presenters/decidim/log/user_presenter.rb +2 -1
  22. data/app/presenters/decidim/user_presenter.rb +6 -1
  23. data/app/views/decidim/pages/_tabbed.html.erb +1 -1
  24. data/app/views/decidim/shared/_orders.html.erb +1 -1
  25. data/app/views/layouts/decidim/header/_main_links_mobile_account.html.erb +15 -1
  26. data/config/locales/ar.yml +0 -4
  27. data/config/locales/bg.yml +0 -8
  28. data/config/locales/ca-IT.yml +13 -11
  29. data/config/locales/ca.yml +13 -11
  30. data/config/locales/cs.yml +9 -19
  31. data/config/locales/de.yml +4 -20
  32. data/config/locales/el.yml +0 -3
  33. data/config/locales/en.yml +19 -17
  34. data/config/locales/es-MX.yml +12 -10
  35. data/config/locales/es-PY.yml +12 -10
  36. data/config/locales/es.yml +11 -9
  37. data/config/locales/eu.yml +42 -41
  38. data/config/locales/fa-IR.yml +3 -0
  39. data/config/locales/fi-plain.yml +11 -8
  40. data/config/locales/fi.yml +11 -8
  41. data/config/locales/fr-CA.yml +20 -11
  42. data/config/locales/fr.yml +20 -11
  43. data/config/locales/ga-IE.yml +0 -4
  44. data/config/locales/gl.yml +0 -3
  45. data/config/locales/hu.yml +0 -6
  46. data/config/locales/id-ID.yml +0 -3
  47. data/config/locales/it.yml +1 -4
  48. data/config/locales/ja.yml +24 -22
  49. data/config/locales/ko.yml +3 -0
  50. data/config/locales/lb.yml +0 -3
  51. data/config/locales/lt.yml +0 -5
  52. data/config/locales/lv.yml +0 -3
  53. data/config/locales/mt.yml +3 -0
  54. data/config/locales/nl.yml +0 -3
  55. data/config/locales/no.yml +0 -3
  56. data/config/locales/pl.yml +11 -7
  57. data/config/locales/pt-BR.yml +552 -5
  58. data/config/locales/pt.yml +0 -3
  59. data/config/locales/ro-RO.yml +453 -126
  60. data/config/locales/ru.yml +0 -3
  61. data/config/locales/sk.yml +0 -3
  62. data/config/locales/sv.yml +28 -13
  63. data/config/locales/tr-TR.yml +0 -5
  64. data/config/locales/uk.yml +0 -3
  65. data/config/locales/vi.yml +3 -0
  66. data/config/locales/zh-CN.yml +0 -3
  67. data/config/locales/zh-TW.yml +0 -5
  68. data/decidim-core.gemspec +1 -0
  69. data/lib/decidim/core/seeds.rb +3 -3
  70. data/lib/decidim/core/test/factories.rb +20 -0
  71. data/lib/decidim/core/test/shared_examples/comments_examples.rb +35 -5
  72. data/lib/decidim/core/test/shared_examples/fingerprint_examples.rb +13 -0
  73. data/lib/decidim/core/test/shared_examples/process_announcements_examples.rb +35 -1
  74. data/lib/decidim/core/version.rb +1 -1
  75. data/lib/decidim/events/base_event.rb +4 -0
  76. data/lib/decidim/has_private_users.rb +1 -0
  77. data/lib/decidim/seeds.rb +1 -1
  78. data/lib/tasks/upgrade/decidim_remove_deleted_users_left_data_tasks.rake +30 -0
  79. data/lib/tasks/upgrade/fix_deleted_private_follows.rake +26 -0
  80. metadata +25 -6
@@ -480,14 +480,11 @@ ru:
480
480
  proposals_explanation: Вносите новые предложения, поддерживайте уже внесенные и способствуйте изменениям, которые вы хотите видеть.
481
481
  footer_sub_hero:
482
482
  footer_sub_hero_headline: Добро пожаловать на площадку соучастия %{organization}!
483
- register: Зарегистрироваться
484
483
  hero:
485
484
  participate: Принять участие
486
485
  welcome: Добро пожаловать в %{organization}!
487
486
  statistics:
488
487
  headline: Текущее состояние %{organization}
489
- sub_hero:
490
- register: Зарегистрироваться
491
488
  profile:
492
489
  deleted: Удаленный участник
493
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}
@@ -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:
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"
@@ -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 }
@@ -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
 
@@ -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.4"
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,
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ namespace :decidim do
4
+ namespace :upgrade do
5
+ desc "Removes deleted users left behind data"
6
+ task remove_deleted_users_left_data: :environment do
7
+ logger.info("=== Removing left behind data by 'Decidim::DestroyAccount'")
8
+ Decidim::User.where.not(deleted_at: nil).find_each do |deleted_user|
9
+ Decidim::Follow.where(followable: deleted_user).find_each(&:destroy)
10
+ Decidim::Follow.where(user: deleted_user).find_each(&:destroy)
11
+ Decidim::ParticipatorySpacePrivateUser.where(user: deleted_user).find_each(&:destroy)
12
+ Decidim::Gamification::BadgeScore.where(user: deleted_user).find_each(&:destroy)
13
+ Decidim::UserModeration.where(user: deleted_user).find_each(&:destroy)
14
+ Decidim::Endorsement.where(author: deleted_user).find_each(&:destroy)
15
+
16
+ Decidim.participatory_space_manifests.each do |space_manifest|
17
+ space_manifest.invoke_on_destroy_account(deleted_user)
18
+ end
19
+
20
+ deleted_user.identities.find_each(&:destroy)
21
+ deleted_user.versions.find_each(&:destroy)
22
+ deleted_user.private_exports.find_each(&:destroy)
23
+ deleted_user.access_grants.find_each(&:destroy)
24
+ deleted_user.access_tokens.find_each(&:destroy)
25
+ deleted_user.reminders.find_each(&:destroy)
26
+ deleted_user.notifications.find_each(&:destroy)
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ namespace :decidim do
4
+ namespace :upgrade do
5
+ desc "Delete follows of private users deleted from a private space"
6
+ task fix_deleted_private_follows: :environment do
7
+ Decidim::Organization.all.each do |organization|
8
+ spaces = organization.participatory_spaces.collect { |space| space if space.respond_to?(:private_space?) && space.private_space? }.compact_blank
9
+
10
+ next if spaces.blank?
11
+
12
+ spaces = spaces.map { |space| space.respond_to?(:is_transparent?) ? (space unless space.is_transparent?) : space }.compact_blank
13
+
14
+ next if spaces.blank?
15
+
16
+ organization.users.find_each do |user|
17
+ next unless user.following_follows.count.positive?
18
+
19
+ spaces.each do |space|
20
+ Decidim::Admin::DestroyPrivateUsersFollowsJob.perform_later(user, space)
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end