decidim-core 0.31.0 → 0.31.1

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 (86) 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 +1 -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 +12 -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/controllers/multiple_mentions/controller.js +25 -2
  16. data/app/packs/src/decidim/editor/extensions/link/index.js +0 -1
  17. data/app/packs/src/decidim/editor/index.js +5 -1
  18. data/app/packs/src/decidim/editor/test/extensions/link.test.js +2 -2
  19. data/app/packs/src/decidim/editor/test/toolbar/shared/behaves_like_basic_link.js +1 -1
  20. data/app/packs/stylesheets/decidim/_conversations.scss +1 -1
  21. data/app/packs/stylesheets/decidim/_modal.scss +5 -1
  22. data/app/packs/stylesheets/decidim/_modal_fingerprint.scss +1 -1
  23. data/app/presenters/decidim/log/user_presenter.rb +2 -1
  24. data/app/presenters/decidim/organization_presenter.rb +4 -0
  25. data/app/presenters/decidim/user_presenter.rb +6 -1
  26. data/app/views/decidim/manifests/show.json.erb +1 -0
  27. data/app/views/decidim/pages/_tabbed.html.erb +1 -1
  28. data/app/views/decidim/shared/_orders.html.erb +1 -1
  29. data/app/views/layouts/decidim/header/_main_links_mobile_account.html.erb +15 -1
  30. data/config/locales/ar.yml +0 -4
  31. data/config/locales/bg.yml +0 -8
  32. data/config/locales/ca-IT.yml +13 -11
  33. data/config/locales/ca.yml +13 -11
  34. data/config/locales/cs.yml +19 -19
  35. data/config/locales/de.yml +9 -20
  36. data/config/locales/el.yml +0 -3
  37. data/config/locales/en.yml +19 -17
  38. data/config/locales/es-MX.yml +12 -10
  39. data/config/locales/es-PY.yml +12 -10
  40. data/config/locales/es.yml +11 -9
  41. data/config/locales/eu.yml +41 -40
  42. data/config/locales/fa-IR.yml +3 -0
  43. data/config/locales/fi-plain.yml +11 -8
  44. data/config/locales/fi.yml +11 -8
  45. data/config/locales/fr-CA.yml +20 -11
  46. data/config/locales/fr.yml +20 -11
  47. data/config/locales/ga-IE.yml +0 -4
  48. data/config/locales/gl.yml +0 -3
  49. data/config/locales/hu.yml +0 -6
  50. data/config/locales/id-ID.yml +0 -3
  51. data/config/locales/it.yml +0 -3
  52. data/config/locales/ja.yml +24 -22
  53. data/config/locales/ko.yml +3 -0
  54. data/config/locales/lb.yml +0 -3
  55. data/config/locales/lt.yml +0 -5
  56. data/config/locales/lv.yml +0 -3
  57. data/config/locales/mt.yml +3 -0
  58. data/config/locales/nl.yml +0 -3
  59. data/config/locales/no.yml +0 -3
  60. data/config/locales/pl.yml +11 -7
  61. data/config/locales/pt-BR.yml +626 -5
  62. data/config/locales/pt.yml +0 -3
  63. data/config/locales/ro-RO.yml +480 -121
  64. data/config/locales/ru.yml +0 -3
  65. data/config/locales/sk.yml +0 -3
  66. data/config/locales/sv.yml +28 -13
  67. data/config/locales/tr-TR.yml +0 -5
  68. data/config/locales/uk.yml +0 -3
  69. data/config/locales/vi.yml +3 -0
  70. data/config/locales/zh-CN.yml +0 -3
  71. data/config/locales/zh-TW.yml +0 -5
  72. data/db/data/20251125144141_add_short_name_to_organizations.rb +35 -0
  73. data/db/migrate/20251031150928_add_short_name_to_organization.rb +7 -0
  74. data/decidim-core.gemspec +1 -0
  75. data/lib/decidim/core/seeds.rb +2 -2
  76. data/lib/decidim/core/test/factories.rb +25 -0
  77. data/lib/decidim/core/test/shared_examples/comments_examples.rb +27 -1
  78. data/lib/decidim/core/test/shared_examples/fingerprint_examples.rb +13 -0
  79. data/lib/decidim/core/version.rb +1 -1
  80. data/lib/decidim/events/base_event.rb +4 -0
  81. data/lib/decidim/has_private_users.rb +1 -0
  82. data/lib/decidim/seeds.rb +1 -1
  83. data/lib/tasks/decidim_procfile.rake +1 -1
  84. data/lib/tasks/upgrade/decidim_remove_deleted_users_left_data_tasks.rake +30 -0
  85. data/lib/tasks/upgrade/fix_deleted_private_follows.rake +26 -0
  86. metadata +27 -6
@@ -433,12 +433,9 @@ ru:
433
433
  proposals_explanation: Вносите новые предложения, поддерживайте уже внесенные и способствуйте изменениям, которые вы хотите видеть.
434
434
  footer_sub_hero:
435
435
  footer_sub_hero_headline: Добро пожаловать на площадку соучастия %{organization}!
436
- register: Зарегистрироваться
437
436
  hero:
438
437
  participate: Принять участие
439
438
  welcome: Добро пожаловать в %{organization}!
440
- sub_hero:
441
- register: Зарегистрироваться
442
439
  profile:
443
440
  deleted: Удаленный участник
444
441
  profiles:
@@ -616,12 +616,9 @@ sk:
616
616
  proposals_explanation: Urobiť návrhy, podporiť existujúce a podporovať zmeny, ktoré chcete vidieť.
617
617
  footer_sub_hero:
618
618
  footer_sub_hero_headline: Vitajte na%{organization} participatívnej platforme.
619
- register: Registrovať
620
619
  hero:
621
620
  participate: zúčastniť sa
622
621
  welcome: Vitajte na%{organization}!
623
- sub_hero:
624
- register: Registrovať
625
622
  index:
626
623
  standalone_pages: Stránky
627
624
  subheading: Prechádzajte stránky pomocníka%{name}
@@ -651,7 +651,7 @@ sv:
651
651
  email_already_exists: Ett annat konto använder samma e-postadress.
652
652
  new:
653
653
  complete_profile: Komplettera profil
654
- nickname_help: Ditt användarnamn i %{organization}. Kan bara innehålla bokstäver, siffror, '-' och '_'.
654
+ nickname_help: Ditt användarnamn i %{organization}. Kan bara innehålla små bokstäver a-z, siffror, '-' och '_'.
655
655
  sign_up: Var god slutför din profil
656
656
  subtitle: Slutför registreringen genom att fylla i följande formulär
657
657
  username_help: Offentligt namn som visas i dina inlägg. Du kan ange ett annat namn än ditt eget, om du vill vara anonym.
@@ -737,6 +737,8 @@ sv:
737
737
  created_at: Datum och tid då identiteten skapades
738
738
  id: Unikt id för identiteten
739
739
  provider: Leverantören av identiteten
740
+ messaging_conversations:
741
+ updated_at: Datum när denna konversation senast uppdaterades
740
742
  participatory_space_private_users:
741
743
  created_at: Datum och tid när den privata användaren skapades
742
744
  id: Unikt id för den privata användaren
@@ -753,7 +755,7 @@ sv:
753
755
  reason: Anledning till rapporteringen
754
756
  updated_at: Datum och tid för när rapporteringen senast uppdaterades
755
757
  users:
756
- about: Presentation av användaren
758
+ about: Profilbeskrivningen för denna deltagare
757
759
  accepted_tos_version: Det datum då användarvillkoren godkändes av användaren
758
760
  admin: Om användaren är administratör
759
761
  confirmation_sent_at: Datum och tid då bekräftelsen skickades
@@ -773,8 +775,9 @@ sv:
773
775
  locale: Användarens valda språk
774
776
  managed: Om användare hanteras av en annan användare
775
777
  name: Namnet på användaren
776
- newsletter_notifications_at: Datum och tid när användaren senast fick ett nyhetsbrev
778
+ newsletter_notifications_at: Datum och tid när denna deltagare prenumererade på att få ett nyhetsbrev
777
779
  nickname: Användarens användarnamn
780
+ officialized_as: Officiantens titel (kommunalråd, borgmästare, etc)
778
781
  editor_images:
779
782
  create:
780
783
  error: Fel vid uppladdning av bild.
@@ -784,7 +787,7 @@ sv:
784
787
  files:
785
788
  file_cannot_be_processed: Filen kan inte bearbetas
786
789
  file_resolution_too_large: Filupplösningen är för stor
787
- not_inside_organization: Filen är inte kopplad till någon organisation
790
+ not_inside_organization: Filen är inte kopplad till någon organisation.
788
791
  internal_server_error:
789
792
  copied: Texten har kopierats!
790
793
  copy_error_message_clarification: Kopiera felmeddelandet till urklipp
@@ -884,7 +887,7 @@ sv:
884
887
  email_intro: |-
885
888
  Din %{resource_type} är inte längre synlig.<br>
886
889
  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.
887
- email_outro: Du har fått det här meddelandet eftersom du är en författare till %{resource_type}.
890
+ email_outro: Du har fått det här meddelandet eftersom du är författare till %{resource_type}.
888
891
  email_subject: Din %{resource_type} är inte längre synlig
889
892
  notification_title: |-
890
893
  Din %{resource_type} är inte längre synlig.<br>
@@ -972,6 +975,7 @@ sv:
972
975
  file:
973
976
  explanation: 'Instruktioner för fil:'
974
977
  message_1: Måste vara en bild eller ett dokument.
978
+ message_2: Om det är en bild så använd helst en landskapsbild som inte har någon text. Plattformen beskär bilden.
975
979
  icon:
976
980
  explanation: 'Instruktioner för ikon:'
977
981
  message_1: Måste vara en kvadratisk bild.
@@ -1002,6 +1006,7 @@ sv:
1002
1006
  title_required: Titel måste fyllas i!
1003
1007
  uploaded: Uppladdad
1004
1008
  validating: Validerar...
1009
+ validation_error: Valideringsfel! Kontrollera att filen har en tillåten filtyp eller storlek.
1005
1010
  select_file: Välj fil
1006
1011
  upload_help:
1007
1012
  dropzone: Släpp filer här eller klicka på knappen för att ladda upp
@@ -1212,8 +1217,10 @@ sv:
1212
1217
  action_error: Det gick inte att uppdatera inställningen för meddelanden.
1213
1218
  no_notifications: Inga meddelanden ännu.
1214
1219
  show:
1220
+ deleted: Innehållet har tagits bort av författaren.
1215
1221
  missing_event: Hoppsan, det här meddelandet tillhör ett objekt som inte längre är tillgängligt. Du kan kasta det.
1216
- moderated: Innehåll modererat
1222
+ moderated: Innehållet har dolts av moderator.
1223
+ not_available: Hoppsan, det här meddelandet tillhör ett objekt som inte längre är tillgängligt. Du kan kasta det.
1217
1224
  notifications_digest_mailer:
1218
1225
  header:
1219
1226
  daily: Dagligt sammandrag
@@ -1221,6 +1228,7 @@ sv:
1221
1228
  hello: Hej %{name},
1222
1229
  intro:
1223
1230
  daily: 'Det här är meddelandena från senaste dagen baserat på aktiviteterna du följer:'
1231
+ real_time: 'Detta är en notis om aktiviteten du följer:'
1224
1232
  weekly: 'Det här är meddelandena från senaste veckan baserat på aktiviteterna du följer:'
1225
1233
  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.
1226
1234
  see_more: Visa fler meddelanden
@@ -1266,11 +1274,15 @@ sv:
1266
1274
  resources:
1267
1275
  one: "%{count} Resurs"
1268
1276
  other: "%{count} Resurser"
1277
+ index:
1278
+ license:
1279
+ license_contents_link: https://opendatacommons.org/licenses/dbcl/1.0/
1280
+ license_database_link: https://opendatacommons.org/licenses/odbl/1.0/
1269
1281
  not_available_yet: De öppna datafilerna är ännu inte tillgängliga, var vänlig försök igen om några minuter.
1270
1282
  pad_iframe:
1271
1283
  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.
1272
1284
  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.
1273
- pad: Memo
1285
+ pad: Anteckningar
1274
1286
  pages:
1275
1287
  home:
1276
1288
  extended:
@@ -1285,7 +1297,7 @@ sv:
1285
1297
  footer_sub_hero:
1286
1298
  footer_sub_hero_body_html: Låt oss skapa ett mer öppet, transparent och deltagande samhälle.<br /> Gå med, delta och fatta beslut.
1287
1299
  footer_sub_hero_headline: Välkommen till %{organization} deltagarplattform.
1288
- register: Registrera dig
1300
+ register: Skapa ett konto
1289
1301
  hero:
1290
1302
  participate: Delta
1291
1303
  participate_title: Delta i plattformens processer
@@ -1293,7 +1305,7 @@ sv:
1293
1305
  statistics:
1294
1306
  headline: Statistik
1295
1307
  sub_hero:
1296
- register: Registrera
1308
+ register: Skapa ett konto
1297
1309
  register_title: Skapa ett konto
1298
1310
  index:
1299
1311
  standalone_pages: Sidor
@@ -1497,8 +1509,11 @@ sv:
1497
1509
  pages_count: Sidor
1498
1510
  participants_count: Deltagare
1499
1511
  participants_count_tooltip: Antalet unika användare som har interagerat i detta område genom att lägga fram förslag, delta i möten, rösta eller delta i diskussioner.
1512
+ surveys_count: Enkäter
1500
1513
  users_count: Deltagare
1501
1514
  users_count_tooltip: Det totala antalet användare som har registrerat sig och bekräftat sitt konto via e-post.
1515
+ tags:
1516
+ filter_results_for_taxonomy: 'Filtrera resultat: %{resource}'
1502
1517
  translation_bar:
1503
1518
  help_text: "<strong>Obs:</strong> Innehåll kan ha översatts automatiskt och inte vara 100% korrekt."
1504
1519
  show_original: Visa originaltexten
@@ -1527,7 +1542,7 @@ sv:
1527
1542
  version:
1528
1543
  show:
1529
1544
  back_to_resource: Gå tillbaka
1530
- changes_at_title: Ändringar "%{title}"
1545
+ changes_at_title: Ändringar av "%{title}"
1531
1546
  number_of_versions: Versioner
1532
1547
  version_created_at: Version skapad
1533
1548
  versions:
@@ -1567,7 +1582,7 @@ sv:
1567
1582
  invitations:
1568
1583
  edit:
1569
1584
  header: Slutför skapandet av ditt konto
1570
- nickname_help: Ditt användarnamn för %{organization}. Kan bara innehålla bokstäver, siffror, '-' och '_'.
1585
+ nickname_help: Ditt användarnamn i %{organization}. Kan bara innehålla små bokstäver a-z, siffror, '-' och '_'.
1571
1586
  submit_button: Spara
1572
1587
  subtitle: Om du godkänner inbjudan väljer du ditt användarnamn och lösenord.
1573
1588
  invitation_removed: Din inbjudan har tagits bort.
@@ -1607,8 +1622,6 @@ sv:
1607
1622
  subject: Du har blivit inbjuden att hantera %{organization}
1608
1623
  invite_collaborator:
1609
1624
  subject: Du har blivit inbjuden att samarbeta på %{organization}
1610
- invite_private_user:
1611
- subject: Du har blivit inbjuden till en privat deltagarprocess på %{organization}
1612
1625
  organization_admin_invitation_instructions:
1613
1626
  subject: Du har blivit inbjuden att hantera %{organization}
1614
1627
  password_change:
@@ -1887,6 +1900,8 @@ sv:
1887
1900
  expire_time_html: Din session löper ut om <b><span data-impersonation-warning-target="minutes">%{minutes}</span> minuter</b>.
1888
1901
  language_chooser:
1889
1902
  choose_language: Välj språk
1903
+ navigation:
1904
+ aria_label: 'Navigation menu: %{title}'
1890
1905
  notifications_dashboard:
1891
1906
  mark_all_as_read: Markera allt som läst
1892
1907
  mark_as_read: Markera som läst
@@ -678,8 +678,6 @@ tr:
678
678
  subject: '%{organization_name} ile ilgili bilgileri almaya devam etmek istiyor musunuz?'
679
679
  notifications:
680
680
  no_notifications: Henüz bildirim yok.
681
- show:
682
- moderated: İçerik Denetlendi
683
681
  notifications_settings:
684
682
  show:
685
683
  direct_messages: Herkesten doğrudan mesaj alın
@@ -710,12 +708,9 @@ tr:
710
708
  proposals_explanation: Öneriler yapın, mevcut olanları destekleyin ve görmek istediğiniz değişiklikleri tanıtın.
711
709
  footer_sub_hero:
712
710
  footer_sub_hero_headline: '%{organization} katılımcı platformuna hoş geldiniz.'
713
- register: Kayıt Ol
714
711
  hero:
715
712
  participate: Katıl
716
713
  welcome: '%{organization} hoşgeldin!'
717
- sub_hero:
718
- register: Kayıt Ol
719
714
  index:
720
715
  standalone_pages: Sayfalar
721
716
  subheading: '%{name} yardım sayfalarını ziyaret edin'
@@ -361,12 +361,9 @@ uk:
361
361
  proposals_explanation: Вносьте нові пропозиції, підтримуйте існуючі та сприяйте змінам, які ви хочете бачити.
362
362
  footer_sub_hero:
363
363
  footer_sub_hero_headline: Ласкаво просимо до майданчику співучасті %{organization}!
364
- register: Зареєструватися
365
364
  hero:
366
365
  participate: Взяти участь
367
366
  welcome: Ласкаво просимо до %{organization}!
368
- sub_hero:
369
- register: Зареєструватися
370
367
  profile:
371
368
  deleted: Видалений учасник
372
369
  profiles:
@@ -1 +1,4 @@
1
+ ---
1
2
  vi:
3
+ locale:
4
+ name: tiếng Việt
@@ -628,12 +628,9 @@ zh-CN:
628
628
  proposals_explanation: 提出建议、支持现有建议并促进你想要看到的更改。
629
629
  footer_sub_hero:
630
630
  footer_sub_hero_headline: 欢迎使用 %{organization} 参与式平台。
631
- register: 注册
632
631
  hero:
633
632
  participate: 参与
634
633
  welcome: 欢迎使用 %{organization}!
635
- sub_hero:
636
- register: 注册
637
634
  index:
638
635
  standalone_pages: 页 次
639
636
  subheading: 浏览 %{name} 的帮助页面
@@ -953,13 +953,10 @@ zh-TW:
953
953
  proposals_explanation: 提出建議、支持現有建議並推動您希望看到的變化。
954
954
  footer_sub_hero:
955
955
  footer_sub_hero_headline: 歡迎來到 %{organization} 的參與平台。
956
- register: 註冊
957
956
  hero:
958
957
  participate: 參與
959
958
  participate_title: 參與平台的流程
960
959
  welcome: 歡迎來到 %{organization}!
961
- sub_hero:
962
- register: 註冊
963
960
  index:
964
961
  standalone_pages: 頁
965
962
  subheading: 瀏覽 %{name} 的幫助頁面
@@ -1199,8 +1196,6 @@ zh-TW:
1199
1196
  subject: 你已經被邀請成為 %{organization} 的管理者
1200
1197
  invite_collaborator:
1201
1198
  subject: 你已獲邀成為 %{organization} 的協作者
1202
- invite_private_user:
1203
- subject: 您已被邀請參加 %{organization} 的私密參與過程。
1204
1199
  organization_admin_invitation_instructions:
1205
1200
  subject: 你已經被邀請成為 %{organization} 的管理者
1206
1201
  password_change:
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ class AddShortNameToOrganizations < ActiveRecord::Migration[7.2]
4
+ class Organization < ApplicationRecord
5
+ self.table_name = "decidim_organizations"
6
+ end
7
+
8
+ def up
9
+ Organization.find_each do |organization|
10
+ # Skip if short_name is already populated
11
+ next if organization.short_name.present? && organization.short_name != {}
12
+
13
+ next if organization.name.blank?
14
+
15
+ short_name_hash = {}
16
+ organization.name.each do |locale, name_value|
17
+ # Skip machine_translations and other nested hashes
18
+ next if name_value.is_a?(Hash)
19
+ next if name_value.blank?
20
+
21
+ generated_short_name = name_value.gsub(/\s+/, "")[0, 12]
22
+ next if generated_short_name.length < 3
23
+
24
+ short_name_hash[locale] = generated_short_name
25
+ end
26
+
27
+ # Only update if we have a valid short_name to set, otherwise leave as empty hash
28
+ organization.update_column(:short_name, short_name_hash) unless short_name_hash.empty? # rubocop:disable Rails/SkipsModelValidations
29
+ end
30
+ end
31
+
32
+ def down
33
+ raise ActiveRecord::IrreversibleMigration
34
+ end
35
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ class AddShortNameToOrganization < ActiveRecord::Migration[7.2]
4
+ def change
5
+ add_column :decidim_organizations, :short_name, :jsonb, null: false, default: {}
6
+ end
7
+ 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 "connection_pool", "< 3"
44
45
  s.add_dependency "data_migrate", "~> 11.3"
45
46
  s.add_dependency "date_validator", "~> 0.12.0"
46
47
  s.add_dependency "devise", "~> 4.7"
@@ -140,7 +140,7 @@ module Decidim
140
140
  end
141
141
 
142
142
  def create_organization!
143
- smtp_label = ENV.fetch("SMTP_FROM_LABEL", ::Faker::Twitter.unique.screen_name)
143
+ smtp_label = ENV.fetch("SMTP_FROM_LABEL", ::Faker::X.unique.screen_name)
144
144
  smtp_email = ENV.fetch("SMTP_FROM_EMAIL", ::Faker::Internet.email)
145
145
 
146
146
  primary_color, secondary_color, tertiary_color = [
@@ -168,7 +168,7 @@ module Decidim
168
168
  from: "#{smtp_label} <#{smtp_email}>",
169
169
  from_email: smtp_email,
170
170
  from_label: smtp_label,
171
- user_name: ENV.fetch("SMTP_USERNAME", ::Faker::Twitter.unique.screen_name),
171
+ user_name: ENV.fetch("SMTP_USERNAME", ::Faker::X.unique.screen_name),
172
172
  encrypted_password: Decidim::AttributeEncryptor.encrypt(ENV.fetch("SMTP_PASSWORD", ::Faker::Internet.password(min_length: 8))),
173
173
  address: ENV.fetch("SMTP_ADDRESS", nil) || ENV.fetch("DECIDIM_HOST", "localhost"),
174
174
  port: ENV.fetch("SMTP_PORT", nil) || ENV.fetch("DECIDIM_SMTP_PORT", "25")
@@ -117,6 +117,11 @@ FactoryBot.define do
117
117
  Decidim.available_locales.index_with { |_locale| Faker::Company.unique.name }
118
118
  end
119
119
 
120
+ # we do not want machine translation here
121
+ short_name do
122
+ Decidim.available_locales.index_with { |_locale| Faker::Company.unique.name.gsub(/\s+/, "")[0, 12] }
123
+ end
124
+
120
125
  reference_prefix { Faker::Name.suffix }
121
126
  time_zone { "UTC" }
122
127
  twitter_handler { Faker::Hipster.word }
@@ -205,6 +210,14 @@ FactoryBot.define do
205
210
  previous_passwords { [] }
206
211
  extended_data { {} }
207
212
 
213
+ trait :malicious do
214
+ after :create do |user|
215
+ # rubocop:disable Rails/SkipsModelValidations
216
+ user.update_column(:name, "user_#{user.id}\n<script>alert('name')</script>")
217
+ # rubocop:enable Rails/SkipsModelValidations
218
+ end
219
+ end
220
+
208
221
  trait :confirmed do
209
222
  confirmed_at { Time.current }
210
223
  end
@@ -864,6 +877,18 @@ FactoryBot.define do
864
877
  scopes { "profile" }
865
878
  end
866
879
 
880
+ factory :oauth_access_grant, class: "Doorkeeper::AccessGrant" do
881
+ transient do
882
+ skip_injection { false }
883
+ organization { create(:organization) }
884
+ end
885
+ resource_owner_id { create(:user, organization: application.organization, skip_injection:).id }
886
+ application { create(:oauth_application, organization:, skip_injection:) }
887
+ redirect_uri { "https://app.com/callback" }
888
+ expires_in { 100 }
889
+ scopes { "public write" }
890
+ end
891
+
867
892
  factory :private_export, class: "Decidim::PrivateExport" do
868
893
  transient do
869
894
  skip_injection { false }
@@ -13,6 +13,32 @@ 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
+
19
+ before do
20
+ # rubocop:disable Rails/SkipsModelValidations
21
+ comments.each do |comment|
22
+ comment.author.update_column(:name, "user_#{comment.author.id}\n<script>alert('name')</script>") if comment.author.is_a?(Decidim::UserBaseEntity)
23
+ end
24
+ # rubocop:enable Rails/SkipsModelValidations
25
+ end
26
+
27
+ it "properly displays the user name" do
28
+ login_as user, scope: :user
29
+ visit resource_path
30
+
31
+ within "#add-comment-anchor" do
32
+ within "form#new_comment_for_#{commentable.commentable_type.demodulize}_#{commentable.id}" do
33
+ expect(page).to have_css("p.comment__as-author-name")
34
+ within "p.comment__as-author-name" do
35
+ expect(page).to have_content("user_#{user.id} alert('name')")
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+
16
42
  it "shows the list of comments for the resource" do
17
43
  visit resource_path
18
44
 
@@ -21,7 +47,7 @@ shared_examples "comments" do
21
47
 
22
48
  within "#comments" do
23
49
  comments.each do |comment|
24
- expect(page).to have_content comment.author.name
50
+ expect(page).to have_content decidim_sanitize_translated(comment.author.name).gsub("\n", " ")
25
51
  expect(page).to have_content comment.body.values.first
26
52
  end
27
53
  end
@@ -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
@@ -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"
7
+ "0.31.1"
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
@@ -29,7 +29,7 @@ module Decidim
29
29
  user = Decidim::User.find_or_initialize_by(email:)
30
30
  user.update!(
31
31
  name: ::Faker::Name.name,
32
- nickname: "#{::Faker::Twitter.unique.screen_name}-#{rand(10_000)}"[0...20],
32
+ nickname: "#{::Faker::X.unique.screen_name}-#{rand(10_000)}"[0...20],
33
33
  password: "decidim123456789",
34
34
  organization:,
35
35
  confirmed_at: Time.current,
@@ -23,7 +23,7 @@ set -e
23
23
 
24
24
  bundle check || bundle install --jobs 20 --retry 5
25
25
 
26
- bin/rails decidim:upgrade db:migrate
26
+ bin/rails decidim:upgrade db:migrate data:migrate
27
27
 
28
28
  if ! gem list foreman -i --silent; then
29
29
  echo "Installing foreman..."
@@ -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::Like.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