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.
- checksums.yaml +4 -4
- data/app/cells/decidim/card_g/show.erb +1 -1
- data/app/cells/decidim/notification/deleted.erb +12 -0
- data/app/cells/decidim/notification/not_available.erb +12 -0
- data/app/cells/decidim/notification_cell.rb +5 -1
- data/app/cells/decidim/share_widget/modal.erb +1 -1
- data/app/commands/decidim/destroy_account.rb +49 -4
- data/app/events/decidim/welcome_notification_event.rb +1 -1
- data/app/jobs/decidim/remove_search_indexes_job.rb +18 -0
- data/app/mailers/decidim/notifications_digest_mailer.rb +18 -1
- data/app/models/decidim/component.rb +3 -0
- data/app/models/decidim/notification.rb +12 -0
- data/app/models/decidim/user.rb +4 -0
- data/app/models/decidim/user_base_entity.rb +1 -1
- data/app/packs/src/decidim/controllers/multiple_mentions/controller.js +25 -2
- data/app/packs/src/decidim/editor/extensions/link/index.js +0 -1
- data/app/packs/src/decidim/editor/index.js +5 -1
- data/app/packs/src/decidim/editor/test/extensions/link.test.js +2 -2
- data/app/packs/src/decidim/editor/test/toolbar/shared/behaves_like_basic_link.js +1 -1
- data/app/packs/stylesheets/decidim/_conversations.scss +1 -1
- data/app/packs/stylesheets/decidim/_modal.scss +5 -1
- data/app/packs/stylesheets/decidim/_modal_fingerprint.scss +1 -1
- data/app/presenters/decidim/log/user_presenter.rb +2 -1
- data/app/presenters/decidim/organization_presenter.rb +4 -0
- data/app/presenters/decidim/user_presenter.rb +6 -1
- data/app/views/decidim/manifests/show.json.erb +1 -0
- data/app/views/decidim/pages/_tabbed.html.erb +1 -1
- data/app/views/decidim/shared/_orders.html.erb +1 -1
- data/app/views/layouts/decidim/header/_main_links_mobile_account.html.erb +15 -1
- data/config/locales/ar.yml +0 -4
- data/config/locales/bg.yml +0 -8
- data/config/locales/ca-IT.yml +13 -11
- data/config/locales/ca.yml +13 -11
- data/config/locales/cs.yml +19 -19
- data/config/locales/de.yml +9 -20
- data/config/locales/el.yml +0 -3
- data/config/locales/en.yml +19 -17
- data/config/locales/es-MX.yml +12 -10
- data/config/locales/es-PY.yml +12 -10
- data/config/locales/es.yml +11 -9
- data/config/locales/eu.yml +41 -40
- data/config/locales/fa-IR.yml +3 -0
- data/config/locales/fi-plain.yml +11 -8
- data/config/locales/fi.yml +11 -8
- data/config/locales/fr-CA.yml +20 -11
- data/config/locales/fr.yml +20 -11
- data/config/locales/ga-IE.yml +0 -4
- data/config/locales/gl.yml +0 -3
- data/config/locales/hu.yml +0 -6
- data/config/locales/id-ID.yml +0 -3
- data/config/locales/it.yml +0 -3
- data/config/locales/ja.yml +24 -22
- data/config/locales/ko.yml +3 -0
- data/config/locales/lb.yml +0 -3
- data/config/locales/lt.yml +0 -5
- data/config/locales/lv.yml +0 -3
- data/config/locales/mt.yml +3 -0
- data/config/locales/nl.yml +0 -3
- data/config/locales/no.yml +0 -3
- data/config/locales/pl.yml +11 -7
- data/config/locales/pt-BR.yml +626 -5
- data/config/locales/pt.yml +0 -3
- data/config/locales/ro-RO.yml +480 -121
- data/config/locales/ru.yml +0 -3
- data/config/locales/sk.yml +0 -3
- data/config/locales/sv.yml +28 -13
- data/config/locales/tr-TR.yml +0 -5
- data/config/locales/uk.yml +0 -3
- data/config/locales/vi.yml +3 -0
- data/config/locales/zh-CN.yml +0 -3
- data/config/locales/zh-TW.yml +0 -5
- data/db/data/20251125144141_add_short_name_to_organizations.rb +35 -0
- data/db/migrate/20251031150928_add_short_name_to_organization.rb +7 -0
- data/decidim-core.gemspec +1 -0
- data/lib/decidim/core/seeds.rb +2 -2
- data/lib/decidim/core/test/factories.rb +25 -0
- data/lib/decidim/core/test/shared_examples/comments_examples.rb +27 -1
- data/lib/decidim/core/test/shared_examples/fingerprint_examples.rb +13 -0
- data/lib/decidim/core/version.rb +1 -1
- data/lib/decidim/events/base_event.rb +4 -0
- data/lib/decidim/has_private_users.rb +1 -0
- data/lib/decidim/seeds.rb +1 -1
- data/lib/tasks/decidim_procfile.rake +1 -1
- data/lib/tasks/upgrade/decidim_remove_deleted_users_left_data_tasks.rake +30 -0
- data/lib/tasks/upgrade/fix_deleted_private_follows.rake +26 -0
- metadata +27 -6
data/config/locales/ru.yml
CHANGED
|
@@ -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:
|
data/config/locales/sk.yml
CHANGED
|
@@ -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}
|
data/config/locales/sv.yml
CHANGED
|
@@ -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:
|
|
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
|
|
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
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
|
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
|
|
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
|
data/config/locales/tr-TR.yml
CHANGED
|
@@ -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'
|
data/config/locales/uk.yml
CHANGED
|
@@ -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:
|
data/config/locales/vi.yml
CHANGED
data/config/locales/zh-CN.yml
CHANGED
|
@@ -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} 的帮助页面
|
data/config/locales/zh-TW.yml
CHANGED
|
@@ -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
|
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"
|
data/lib/decidim/core/seeds.rb
CHANGED
|
@@ -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::
|
|
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::
|
|
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
|
data/lib/decidim/core/version.rb
CHANGED
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::
|
|
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,
|
|
@@ -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
|