diff --git a/locale/fr/LC_MESSAGES/django.po b/locale/fr/LC_MESSAGES/django.po index 94750a7..3d7548e 100644 --- a/locale/fr/LC_MESSAGES/django.po +++ b/locale/fr/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: TFJM\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-19 23:07+0100\n" +"POT-Creation-Date: 2025-03-19 23:56+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Emmy D'Anello \n" "Language-Team: LANGUAGE \n" @@ -37,7 +37,7 @@ msgstr "Canaux d'équipes" msgid "Private channels" msgstr "Messages privés" -#: chat/models.py:29 participation/models.py:37 participation/models.py:273 +#: chat/models.py:29 participation/models.py:36 participation/models.py:272 #: participation/tables.py:18 participation/tables.py:34 msgid "name" msgstr "nom" @@ -78,9 +78,9 @@ msgstr "Type de permission nécessaire pour écrire un message dans un canal." #: chat/models.py:62 draw/admin.py:53 draw/admin.py:71 draw/admin.py:88 #: draw/models.py:27 participation/admin.py:79 participation/admin.py:144 -#: participation/admin.py:176 participation/models.py:789 -#: participation/models.py:813 participation/models.py:1137 -#: registration/models.py:763 +#: participation/admin.py:176 participation/models.py:788 +#: participation/models.py:812 participation/models.py:1151 +#: registration/models.py:780 #: registration/templates/registration/payment_form.html:53 msgid "tournament" msgstr "tournoi" @@ -95,7 +95,7 @@ msgstr "" #: chat/models.py:73 draw/models.py:446 draw/models.py:473 #: participation/admin.py:140 participation/admin.py:160 -#: participation/models.py:1672 participation/models.py:1681 +#: participation/models.py:1686 participation/models.py:1695 #: participation/tables.py:84 msgid "pool" msgstr "poule" @@ -108,10 +108,10 @@ msgstr "" "concernée." #: chat/models.py:84 draw/templates/draw/tournament_content.html:277 -#: participation/admin.py:172 participation/models.py:262 -#: participation/models.py:804 +#: participation/admin.py:172 participation/models.py:261 +#: participation/models.py:803 #: participation/templates/participation/tournament_harmonize.html:15 -#: registration/models.py:158 registration/models.py:754 +#: registration/models.py:159 registration/models.py:771 #: registration/tables.py:39 #: registration/templates/registration/payment_form.html:52 #: survey/templates/survey/survey_detail.html:60 @@ -260,13 +260,13 @@ msgid "Log in" msgstr "Connexion" #: draw/admin.py:39 draw/admin.py:57 draw/admin.py:75 -#: participation/admin.py:109 participation/models.py:263 +#: participation/admin.py:109 participation/models.py:262 #: participation/tables.py:88 msgid "teams" msgstr "équipes" #: draw/admin.py:92 draw/models.py:245 draw/models.py:465 -#: participation/models.py:1141 +#: participation/models.py:1155 msgid "round" msgstr "tour" @@ -645,7 +645,7 @@ msgstr "Le numéro du tour doit être entre 1 et {nb}." msgid "rounds" msgstr "tours" -#: draw/models.py:268 participation/models.py:1149 +#: draw/models.py:268 participation/models.py:1163 msgid "letter" msgstr "lettre" @@ -683,12 +683,12 @@ msgstr "L'instance complète de la poule." msgid "Pool {letter}{number}" msgstr "Poule {letter}{number}" -#: draw/models.py:447 participation/models.py:1673 +#: draw/models.py:447 participation/models.py:1687 msgid "pools" msgstr "poules" -#: draw/models.py:459 participation/models.py:1127 participation/models.py:1892 -#: participation/models.py:1926 participation/models.py:1968 +#: draw/models.py:459 participation/models.py:1141 participation/models.py:1906 +#: participation/models.py:1940 participation/models.py:1982 msgid "participation" msgstr "participation" @@ -712,8 +712,8 @@ msgid "" msgstr "" "L'ordre de choix dans la poule, entre 0 et la taille de la poule moins 1." -#: draw/models.py:496 draw/models.py:519 participation/models.py:1258 -#: participation/models.py:1695 participation/models.py:1933 +#: draw/models.py:496 draw/models.py:519 participation/models.py:1272 +#: participation/models.py:1709 participation/models.py:1947 #: participation/views.py:1501 participation/views.py:1766 #, python-brace-format msgid "Problem #{problem}" @@ -921,7 +921,7 @@ msgstr "Vous n'êtes pas dans une équipe." msgid "Logs" msgstr "Logs" -#: logs/models.py:22 registration/models.py:35 +#: logs/models.py:22 registration/models.py:36 msgid "user" msgstr "utilisateur" @@ -986,34 +986,39 @@ msgstr "Changelog de type \"{action}\" pour le modèle {model} le {timestamp}" msgid "valid" msgstr "valide" -#: participation/admin.py:87 participation/models.py:825 +#: participation/admin.py:87 participation/models.py:824 msgid "selected for final" msgstr "sélectionnée pour la finale" #: participation/admin.py:124 participation/admin.py:188 -#: participation/models.py:1702 participation/tables.py:114 +#: participation/models.py:1716 participation/tables.py:114 msgid "reporter" msgstr "défenseur⋅se" -#: participation/admin.py:128 participation/models.py:1709 -#: participation/models.py:1980 +#: participation/admin.py:128 participation/models.py:1723 +#: participation/models.py:1994 msgid "opponent" msgstr "opposant⋅e" -#: participation/admin.py:132 participation/models.py:1716 -#: participation/models.py:1981 +#: participation/admin.py:132 participation/models.py:1730 +#: participation/models.py:1995 msgid "reviewer" msgstr "rapporteur⋅rice" -#: participation/admin.py:136 participation/models.py:1723 -#: participation/models.py:1982 +#: participation/admin.py:136 participation/models.py:1737 +#: participation/models.py:1996 msgid "observer" msgstr "observateur⋅rice" -#: participation/admin.py:192 participation/models.py:1931 +#: participation/admin.py:192 participation/models.py:1945 msgid "problem" msgstr "numéro de problème" +#: participation/apps.py:14 participation/models.py:1142 +#: participation/models.py:1185 +msgid "participations" +msgstr "participations" + #: participation/forms.py:30 msgid "This name is already used." msgstr "Ce nom est déjà utilisé." @@ -1130,32 +1135,32 @@ msgstr "Ce⋅tte défenseur⋅se ne travaille pas sur ce problème." msgid "The PDF file must not have more than 2 pages." msgstr "Le fichier PDF ne doit pas avoir plus de 2 pages." -#: participation/models.py:43 +#: participation/models.py:42 msgid "code" msgstr "code" -#: participation/models.py:44 +#: participation/models.py:43 #, python-brace-format msgid "The code must be composed of {nb_letters} uppercase letters." msgstr "Le code doit être composé de {nb_letters} lettres majuscules." -#: participation/models.py:50 +#: participation/models.py:49 msgid "This team code is forbidden." msgstr "Ce code d'équipe est interdit." -#: participation/models.py:56 +#: participation/models.py:55 msgid "access code" msgstr "code d'accès" -#: participation/models.py:57 +#: participation/models.py:56 msgid "The access code let other people to join the team." msgstr "Le code d'accès permet aux autres participants de rejoindre l'équipe." -#: participation/models.py:61 +#: participation/models.py:60 msgid "motivation letter" msgstr "lettre de motivation" -#: participation/models.py:102 +#: participation/models.py:101 #, python-brace-format msgid "" "The team {trigram} is not registered to any tournament. You can register the " @@ -1164,11 +1169,11 @@ msgstr "" "L'équipe {trigram} n'est inscrite à aucun tournoi. Vous pouvez inscrire " "l'équipe à un tournoi en cliquant sur ce lien." -#: participation/models.py:107 +#: participation/models.py:106 msgid "No tournament" msgstr "Pas de tournoi" -#: participation/models.py:113 +#: participation/models.py:112 msgid "" "Registrations for the tournament of {tournament} are ending on the {date:%Y-" "%m-%d %H:%M}." @@ -1176,11 +1181,11 @@ msgstr "" "Les inscriptions pour le tournoi de {tournament} se terminent le {date:%d/%m/" "%Y %H:%M}." -#: participation/models.py:118 +#: participation/models.py:117 msgid "Registrations closure" msgstr "Clôture des inscriptions" -#: participation/models.py:125 +#: participation/models.py:124 #, python-brace-format msgid "" "The team {trigram} has not uploaded a motivation letter. You can upload your " @@ -1190,11 +1195,11 @@ msgstr "" "envoyer votre lettre de motivation en cliquant sur ce lien." -#: participation/models.py:130 +#: participation/models.py:129 msgid "No motivation letter" msgstr "Pas de lettre de motivation" -#: participation/models.py:139 +#: participation/models.py:138 #, python-brace-format msgid "" "The team {trigram} has less than 4 students ({nb_students}). You can invite " @@ -1204,11 +1209,11 @@ msgstr "" "plus d'élèves à rejoindre l'équipe en utilisant le code d'invitation " "{code}." -#: participation/models.py:144 +#: participation/models.py:143 msgid "Not enough students" msgstr "Pas assez d'élèves" -#: participation/models.py:151 +#: participation/models.py:150 #, python-brace-format msgid "" "The team {trigram} has no coach. You can invite a coach to join the team " @@ -1218,11 +1223,11 @@ msgstr "" "encadrant⋅e à rejoindre l'équipe en utilisant le code d'invitation " "{code}." -#: participation/models.py:155 +#: participation/models.py:154 msgid "No coach" msgstr "Pas d'encadrant⋅e" -#: participation/models.py:162 +#: participation/models.py:161 #, python-brace-format msgid "" "The team {trigram} has more than 6 students ({nb_students}) or more than 2 " @@ -1233,11 +1238,11 @@ msgstr "" "encadrant⋅es ({nb_coaches}). Vous devez restreindre le nombre d'élèves et " "d'encadrant⋅es à 6 et 2, respectivement." -#: participation/models.py:167 +#: participation/models.py:166 msgid "Too many members" msgstr "Trop de membres" -#: participation/models.py:174 +#: participation/models.py:173 #, python-brace-format msgid "" "The team {trigram} is ready to be validated. You can request validation on " @@ -1246,11 +1251,11 @@ msgstr "" "L'équipe {trigram} est prête à être validée. Vous pouvez demander la " "validation sur la page de votre équipe." -#: participation/models.py:179 participation/models.py:190 +#: participation/models.py:178 participation/models.py:189 msgid "Validate team" msgstr "Valider l'équipe" -#: participation/models.py:185 +#: participation/models.py:184 #, python-brace-format msgid "" "The team {trigram} has enough participants, but is not ready to be " @@ -1263,7 +1268,7 @@ msgstr "" "documents requis. Pour inviter plus de participant⋅es, utilisez le code " "d'invitation {code}." -#: participation/models.py:196 +#: participation/models.py:195 #, python-brace-format msgid "" "The team {trigram} has not been validated by the organizers yet. Please be " @@ -1272,227 +1277,227 @@ msgstr "" "L'équipe {trigram} n'a pas encore été validée par les organisateurices. " "Merci de patienter." -#: participation/models.py:199 registration/models.py:582 +#: participation/models.py:198 registration/models.py:599 msgid "Pending validation" msgstr "Validation en attente" -#: participation/models.py:242 +#: participation/models.py:241 #, python-brace-format msgid "The team code must be composed of {nb_letters} uppercase letters." msgstr "Le code d'équipe doit être composé de {nb_letters} lettres majuscules." -#: participation/models.py:259 +#: participation/models.py:258 #, python-brace-format msgid "Team {name} ({trigram})" msgstr "Équipe {name} ({trigram})" -#: participation/models.py:278 +#: participation/models.py:277 msgid "start" msgstr "début" -#: participation/models.py:283 +#: participation/models.py:282 msgid "end" msgstr "fin" -#: participation/models.py:288 +#: participation/models.py:287 msgid "unified registration" msgstr "inscription unifiée" -#: participation/models.py:294 +#: participation/models.py:293 #: participation/templates/participation/tournament_detail.html:18 msgid "place" msgstr "lieu" -#: participation/models.py:298 +#: participation/models.py:297 msgid "max team count" msgstr "nombre maximal d'équipes" -#: participation/models.py:303 +#: participation/models.py:302 #: participation/templates/participation/tournament_detail.html:22 msgid "price" msgstr "prix" -#: participation/models.py:308 +#: participation/models.py:307 #: participation/templates/participation/tournament_detail.html:26 msgid "remote" msgstr "à distance" -#: participation/models.py:313 +#: participation/models.py:312 msgid "limit date for registrations" msgstr "date limite d'inscription" -#: participation/models.py:318 +#: participation/models.py:317 msgid "limit date to upload solutions" msgstr "date limite pour envoyer les solutions" -#: participation/models.py:323 +#: participation/models.py:322 msgid "random draw for solutions" msgstr "tirage au sort des solutions" -#: participation/models.py:328 +#: participation/models.py:327 msgid "first phase date" msgstr "date du premier tour" -#: participation/models.py:333 +#: participation/models.py:332 msgid "limit date to upload the written reviews for the first phase" msgstr "date limite pour envoyer les notes de synthèses pour la première phase" -#: participation/models.py:338 +#: participation/models.py:337 msgid "first second date" msgstr "date du second tour" -#: participation/models.py:343 +#: participation/models.py:342 msgid "check this case when solutions for the second round become available" msgstr "" "cocher la case lorsque les solutions pour le second tour sont accessibles" -#: participation/models.py:348 +#: participation/models.py:347 msgid "limit date to upload the written reviews for the second phase" msgstr "date limite d'envoi des notes de synthèse pour la seconde phase" -#: participation/models.py:353 +#: participation/models.py:352 msgid "third phase date" msgstr "date du troisième tour" -#: participation/models.py:358 +#: participation/models.py:357 msgid "check this case when solutions for the third round become available" msgstr "" "cocher la case lorsque les solutions pour le second tour sont accessibles" -#: participation/models.py:363 +#: participation/models.py:362 msgid "limit date to upload the written reviews for the third phase" msgstr "" "date limite pour envoyer les notes de synthèses pour la troisième phase" -#: participation/models.py:368 +#: participation/models.py:367 #: participation/templates/participation/tournament_detail.html:52 msgid "description" msgstr "description" -#: participation/models.py:374 +#: participation/models.py:373 #: participation/templates/participation/tournament_detail.html:12 msgid "organizers" msgstr "organisateur⋅rices" -#: participation/models.py:379 +#: participation/models.py:378 #: participation/templates/participation/team_detail.html:167 msgid "final" msgstr "finale" -#: participation/models.py:387 +#: participation/models.py:386 msgid "Google Sheet ID" msgstr "ID de la feuille Google Sheets" -#: participation/models.py:467 participation/views.py:1820 +#: participation/models.py:466 participation/views.py:1820 msgid "Notation sheet" msgstr "Feuille de notation" -#: participation/models.py:479 participation/models.py:480 -#: participation/models.py:482 participation/models.py:722 +#: participation/models.py:478 participation/models.py:479 +#: participation/models.py:481 participation/models.py:721 msgid "Final ranking" msgstr "Classement final" -#: participation/models.py:487 participation/models.py:559 -#: participation/models.py:1333 participation/views.py:1740 +#: participation/models.py:486 participation/models.py:558 +#: participation/models.py:1347 participation/views.py:1740 #: survey/templates/survey/survey_detail.html:58 msgid "Team" msgstr "Équipe" -#: participation/models.py:487 +#: participation/models.py:486 msgid "Scores day 1" msgstr "Scores jour 1" -#: participation/models.py:487 +#: participation/models.py:486 msgid "Tweaks day 1" msgstr "Ajustements 1" -#: participation/models.py:488 +#: participation/models.py:487 msgid "Scores day 2" msgstr "Scores jour 2" -#: participation/models.py:488 +#: participation/models.py:487 msgid "Tweaks day 2" msgstr "Ajustements 2" -#: participation/models.py:489 +#: participation/models.py:488 msgid "Total D1 + D2" msgstr "Total J1 + J2" -#: participation/models.py:489 +#: participation/models.py:488 msgid "Scores day 3" msgstr "Scores jour 3" -#: participation/models.py:489 +#: participation/models.py:488 msgid "Tweaks day 3" msgstr "Ajustements 3" -#: participation/models.py:491 participation/models.py:1333 +#: participation/models.py:490 participation/models.py:1347 #: participation/views.py:1747 msgid "Total" msgstr "Total" -#: participation/models.py:491 participation/models.py:559 -#: participation/models.py:1333 +#: participation/models.py:490 participation/models.py:558 +#: participation/models.py:1347 #: participation/templates/participation/tournament_harmonize.html:14 #: participation/views.py:1750 msgid "Rank" msgstr "Rang" -#: participation/models.py:508 participation/models.py:522 -#: participation/models.py:539 participation/models.py:1249 -#: participation/models.py:1250 participation/models.py:1253 -#: participation/models.py:1356 participation/models.py:1358 -#: participation/models.py:1360 participation/models.py:1367 -#: participation/models.py:1371 participation/models.py:1616 -#: participation/models.py:1638 participation/models.py:2102 +#: participation/models.py:507 participation/models.py:521 +#: participation/models.py:538 participation/models.py:1263 +#: participation/models.py:1264 participation/models.py:1267 +#: participation/models.py:1370 participation/models.py:1372 +#: participation/models.py:1374 participation/models.py:1381 +#: participation/models.py:1385 participation/models.py:1630 +#: participation/models.py:1652 participation/models.py:2116 #: participation/views.py:1821 msgid "Pool" msgstr "Poule" -#: participation/models.py:559 participation/models.py:724 +#: participation/models.py:558 participation/models.py:723 msgid "Score" msgstr "Score" -#: participation/models.py:559 +#: participation/models.py:558 msgid "Mention" msgstr "Mention" -#: participation/models.py:704 participation/models.py:1602 +#: participation/models.py:703 participation/models.py:1616 msgid "Don't update the table structure for a better automated integration." msgstr "" "Ne pas mettre à jour la structure de la table pour une meilleure intégration " "automatisée." -#: participation/models.py:790 registration/admin.py:125 +#: participation/models.py:789 registration/admin.py:125 msgid "tournaments" msgstr "tournois" -#: participation/models.py:819 +#: participation/models.py:818 msgid "valid team" msgstr "équipe valide" -#: participation/models.py:820 +#: participation/models.py:819 msgid "The participation got the validation of the organizers." msgstr "La participation a été validée par les organisateur⋅rices." -#: participation/models.py:826 +#: participation/models.py:825 msgid "The team is selected for the final tournament." msgstr "L'équipe est sélectionnée pour la finale." -#: participation/models.py:830 +#: participation/models.py:829 msgid "mention" msgstr "mention" -#: participation/models.py:837 +#: participation/models.py:836 msgid "mention (final)" msgstr "Mention (pour la finale) :" -#: participation/models.py:847 +#: participation/models.py:846 #, python-brace-format msgid "Participation of the team {name} ({trigram})" msgstr "Participation de l'équipe {name} ({trigram})" -#: participation/models.py:854 +#: participation/models.py:855 #, python-brace-format msgid "" "

The team {trigram} has {nb_missing_payments} missing payments. Each " @@ -1505,11 +1510,26 @@ msgstr "" "notification de bourse) pour participer au tournoi.

Les participant⋅es " "qui n'ont pas encore payé sont : {participants}.

" -#: participation/models.py:862 +#: participation/models.py:863 msgid "Missing payments" msgstr "Paiements manquants" -#: participation/models.py:879 +#: participation/models.py:872 registration/models.py:310 +#, python-brace-format +msgid "" +"Please answer to the survey \"{name}\". You can go to the survey on that link, using the token code you received by " +"mail." +msgstr "" +"Merci de répondre au questionnaire « {name} ». Vous pouvez accéder au " +"questionnaire sur ce lien, en utilisant le " +"code que vous avez reçu par mail." + +#: participation/models.py:876 registration/models.py:314 +msgid "Required answer to survey" +msgstr "Réponse requise au questionnaire" + +#: participation/models.py:893 msgid "" "

The solutions for the tournament of {tournament} are due on the {date:%Y-" "%m-%d %H:%M}.

You have currently sent {nb_solutions} " @@ -1524,11 +1544,11 @@ msgstr "" "pouvez envoyer vos solutions sur votre page de " "participation.

" -#: participation/models.py:889 participation/models.py:903 +#: participation/models.py:903 participation/models.py:917 msgid "Solutions due" msgstr "Rendu des solutions" -#: participation/models.py:895 +#: participation/models.py:909 msgid "" "

The solutions for the tournament of {tournament} are due on the {date:%Y-" "%m-%d %H:%M}.

Remember that you can only fix minor changes to your " @@ -1541,7 +1561,7 @@ msgstr "" "parties.

Vous pouvez envoyer vos solutions sur votre " "page de participation.

" -#: participation/models.py:909 registration/models.py:607 +#: participation/models.py:923 registration/models.py:624 msgid "" "

The draw of the solutions for the tournament {tournament} is planned on " "the {date:%Y-%m-%d %H:%M}. You can join it on this link." @@ -1551,11 +1571,11 @@ msgstr "" "{date:%d/%m/%Y %H:%M}. Vous pouvez y participer sur ce lien.

" -#: participation/models.py:915 registration/models.py:614 +#: participation/models.py:929 registration/models.py:631 msgid "Draw of solutions" msgstr "Tirage au sort des solutions" -#: participation/models.py:927 +#: participation/models.py:941 #, python-brace-format msgid "" "

The solutions draw is ended. You can check the result on votre solution du problème " "{problem}.

" -#: participation/models.py:936 participation/models.py:999 -#: participation/models.py:1063 +#: participation/models.py:950 participation/models.py:1013 +#: participation/models.py:1077 #, python-brace-format msgid "" "

You will oppose the solution of the team {opponent} on the problème {problem}. Vous pouvez envoyer votre note " "de synthèse sur cette page.

" -#: participation/models.py:945 participation/models.py:1008 -#: participation/models.py:1072 +#: participation/models.py:959 participation/models.py:1022 +#: participation/models.py:1086 #, python-brace-format msgid "" "

You will report the solution of the team {reviewer} on the problème {problem}. Vous pouvez envoyer votre note " "de synthèse sur cette page.

" -#: participation/models.py:955 participation/models.py:1018 -#: participation/models.py:1082 +#: participation/models.py:969 participation/models.py:1032 +#: participation/models.py:1096 #, python-brace-format msgid "" "

You will observe the solution of the team {observer} on the problème {problem}. Vous pouvez envoyer votre note " "de synthèse sur cette page.

" -#: participation/models.py:975 participation/models.py:1038 -#: participation/models.py:1102 +#: participation/models.py:989 participation/models.py:1052 +#: participation/models.py:1116 #: participation/templates/participation/upload_written_review.html:9 msgid "Templates:" msgstr "Modèles :" -#: participation/models.py:980 registration/models.py:629 +#: participation/models.py:994 registration/models.py:646 msgid "First round" msgstr "Premier tour" -#: participation/models.py:992 +#: participation/models.py:1006 #, python-brace-format msgid "" "

For the second round, you will present your " @@ -1622,12 +1642,12 @@ msgstr "" "

Pour le second tour, vous défendrez votre " "solution du problème {problem}.

" -#: participation/models.py:1043 participation/models.py:1107 -#: registration/models.py:640 +#: participation/models.py:1057 participation/models.py:1121 +#: registration/models.py:657 msgid "Second round" msgstr "Second tour" -#: participation/models.py:1056 +#: participation/models.py:1070 #, python-brace-format msgid "" "

For the third round, you will present your " @@ -1636,7 +1656,7 @@ msgstr "" "

Pour le troisième tour, vous défendrez votre " "solution du problème {problem}.

" -#: participation/models.py:1113 +#: participation/models.py:1127 #, python-brace-format msgid "" "

The tournament {tournament} is ended. You can check the results on the Le tournoi {tournament} est terminé. Vous pouvez consulter les résultats " "sur la page du tournoi.

" -#: participation/models.py:1118 +#: participation/models.py:1132 msgid "Tournament ended" msgstr "Tournoi terminé" -#: participation/models.py:1128 participation/models.py:1171 -msgid "participations" -msgstr "participations" - -#: participation/models.py:1143 participation/models.py:1144 -#: participation/models.py:1145 +#: participation/models.py:1157 participation/models.py:1158 +#: participation/models.py:1159 #, python-brace-format msgid "Round {round}" msgstr "Tour {round}" -#: participation/models.py:1159 +#: participation/models.py:1173 msgid "room" msgstr "salle" -#: participation/models.py:1161 +#: participation/models.py:1175 msgid "Room 1" msgstr "Salle 1" -#: participation/models.py:1162 +#: participation/models.py:1176 msgid "Room 2" msgstr "Salle 2" -#: participation/models.py:1165 +#: participation/models.py:1179 msgid "For 5-teams pools only" msgstr "Pour les poules de 5 équipe uniquement" -#: participation/models.py:1177 +#: participation/models.py:1191 msgid "juries" msgstr "jurys" -#: participation/models.py:1186 +#: participation/models.py:1200 msgid "president of the jury" msgstr "président⋅e du jury" -#: participation/models.py:1193 +#: participation/models.py:1207 msgid "BigBlueButton URL" msgstr "Lien BigBlueButton" -#: participation/models.py:1194 +#: participation/models.py:1208 msgid "The link of the BBB visio for this pool." msgstr "Le lien du salon BBB pour cette poule." -#: participation/models.py:1199 +#: participation/models.py:1213 msgid "results available" msgstr "résultats disponibles" -#: participation/models.py:1200 +#: participation/models.py:1214 msgid "" "Check this case when results become accessible to teams. They stay " "accessible to you. Only averages are given." @@ -1704,95 +1720,95 @@ msgstr "" "Ils restent toujours accessibles pour vous. Seules les moyennes sont " "communiquées." -#: participation/models.py:1232 +#: participation/models.py:1246 msgid "The president of the jury must be part of the jury." msgstr "Læ président⋅e du jury doit faire partie du jury." -#: participation/models.py:1259 participation/models.py:1333 +#: participation/models.py:1273 participation/models.py:1347 #: participation/views.py:1495 participation/views.py:1744 msgid "Problem" msgstr "Problème" -#: participation/models.py:1260 participation/views.py:1516 +#: participation/models.py:1274 participation/views.py:1516 msgid "Reporter" msgstr "Défenseur⋅se" -#: participation/models.py:1261 participation/views.py:1522 +#: participation/models.py:1275 participation/views.py:1522 msgid "Opponent" msgstr "Opposant⋅e" -#: participation/models.py:1262 participation/views.py:1529 +#: participation/models.py:1276 participation/views.py:1529 msgid "Reviewer" msgstr "Rapporteur⋅rice" -#: participation/models.py:1263 participation/views.py:1536 +#: participation/models.py:1277 participation/views.py:1536 msgid "Observer" msgstr "Observateur⋅rice" -#: participation/models.py:1264 participation/views.py:1510 +#: participation/models.py:1278 participation/views.py:1510 msgid "Role" msgstr "Rôle" -#: participation/models.py:1265 participation/models.py:1267 -#: participation/models.py:1268 participation/views.py:1552 +#: participation/models.py:1279 participation/models.py:1281 +#: participation/models.py:1282 participation/views.py:1552 #: participation/views.py:1560 participation/views.py:1568 #: participation/views.py:1578 msgid "Writing" msgstr "Écrit" -#: participation/models.py:1266 participation/models.py:1267 -#: participation/models.py:1268 participation/views.py:1556 +#: participation/models.py:1280 participation/models.py:1281 +#: participation/models.py:1282 participation/views.py:1556 #: participation/views.py:1564 participation/views.py:1573 #: participation/views.py:1582 msgid "Oral" msgstr "Oral" -#: participation/models.py:1269 participation/views.py:1544 +#: participation/models.py:1283 participation/views.py:1544 #: participation/views.py:1545 msgid "Juree" msgstr "Juré⋅e" -#: participation/models.py:1292 participation/models.py:1618 -#: participation/models.py:1640 participation/views.py:1614 +#: participation/models.py:1306 participation/models.py:1632 +#: participation/models.py:1654 participation/views.py:1614 msgid "Average" msgstr "Moyenne" -#: participation/models.py:1298 participation/views.py:1633 +#: participation/models.py:1312 participation/views.py:1633 msgid "Coefficient" msgstr "Coefficien" -#: participation/models.py:1299 participation/views.py:1676 +#: participation/models.py:1313 participation/views.py:1676 msgid "Subtotal" msgstr "Sous-total" -#: participation/models.py:1565 +#: participation/models.py:1579 #, python-brace-format msgid "Input must be a valid integer between {min_note} and {max_note}." msgstr "L'entrée doit être un entier valide entre {min_note} et {max_note}." -#: participation/models.py:1653 +#: participation/models.py:1667 #, python-brace-format msgid "The jury {jury} is not part of the jury for this pool." msgstr "{jury} ne fait pas partie du jury pour cette poule." -#: participation/models.py:1666 +#: participation/models.py:1680 #, python-brace-format msgid "Pool {code} for tournament {tournament} with teams {teams}" msgstr "Poule {code} du tournoi {tournament} avec les équipes {teams}" -#: participation/models.py:1686 +#: participation/models.py:1700 msgid "position" msgstr "position" -#: participation/models.py:1693 +#: participation/models.py:1707 msgid "reported solution" msgstr "solution défendue" -#: participation/models.py:1731 +#: participation/models.py:1745 msgid "penalties" msgstr "pénalités" -#: participation/models.py:1733 +#: participation/models.py:1747 msgid "" "Number of penalties for the reporter. The reporter will loose a 0.5 " "coefficient per penalty." @@ -1800,128 +1816,128 @@ msgstr "" "Nombre de pénalités pour l'équipe défenseuse. Elle perd un coefficient 0.5 " "sur sa présentation orale par pénalité." -#: participation/models.py:1859 participation/models.py:1862 -#: participation/models.py:1865 participation/models.py:1868 +#: participation/models.py:1873 participation/models.py:1876 +#: participation/models.py:1879 participation/models.py:1882 #, python-brace-format msgid "Team {trigram} is not registered in the pool." msgstr "L'équipe {trigram} n'est pas inscrite dans la poule." -#: participation/models.py:1873 +#: participation/models.py:1887 #, python-brace-format msgid "Passage of {reporter} for problem {problem}" msgstr "Passage de {reporter} pour le problème {problem}" -#: participation/models.py:1877 participation/models.py:1886 -#: participation/models.py:1975 participation/models.py:2018 +#: participation/models.py:1891 participation/models.py:1900 +#: participation/models.py:1989 participation/models.py:2032 msgid "passage" msgstr "passage" -#: participation/models.py:1878 +#: participation/models.py:1892 msgid "passages" msgstr "passages" -#: participation/models.py:1897 +#: participation/models.py:1911 msgid "difference" msgstr "différence" -#: participation/models.py:1898 +#: participation/models.py:1912 msgid "Score to add/remove on the final score" msgstr "Score à ajouter/retrancher au score final" -#: participation/models.py:1905 +#: participation/models.py:1919 msgid "tweak" msgstr "harmonisation" -#: participation/models.py:1906 +#: participation/models.py:1920 msgid "tweaks" msgstr "harmonisations" -#: participation/models.py:1938 +#: participation/models.py:1952 msgid "solution for the final tournament" msgstr "solution pour la finale" -#: participation/models.py:1943 participation/models.py:1987 +#: participation/models.py:1957 participation/models.py:2001 msgid "file" msgstr "fichier" -#: participation/models.py:1953 +#: participation/models.py:1967 #, python-brace-format msgid "Solution of team {team} for problem {problem}" msgstr "Solution de l'équipe {team} pour le problème {problem}" -#: participation/models.py:1955 +#: participation/models.py:1969 msgid "for final" msgstr "pour la finale" -#: participation/models.py:1958 +#: participation/models.py:1972 msgid "solution" msgstr "solution" -#: participation/models.py:1959 +#: participation/models.py:1973 msgid "solutions" msgstr "solutions" -#: participation/models.py:1993 +#: participation/models.py:2007 #, python-brace-format msgid "Written review of {team} as {type} for problem {problem} of {reporter}" msgstr "" "Note de synthèse de l'équipe {team} en tant que {type} pour le problème " "{problem} de {reporter}" -#: participation/models.py:2001 +#: participation/models.py:2015 msgid "written review" msgstr "note de synthèse" -#: participation/models.py:2002 +#: participation/models.py:2016 msgid "written reviews" msgstr "notes de synthèse" -#: participation/models.py:2011 +#: participation/models.py:2025 msgid "jury" msgstr "jury" -#: participation/models.py:2023 +#: participation/models.py:2037 msgid "reporter writing note" msgstr "note d'écrit défenseur⋅se" -#: participation/models.py:2029 +#: participation/models.py:2043 msgid "reporter oral note" msgstr "note d'oral défenseur⋅se" -#: participation/models.py:2035 +#: participation/models.py:2049 msgid "opponent writing note" msgstr "note d'écrit opposant⋅e" -#: participation/models.py:2041 +#: participation/models.py:2055 msgid "opponent oral note" msgstr "note d'oral opposant⋅e" -#: participation/models.py:2047 +#: participation/models.py:2061 msgid "reviewer writing note" msgstr "note d'écrit rapporteur⋅rice" -#: participation/models.py:2053 +#: participation/models.py:2067 msgid "reviewer oral note" msgstr "note d'oral du rapporteur⋅rice" -#: participation/models.py:2059 +#: participation/models.py:2073 msgid "observer writing note" msgstr "note d'écrit de l'observateur⋅rice" -#: participation/models.py:2065 +#: participation/models.py:2079 msgid "observer oral note" msgstr "note d'oral de l'observateur⋅rice" -#: participation/models.py:2130 +#: participation/models.py:2144 #, python-brace-format msgid "Notes of {jury} for {passage}" msgstr "Notes de {jury} pour le {passage}" -#: participation/models.py:2133 +#: participation/models.py:2147 msgid "note" msgstr "note" -#: participation/models.py:2134 +#: participation/models.py:2148 msgid "notes" msgstr "notes" @@ -2406,7 +2422,7 @@ msgid "Payment of" msgstr "Paiement de" #: participation/templates/participation/team_detail.html:166 -#: registration/models.py:684 +#: registration/models.py:701 msgid "grouped" msgstr "groupé" @@ -2679,7 +2695,7 @@ msgid "Archive of all printable note sheets sorted by pool" msgstr "Archive de toutes les fiches de notes imprimables triées par poule" #: participation/templates/participation/tournament_harmonize.html:16 -#: registration/models.py:655 +#: registration/models.py:672 msgid "Note" msgstr "Note" @@ -2983,6 +2999,11 @@ msgstr "Marquer comme en attente" msgid "Mark as invalid" msgstr "Marquer comme invalide" +#: registration/apps.py:14 registration/models.py:132 +#: registration/models.py:697 +msgid "registrations" +msgstr "inscriptions" + #: registration/forms.py:23 msgid "role" msgstr "rôle" @@ -2991,7 +3012,7 @@ msgstr "rôle" msgid "participant" msgstr "participant⋅e" -#: registration/forms.py:26 registration/models.py:516 +#: registration/forms.py:26 registration/models.py:533 msgid "coach" msgstr "encadrant⋅e" @@ -3007,20 +3028,20 @@ msgstr "En attente" msgid "You must upload your receipt." msgstr "Vous devez envoyer votre justificatif." -#: registration/models.py:40 +#: registration/models.py:41 msgid "Grant Animath to contact me in the future about other actions" msgstr "" "Autoriser Animath à me recontacter à l'avenir à propos d'autres actions" -#: registration/models.py:45 +#: registration/models.py:46 msgid "email confirmed" msgstr "email confirmé" -#: registration/models.py:53 +#: registration/models.py:54 msgid "Activate your account" msgstr "Activez votre compte" -#: registration/models.py:110 +#: registration/models.py:111 #, python-brace-format msgid "" "Your email address is not validated. Please click on the link you received " @@ -3031,56 +3052,52 @@ msgstr "" "avez reçu par mail. Vous pouvez renvoyer un mail en cliquant sur ce lien." -#: registration/models.py:130 +#: registration/models.py:131 msgid "registration" msgstr "inscription" -#: registration/models.py:131 registration/models.py:680 -msgid "registrations" -msgstr "inscriptions" - -#: registration/models.py:163 +#: registration/models.py:164 msgid "gender" msgstr "genre" -#: registration/models.py:165 +#: registration/models.py:166 msgid "Female" msgstr "Femme" -#: registration/models.py:166 +#: registration/models.py:167 msgid "Male" msgstr "Homme" -#: registration/models.py:167 +#: registration/models.py:168 #: registration/templates/registration/payment_form.html:89 msgid "Other" msgstr "Autre" -#: registration/models.py:174 +#: registration/models.py:175 msgid "address" msgstr "adresse" -#: registration/models.py:178 +#: registration/models.py:179 msgid "zip code" msgstr "code postal" -#: registration/models.py:184 +#: registration/models.py:185 msgid "city" msgstr "ville" -#: registration/models.py:189 +#: registration/models.py:190 msgid "country" msgstr "pays" -#: registration/models.py:194 +#: registration/models.py:195 msgid "phone number" msgstr "numéro de téléphone" -#: registration/models.py:199 +#: registration/models.py:200 msgid "health issues" msgstr "problèmes de santé" -#: registration/models.py:201 +#: registration/models.py:202 msgid "" "You can indicate here your allergies or anything that is important to know " "for organizers." @@ -3088,11 +3105,11 @@ msgstr "" "Vous pouvez indiquer ici vos allergies ou n'importe quoi qui peut être bon à " "savoir pour les organisateur⋅rices." -#: registration/models.py:205 +#: registration/models.py:206 msgid "housing constraints" msgstr "contraintes de logement" -#: registration/models.py:207 +#: registration/models.py:208 msgid "" "You can fill in something here if you have any housing constraints, e.g. " "medical problems, scheduling issues, gender issues, or anything else you " @@ -3105,15 +3122,15 @@ msgstr "" "organisateur⋅rices. Laissez vide si vous n'avez rien de spécifique à " "déclarer." -#: registration/models.py:214 +#: registration/models.py:215 msgid "photo authorization" msgstr "autorisation de droit à l'image" -#: registration/models.py:221 +#: registration/models.py:222 msgid "photo authorization (final)" msgstr "autorisation de droit à l'image (finale)" -#: registration/models.py:265 +#: registration/models.py:268 #, python-brace-format msgid "" "You are not in a team. You can create one or ou rejoindre une équipe existante pour " "participer." -#: registration/models.py:271 +#: registration/models.py:274 msgid "No team" msgstr "Pas d'équipe" -#: registration/models.py:279 +#: registration/models.py:282 #, python-brace-format msgid "" "You have not uploaded your photo authorization. You can do it by clicking on " @@ -3136,11 +3153,11 @@ msgstr "" "Vous n'avez pas envoyé votre autorisation de droit à l'image. Vous pouvez le " "faire en cliquant sur ce lien." -#: registration/models.py:284 registration/models.py:297 +#: registration/models.py:287 registration/models.py:300 msgid "Photo authorization" msgstr "Autorisation de droit à l'image" -#: registration/models.py:292 +#: registration/models.py:295 #, python-brace-format msgid "" "You have not uploaded your photo authorization for the final tournament. You " @@ -3149,75 +3166,75 @@ msgstr "" "Vous n'avez pas envoyé votre autorisation de droit à l'image pour la finale. " "Vous pouvez le faire en cliquant sur ce lien." -#: registration/models.py:312 +#: registration/models.py:329 msgid "Team selected for the final tournament" msgstr "Équipe sélectionnée pour la finale" -#: registration/models.py:334 +#: registration/models.py:351 msgid "participant registration" msgstr "inscription de participant⋅e" -#: registration/models.py:335 +#: registration/models.py:352 msgid "participant registrations" msgstr "inscriptions de participant⋅es" -#: registration/models.py:344 +#: registration/models.py:361 msgid "birth date" msgstr "date de naissance" -#: registration/models.py:350 +#: registration/models.py:367 msgid "12th grade" msgstr "Terminale" -#: registration/models.py:351 +#: registration/models.py:368 msgid "11th grade" msgstr "Première" -#: registration/models.py:352 +#: registration/models.py:369 msgid "10th grade or lower" msgstr "Seconde ou inférieur" -#: registration/models.py:354 +#: registration/models.py:371 msgid "student class" msgstr "classe" -#: registration/models.py:359 +#: registration/models.py:376 msgid "school" msgstr "école" -#: registration/models.py:364 +#: registration/models.py:381 msgid "responsible name" msgstr "nom d'un⋅e responsable légal⋅e" -#: registration/models.py:369 +#: registration/models.py:386 msgid "responsible phone number" msgstr "numéro de téléphone d'un⋅e responsable légal⋅e" -#: registration/models.py:374 +#: registration/models.py:391 msgid "responsible email address" msgstr "adresse e-mail d'un⋅e responsable légal⋅e" -#: registration/models.py:379 +#: registration/models.py:396 msgid "parental authorization" msgstr "autorisation parentale" -#: registration/models.py:386 +#: registration/models.py:403 msgid "parental authorization (final)" msgstr "autorisation parentale (finale)" -#: registration/models.py:393 +#: registration/models.py:410 msgid "health sheet" msgstr "fiche sanitaire" -#: registration/models.py:400 +#: registration/models.py:417 msgid "vaccine sheet" msgstr "carnet de vaccination" -#: registration/models.py:408 +#: registration/models.py:425 msgid "student" msgstr "élève" -#: registration/models.py:419 +#: registration/models.py:436 #, python-brace-format msgid "" "You have not uploaded your parental authorization. You can do it by clicking " @@ -3226,11 +3243,11 @@ msgstr "" "Vous n'avez pas envoyé votre autorisation parentale. Vous pouvez le faire en " "cliquant sur ce lien." -#: registration/models.py:424 registration/models.py:484 +#: registration/models.py:441 registration/models.py:501 msgid "Parental authorization" msgstr "Autorisation parentale" -#: registration/models.py:430 +#: registration/models.py:447 #, python-brace-format msgid "" "You have not uploaded your health sheet. You can do it by clicking on ce lien." -#: registration/models.py:435 +#: registration/models.py:452 msgid "Health sheet" msgstr "Fiche sanitaire" -#: registration/models.py:441 +#: registration/models.py:458 #, python-brace-format msgid "" "You have not uploaded your vaccine sheet. You can do it by clicking on ce lien." -#: registration/models.py:446 +#: registration/models.py:463 msgid "Vaccine sheet" msgstr "Carnet de vaccination" -#: registration/models.py:455 +#: registration/models.py:472 #, python-brace-format msgid "" "You have to pay {amount} € for your registration, or send a scholarship " @@ -3267,15 +3284,15 @@ msgstr "" "notification de bourse ou un justificatif de paiement. Vous pouvez le faire " "sur la page de paiement." -#: registration/models.py:461 registration/models.py:470 +#: registration/models.py:478 registration/models.py:487 msgid "Payment" msgstr "Paiement" -#: registration/models.py:467 +#: registration/models.py:484 msgid "Your payment is under approval." msgstr "Votre paiement est en cours de validation." -#: registration/models.py:478 +#: registration/models.py:495 #, python-brace-format msgid "" "You have not uploaded your parental authorization for the final tournament. " @@ -3284,19 +3301,19 @@ msgstr "" "Vous n'avez pas envoyé votre autorisation parentale pour la finale. Vous " "pouvez le faire en cliquant sur ce lien." -#: registration/models.py:493 +#: registration/models.py:510 msgid "student registration" msgstr "inscription d'élève" -#: registration/models.py:494 +#: registration/models.py:511 msgid "student registrations" msgstr "inscriptions d'élève" -#: registration/models.py:505 +#: registration/models.py:522 msgid "most recent degree in mathematics, computer science or physics" msgstr "Dernier diplôme obtenu en mathématiques, informatique ou physique" -#: registration/models.py:506 +#: registration/models.py:523 msgid "" "Your most recent degree in maths, computer science or physics, or your last " "entrance exam (CAPES, Agrégation,…)" @@ -3304,23 +3321,23 @@ msgstr "" "Votre dernier diplôme en mathématiques, informatique ou physique, ou votre " "dernier concours obtenu (CAPES, Agrégation, …)" -#: registration/models.py:511 registration/models.py:533 +#: registration/models.py:528 registration/models.py:550 msgid "professional activity" msgstr "activité professionnelle" -#: registration/models.py:524 +#: registration/models.py:541 msgid "coach registration" msgstr "inscription d'encadrant⋅e" -#: registration/models.py:525 +#: registration/models.py:542 msgid "coach registrations" msgstr "inscriptions d'encadrant⋅es" -#: registration/models.py:537 +#: registration/models.py:554 msgid "administrator" msgstr "administrateur⋅rice" -#: registration/models.py:538 +#: registration/models.py:555 msgid "" "An administrator has all rights. Please don't give this right to all juries " "and volunteers." @@ -3328,15 +3345,15 @@ msgstr "" "Un⋅e administrateur⋅rice a tous les droits. Merci de ne pas donner ce droit " "à toustes les juré⋅es et bénévoles." -#: registration/models.py:548 +#: registration/models.py:565 msgid "admin" msgstr "admin" -#: registration/models.py:548 +#: registration/models.py:565 msgid "volunteer" msgstr "bénévole" -#: registration/models.py:561 +#: registration/models.py:578 msgid "" "Registrations for tournament {tournament} are closing on {date:%Y-%m-%d %H:" "%M}. There are for now {validated_teams} validated teams (+ {pending_teams} " @@ -3346,11 +3363,11 @@ msgstr "" "%M}. Il y a pour l'instant {validated_teams} équipes validées (+ " "{pending_teams} en attente) sur {max_teams} attendues." -#: registration/models.py:569 +#: registration/models.py:586 msgid "Registrations" msgstr "Inscriptions" -#: registration/models.py:576 +#: registration/models.py:593 #, python-brace-format msgid "" "The team {trigram} requested to be validated for the tournament of " @@ -3361,7 +3378,7 @@ msgstr "" "Vous pouvez vérifier le statut de l'équipe sur la page de " "l'équipe." -#: registration/models.py:593 +#: registration/models.py:610 #, python-brace-format msgid "" "There are {valid} validated payments, {pending} pending and {invalid} " @@ -3372,11 +3389,11 @@ msgstr "" "invalides pour le tournoi {tournament}. Vous pouvez vérifier le statut des " "paiements sur la liste des paiements." -#: registration/models.py:600 +#: registration/models.py:617 msgid "Payments" msgstr "Paiements" -#: registration/models.py:624 registration/models.py:635 +#: registration/models.py:641 registration/models.py:652 #, python-brace-format msgid "" "

You are in the jury of the pool {pool} for the tournament of " @@ -3385,7 +3402,7 @@ msgstr "" "

Vous êtes dans le jury de la poule {pool} pour le tournoi {tournament}. " "Vous pouvez trouver la page de la poule ici.

" -#: registration/models.py:648 +#: registration/models.py:665 #, python-brace-format msgid "" "

You don't have given any note as a jury for the passage {passage} in the " @@ -3396,15 +3413,15 @@ msgstr "" "{passage} dans la poule {pool} de {tournament}. Vous pouvez donner vos notes " "ici.

" -#: registration/models.py:664 +#: registration/models.py:681 msgid "volunteer registration" msgstr "inscription de bénévole" -#: registration/models.py:665 +#: registration/models.py:682 msgid "volunteer registrations" msgstr "inscriptions de bénévoles" -#: registration/models.py:686 +#: registration/models.py:703 msgid "" "If set to true, then one payment is made for the full team, for example if " "the school pays for all." @@ -3412,100 +3429,100 @@ msgstr "" "Si vrai, alors un seul paiement est fait pour toute l'équipe, par exemple si " "le lycée paie pour tout le monde." -#: registration/models.py:691 +#: registration/models.py:708 msgid "total amount" msgstr "montant total" -#: registration/models.py:692 +#: registration/models.py:709 msgid "Corresponds to the total required amount to pay, in euros." msgstr "Correspond au montant total à payer, en euros." -#: registration/models.py:697 +#: registration/models.py:714 msgid "token" msgstr "jeton" -#: registration/models.py:700 +#: registration/models.py:717 msgid "A token to authorize external users to make this payment." msgstr "Un jeton pour autoriser des utilisateurs externes à faire ce paiement." -#: registration/models.py:704 +#: registration/models.py:721 msgid "for final tournament" msgstr "pour la finale" -#: registration/models.py:709 +#: registration/models.py:726 msgid "type" msgstr "type" -#: registration/models.py:712 +#: registration/models.py:729 msgid "No payment" msgstr "Pas de paiement" -#: registration/models.py:713 +#: registration/models.py:730 #: registration/templates/registration/payment_form.html:72 msgid "Credit card" msgstr "Carte bancaire" -#: registration/models.py:714 +#: registration/models.py:731 msgid "Scholarship" msgstr "Notification de bourse" -#: registration/models.py:715 +#: registration/models.py:732 #: registration/templates/registration/payment_form.html:77 msgid "Bank transfer" msgstr "Virement bancaire" -#: registration/models.py:716 +#: registration/models.py:733 msgid "Other (please indicate)" msgstr "Autre (veuillez spécifier)" -#: registration/models.py:717 +#: registration/models.py:734 msgid "The tournament is free" msgstr "Le tournoi est gratuit" -#: registration/models.py:724 +#: registration/models.py:741 msgid "Hello Asso checkout intent ID" msgstr "ID de l'intention de paiement Hello Asso" -#: registration/models.py:731 +#: registration/models.py:748 msgid "receipt" msgstr "justificatif" -#: registration/models.py:732 +#: registration/models.py:749 msgid "only if you have a scholarship or if you chose a bank transfer." msgstr "" "Nécessaire seulement si vous déclarez être boursièr⋅e ou si vous payez par " "virement bancaire." -#: registration/models.py:739 +#: registration/models.py:756 msgid "additional information" msgstr "informations additionnelles" -#: registration/models.py:740 +#: registration/models.py:757 msgid "To help us to find your payment." msgstr "Pour nous aider à retrouver votre paiement, si nécessaire." -#: registration/models.py:746 +#: registration/models.py:763 msgid "payment valid" msgstr "paiement valide" -#: registration/models.py:806 +#: registration/models.py:823 msgid "Reminder for your payment" msgstr "Rappel pour votre paiement" -#: registration/models.py:817 +#: registration/models.py:834 msgid "Payment confirmation" msgstr "Confirmation de paiement" -#: registration/models.py:839 +#: registration/models.py:856 #, python-brace-format msgid "Payment of {registrations}" msgstr "Paiements de {registrations}" -#: registration/models.py:842 +#: registration/models.py:859 msgid "payment" msgstr "paiement" -#: registration/models.py:843 +#: registration/models.py:860 msgid "payments" msgstr "paiements" @@ -4364,6 +4381,10 @@ msgstr "Autorisation parentale de {student}.{ext}" msgid "Payment receipt of {registrations}.{ext}" msgstr "Justificatif de paiement de {registrations}.{ext}" +#: survey/apps.py:11 survey/models.py:137 tfjm/templates/navbar.html:78 +msgid "surveys" +msgstr "sondages" + #: survey/models.py:21 survey/tables.py:14 msgid "survey identifier" msgstr "identifiant du sondage" @@ -4400,11 +4421,11 @@ msgstr "" "Lorsque ce champ est coché, les encadrant⋅es seront aussi invité⋅es au " "sondage. Aucun effet lorsque toute l'équipe est invité." -#: survey/models.py:48 +#: survey/models.py:49 msgid "tournament restriction" msgstr "restriction de tournoi" -#: survey/models.py:49 +#: survey/models.py:50 msgid "" "When this field is filled, the survey participants will be restricted to " "this tournament members." @@ -4412,22 +4433,18 @@ msgstr "" "Lorsque ce champ est rempli, les participant⋅es au sondage seront " "restreint⋅es aux membres de ce tournoi." -#: survey/models.py:55 +#: survey/models.py:57 msgid "participants that completed the survey" msgstr "participant⋅es ayant complété le sondage" -#: survey/models.py:61 +#: survey/models.py:64 msgid "teams that completed the survey" msgstr "équipes ayant complété le sondage" -#: survey/models.py:134 survey/templates/survey/survey_detail.html:10 +#: survey/models.py:136 survey/templates/survey/survey_detail.html:10 msgid "survey" msgstr "sondage" -#: survey/models.py:135 tfjm/templates/navbar.html:78 -msgid "surveys" -msgstr "sondages" - #: survey/tables.py:18 survey/templates/survey/survey_detail.html:51 msgid "completed" msgstr "complété" diff --git a/participation/apps.py b/participation/apps.py index 4b0839a..e4722ef 100644 --- a/participation/apps.py +++ b/participation/apps.py @@ -3,6 +3,7 @@ from django.apps import AppConfig from django.db.models.signals import post_save, pre_save +from django.utils.translation import gettext_lazy as _ class ParticipationConfig(AppConfig): @@ -10,6 +11,7 @@ class ParticipationConfig(AppConfig): The participation app contains the data about the teams, solutions, ... """ name = 'participation' + verbose_name = _("participations") def ready(self): from participation import signals diff --git a/participation/models.py b/participation/models.py index fddb2fe..18307bd 100644 --- a/participation/models.py +++ b/participation/models.py @@ -3,13 +3,12 @@ from datetime import date, timedelta import math -import os from django.conf import settings from django.core.exceptions import ValidationError from django.core.validators import MaxValueValidator, MinValueValidator, RegexValidator from django.db import models -from django.db.models import Index +from django.db.models import Index, Q from django.template.defaultfilters import slugify from django.urls import reverse_lazy from django.utils import timezone, translation @@ -847,6 +846,8 @@ class Participation(models.Model): return _("Participation of the team {name} ({trigram})").format(name=self.team.name, trigram=self.team.trigram) def important_informations(self): + from survey.models import Survey + informations = [] missing_payments = Payment.objects.filter(registrations__in=self.team.participants.all(), valid=False) @@ -865,6 +866,19 @@ class Participation(models.Model): 'content': content, }) + if self.valid: + for survey in Survey.objects.filter(Q(tournament__isnull=True) | Q(tournament=self.tournament), Q(invite_team=True), + ~Q(completed_teams=self.team)).all(): + text = _("Please answer to the survey \"{name}\". You can go to the survey on that link, " + "using the token code you received by mail.") + content = format_lazy(text, name=survey.name, survey_link=f"{settings.LIMESURVEY_URL}/index.php/{survey.survey_id}") + informations.append({ + 'title': _("Required answer to survey"), + 'type': "warning", + 'priority': 12, + 'content': content + }) + if self.tournament: informations.extend(self.informations_for_tournament(self.tournament)) if self.final: diff --git a/participation/views.py b/participation/views.py index c0b742c..6387def 100644 --- a/participation/views.py +++ b/participation/views.py @@ -234,7 +234,7 @@ class TeamDetailView(LoginRequiredMixin, FormMixin, ProcessFormView, DetailView) mail_plain = render_to_string("participation/mails/request_validation.txt", mail_context) mail_html = render_to_string("participation/mails/request_validation.html", mail_context) send_mail(f"[{settings.APP_NAME}] {_('Team validation')}", mail_plain, settings.DEFAULT_FROM_EMAIL, - [self.object.participation.tournament.organizers_email], html_message=mail_html) + [self.object.participation.tournament.organizers_email], html_message=mail_html) return super().form_valid(form) @@ -270,7 +270,7 @@ class TeamDetailView(LoginRequiredMixin, FormMixin, ProcessFormView, DetailView) mail_plain = render_to_string("participation/mails/team_validated.txt", mail_context_plain) mail_html = render_to_string("participation/mails/team_validated.html", mail_context_html) registration.user.email_user(f"[{settings.APP_NAME}] {_('Team validated')}", mail_plain, - html_message=mail_html) + html_message=mail_html) elif "invalidate" in self.request.POST: self.object.participation.valid = None self.object.participation.save() @@ -280,7 +280,7 @@ class TeamDetailView(LoginRequiredMixin, FormMixin, ProcessFormView, DetailView) mail_plain = render_to_string("participation/mails/team_not_validated.txt", mail_context_plain) mail_html = render_to_string("participation/mails/team_not_validated.html", mail_context_html) send_mail(f"[{settings.APP_NAME}] {_('Team not validated')}", mail_plain, - None, [self.object.email], html_message=mail_html) + None, [self.object.email], html_message=mail_html) else: form.add_error(None, _("You must specify if you validate the registration or not.")) return self.form_invalid(form) diff --git a/registration/apps.py b/registration/apps.py index bb99e21..54ca260 100644 --- a/registration/apps.py +++ b/registration/apps.py @@ -3,6 +3,7 @@ from django.apps import AppConfig from django.db.models.signals import post_save, pre_save +from django.utils.translation import gettext_lazy as _ class RegistrationConfig(AppConfig): @@ -10,6 +11,7 @@ class RegistrationConfig(AppConfig): Registration app contains the detail about users only. """ name = 'registration' + verbose_name = _("registrations") def ready(self): from registration import signals diff --git a/registration/models.py b/registration/models.py index e99741e..b169610 100644 --- a/registration/models.py +++ b/registration/models.py @@ -8,6 +8,7 @@ from django.contrib.sites.models import Site from django.core.mail import send_mail from django.core.validators import MaxValueValidator, MinValueValidator from django.db import models +from django.db.models import Q from django.template import loader from django.urls import reverse, reverse_lazy from django.utils import timezone, translation @@ -260,6 +261,8 @@ class ParticipantRegistration(Registration): raise NotImplementedError def registration_informations(self): + from survey.models import Survey + informations = [] if not self.team: text = _("You are not in a team. You can create one " @@ -300,6 +303,20 @@ class ParticipantRegistration(Registration): 'content': content, }) + if self.team.participation.valid: + for survey in Survey.objects.filter(Q(tournament__isnull=True) | Q(tournament=self.team.participation.tournament), + Q(invite_team=False), Q(invite_coaches=True) | Q(invite_coaches=self.is_coach), + ~Q(completed_registrations=self)): + text = _("Please answer to the survey \"{name}\". You can go to the survey on that link, " + "using the token code you received by mail.") + content = format_lazy(text, name=survey.name, survey_link=f"{settings.LIMESURVEY_URL}/index.php/{survey.survey_id}") + informations.append({ + 'title': _("Required answer to survey"), + 'type': "warning", + 'priority': 12, + 'content': content + }) + informations.extend(self.team.important_informations()) return informations @@ -315,19 +332,19 @@ class ParticipantRegistration(Registration): tournament = Tournament.final_tournament() payment = self.payments.filter(final=True).first() if self.is_student else None message = loader.render_to_string('registration/mails/final_selection.txt', - { - 'user': self.user, - 'domain': site.domain, - 'tournament': tournament, - 'payment': payment, - }) + { + 'user': self.user, + 'domain': site.domain, + 'tournament': tournament, + 'payment': payment, + }) html = loader.render_to_string('registration/mails/final_selection.html', - { - 'user': self.user, - 'domain': site.domain, - 'tournament': tournament, - 'payment': payment, - }) + { + 'user': self.user, + 'domain': site.domain, + 'tournament': tournament, + 'payment': payment, + }) self.user.email_user(subject, message, html_message=html) class Meta: @@ -807,9 +824,9 @@ class Payment(models.Model): site = Site.objects.first() for registration in self.registrations.all(): message = loader.render_to_string('registration/mails/payment_reminder.txt', - dict(registration=registration, payment=self, domain=site.domain)) + dict(registration=registration, payment=self, domain=site.domain)) html = loader.render_to_string('registration/mails/payment_reminder.html', - dict(registration=registration, payment=self, domain=site.domain)) + dict(registration=registration, payment=self, domain=site.domain)) registration.user.email_user(subject, message, html_message=html) def send_helloasso_payment_confirmation_mail(self): @@ -818,18 +835,18 @@ class Payment(models.Model): site = Site.objects.first() for registration in self.registrations.all(): message = loader.render_to_string('registration/mails/payment_confirmation.txt', - dict(registration=registration, payment=self, domain=site.domain)) + dict(registration=registration, payment=self, domain=site.domain)) html = loader.render_to_string('registration/mails/payment_confirmation.html', - dict(registration=registration, payment=self, domain=site.domain)) + dict(registration=registration, payment=self, domain=site.domain)) registration.user.email_user(subject, message, html_message=html) payer = self.get_checkout_intent()['order']['payer'] payer_name = f"{payer['firstName']} {payer['lastName']}" if not self.registrations.filter(user__email=payer['email']).exists(): message = loader.render_to_string('registration/mails/payment_confirmation.txt', - dict(registration=payer_name, payment=self, domain=site.domain)) + dict(registration=payer_name, payment=self, domain=site.domain)) html = loader.render_to_string('registration/mails/payment_confirmation.html', - dict(registration=payer_name, payment=self, domain=site.domain)) + dict(registration=payer_name, payment=self, domain=site.domain)) send_mail(subject, message, None, [payer['email']], html_message=html) def get_absolute_url(self): diff --git a/registration/views.py b/registration/views.py index 7c3fdfd..cce26fe 100644 --- a/registration/views.py +++ b/registration/views.py @@ -145,9 +145,9 @@ class AddOrganizerView(VolunteerMixin, CreateView): password=password, domain=site.domain)) html = render_to_string('registration/mails/add_organizer.html', dict(user=registration.user, - inviter=self.request.user, - password=password, - domain=site.domain)) + inviter=self.request.user, + password=password, + domain=site.domain)) registration.user.email_user(subject, message, html_message=html) if registration.is_admin: diff --git a/survey/apps.py b/survey/apps.py index 273de2b..10b1efd 100644 --- a/survey/apps.py +++ b/survey/apps.py @@ -1,6 +1,11 @@ +# Copyright (C) 2025 by Animath +# SPDX-License-Identifier: GPL-3.0-or-later + from django.apps import AppConfig +from django.utils.translation import gettext_lazy as _ class SurveyConfig(AppConfig): default_auto_field = "django.db.models.BigAutoField" name = "survey" + verbose_name = _("surveys") diff --git a/survey/migrations/0002_alter_survey_completed_registrations_and_more.py b/survey/migrations/0002_alter_survey_completed_registrations_and_more.py new file mode 100644 index 0000000..b0766c1 --- /dev/null +++ b/survey/migrations/0002_alter_survey_completed_registrations_and_more.py @@ -0,0 +1,53 @@ +# Generated by Django 5.1.5 on 2025-03-19 22:51 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ( + "participation", + "0023_tournament_unified_registration", + ), + ("registration", "0014_participantregistration_country"), + ("survey", "0001_initial"), + ] + + operations = [ + migrations.AlterField( + model_name="survey", + name="completed_registrations", + field=models.ManyToManyField( + blank=True, + related_name="completed_surveys", + to="registration.participantregistration", + verbose_name="participants that completed the survey", + ), + ), + migrations.AlterField( + model_name="survey", + name="completed_teams", + field=models.ManyToManyField( + blank=True, + related_name="completed_surveys", + to="participation.team", + verbose_name="teams that completed the survey", + ), + ), + migrations.AlterField( + model_name="survey", + name="tournament", + field=models.ForeignKey( + blank=True, + default=None, + help_text="When this field is filled, the survey participants will be restricted to this tournament members.", + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="surveys", + to="participation.tournament", + verbose_name="tournament restriction", + ), + ), + ] diff --git a/survey/models.py b/survey/models.py index e08a85b..4ada6fa 100644 --- a/survey/models.py +++ b/survey/models.py @@ -45,18 +45,21 @@ class Survey(models.Model): blank=True, default=None, on_delete=models.SET_NULL, + related_name="surveys", verbose_name=_("tournament restriction"), help_text=_("When this field is filled, the survey participants will be restricted to this tournament members."), ) completed_registrations = models.ManyToManyField( ParticipantRegistration, + blank=True, related_name="completed_surveys", verbose_name=_("participants that completed the survey"), ) completed_teams = models.ManyToManyField( Team, + blank=True, related_name="completed_surveys", verbose_name=_("teams that completed the survey"), ) diff --git a/tfjm/lists.py b/tfjm/lists.py index 76ea8af..51adec6 100644 --- a/tfjm/lists.py +++ b/tfjm/lists.py @@ -1,8 +1,6 @@ # Copyright (C) 2020 by Animath # SPDX-License-Identifier: GPL-3.0-or-later -import os - from django.conf import settings _client = None