From a84ffcf0a3e07e107b5d5bddbca89243e6d22415 Mon Sep 17 00:00:00 2001 From: Emmy D'Anello Date: Mon, 28 Apr 2025 22:01:26 +0200 Subject: [PATCH] Bouton pour rendre les solutions accessibles pour le second tour en 1 clic --- locale/fr/LC_MESSAGES/django.po | 705 +++++++++--------- participation/models.py | 4 + .../participation/tournament_detail.html | 68 +- participation/urls.py | 4 +- participation/views.py | 60 +- tfjm/templates/sidebar.html | 2 +- 6 files changed, 474 insertions(+), 369 deletions(-) diff --git a/locale/fr/LC_MESSAGES/django.po b/locale/fr/LC_MESSAGES/django.po index c8b480c..fe6dbe2 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:56+0100\n" +"POT-Creation-Date: 2025-04-28 22:00+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Emmy D'Anello \n" "Language-Team: LANGUAGE \n" @@ -38,7 +38,7 @@ msgid "Private channels" msgstr "Messages privés" #: chat/models.py:29 participation/models.py:36 participation/models.py:272 -#: participation/tables.py:18 participation/tables.py:34 +#: participation/tables.py:19 participation/tables.py:35 msgid "name" msgstr "nom" @@ -77,11 +77,12 @@ msgid "Permission type that is required to write a message to a channel." 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:788 -#: participation/models.py:812 participation/models.py:1151 -#: registration/models.py:780 +#: draw/models.py:27 participation/admin.py:86 participation/admin.py:148 +#: participation/admin.py:203 participation/models.py:792 +#: participation/models.py:816 participation/models.py:1155 +#: registration/models.py:779 #: registration/templates/registration/payment_form.html:53 +#: survey/templates/survey/survey_detail.html:51 msgid "tournament" msgstr "tournoi" @@ -94,9 +95,9 @@ msgstr "" "concerné." #: chat/models.py:73 draw/models.py:446 draw/models.py:473 -#: participation/admin.py:140 participation/admin.py:160 -#: participation/models.py:1686 participation/models.py:1695 -#: participation/tables.py:84 +#: participation/admin.py:144 participation/admin.py:172 +#: participation/models.py:1698 participation/models.py:1707 +#: participation/tables.py:85 msgid "pool" msgstr "poule" @@ -108,13 +109,13 @@ msgstr "" "concernée." #: chat/models.py:84 draw/templates/draw/tournament_content.html:277 -#: participation/admin.py:172 participation/models.py:261 -#: participation/models.py:803 +#: participation/admin.py:199 participation/models.py:261 +#: participation/models.py:807 #: participation/templates/participation/tournament_harmonize.html:15 -#: registration/models.py:159 registration/models.py:771 +#: registration/models.py:159 registration/models.py:770 #: registration/tables.py:39 #: registration/templates/registration/payment_form.html:52 -#: survey/templates/survey/survey_detail.html:60 +#: survey/templates/survey/survey_detail.html:62 msgid "team" msgstr "équipe" @@ -260,13 +261,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:262 -#: participation/tables.py:88 +#: participation/admin.py:116 participation/models.py:262 +#: participation/tables.py:89 msgid "teams" msgstr "équipes" #: draw/admin.py:92 draw/models.py:245 draw/models.py:465 -#: participation/models.py:1155 +#: participation/models.py:1159 msgid "round" msgstr "tour" @@ -645,7 +646,7 @@ msgstr "Le numéro du tour doit être entre 1 et {nb}." msgid "rounds" msgstr "tours" -#: draw/models.py:268 participation/models.py:1163 +#: draw/models.py:268 participation/models.py:1167 msgid "letter" msgstr "lettre" @@ -683,12 +684,12 @@ msgstr "L'instance complète de la poule." msgid "Pool {letter}{number}" msgstr "Poule {letter}{number}" -#: draw/models.py:447 participation/models.py:1687 +#: draw/models.py:447 participation/models.py:1699 msgid "pools" msgstr "poules" -#: draw/models.py:459 participation/models.py:1141 participation/models.py:1906 -#: participation/models.py:1940 participation/models.py:1982 +#: draw/models.py:459 participation/models.py:1145 participation/models.py:1918 +#: participation/models.py:1952 participation/models.py:1994 msgid "participation" msgstr "participation" @@ -712,9 +713,9 @@ 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:1272 -#: participation/models.py:1709 participation/models.py:1947 -#: participation/views.py:1501 participation/views.py:1766 +#: draw/models.py:496 draw/models.py:519 participation/models.py:1280 +#: participation/models.py:1721 participation/models.py:1959 +#: participation/views.py:1537 participation/views.py:1802 #, python-brace-format msgid "Problem #{problem}" msgstr "Problème n°{problem}" @@ -982,40 +983,40 @@ msgstr "changelogs" msgid "Changelog of type \"{action}\" for model {model} at {timestamp}" msgstr "Changelog de type \"{action}\" pour le modèle {model} le {timestamp}" -#: participation/admin.py:83 participation/tables.py:44 +#: participation/admin.py:90 participation/tables.py:45 msgid "valid" msgstr "valide" -#: participation/admin.py:87 participation/models.py:824 +#: participation/admin.py:94 participation/models.py:828 msgid "selected for final" msgstr "sélectionnée pour la finale" -#: participation/admin.py:124 participation/admin.py:188 -#: participation/models.py:1716 participation/tables.py:114 +#: participation/admin.py:128 participation/admin.py:215 +#: participation/models.py:1728 participation/tables.py:118 msgid "reporter" msgstr "défenseur⋅se" -#: participation/admin.py:128 participation/models.py:1723 -#: participation/models.py:1994 +#: participation/admin.py:132 participation/models.py:1735 +#: participation/models.py:2006 msgid "opponent" msgstr "opposant⋅e" -#: participation/admin.py:132 participation/models.py:1730 -#: participation/models.py:1995 +#: participation/admin.py:136 participation/models.py:1742 +#: participation/models.py:2007 msgid "reviewer" msgstr "rapporteur⋅rice" -#: participation/admin.py:136 participation/models.py:1737 -#: participation/models.py:1996 +#: participation/admin.py:140 participation/models.py:1749 +#: participation/models.py:2008 msgid "observer" msgstr "observateur⋅rice" -#: participation/admin.py:192 participation/models.py:1945 +#: participation/admin.py:219 participation/models.py:1957 msgid "problem" msgstr "numéro de problème" -#: participation/apps.py:14 participation/models.py:1142 -#: participation/models.py:1185 +#: participation/apps.py:14 participation/models.py:1146 +#: participation/models.py:1189 msgid "participations" msgstr "participations" @@ -1040,7 +1041,7 @@ msgid "The team is already validated or the validation is pending." msgstr "La validation de l'équipe est déjà faite ou en cours." #: participation/forms.py:85 -#: participation/templates/participation/tournament_detail.html:211 +#: participation/templates/participation/tournament_detail.html:247 msgid "IMPORTANT" msgstr "IMPORTANT" @@ -1277,7 +1278,7 @@ msgstr "" "L'équipe {trigram} n'a pas encore été validée par les organisateurices. " "Merci de patienter." -#: participation/models.py:198 registration/models.py:599 +#: participation/models.py:198 registration/models.py:598 msgid "Pending validation" msgstr "Validation en attente" @@ -1370,7 +1371,7 @@ msgstr "" "date limite pour envoyer les notes de synthèses pour la troisième phase" #: participation/models.py:367 -#: participation/templates/participation/tournament_detail.html:52 +#: participation/templates/participation/tournament_detail.html:86 msgid "description" msgstr "description" @@ -1388,116 +1389,116 @@ msgstr "finale" msgid "Google Sheet ID" msgstr "ID de la feuille Google Sheets" -#: participation/models.py:466 participation/views.py:1820 +#: participation/models.py:470 participation/views.py:1856 msgid "Notation sheet" msgstr "Feuille de notation" -#: participation/models.py:478 participation/models.py:479 -#: participation/models.py:481 participation/models.py:721 +#: participation/models.py:482 participation/models.py:483 +#: participation/models.py:485 participation/models.py:725 msgid "Final ranking" msgstr "Classement final" -#: participation/models.py:486 participation/models.py:558 -#: participation/models.py:1347 participation/views.py:1740 -#: survey/templates/survey/survey_detail.html:58 +#: participation/models.py:490 participation/models.py:562 +#: participation/models.py:1355 participation/views.py:1776 +#: survey/templates/survey/survey_detail.html:59 msgid "Team" msgstr "Équipe" -#: participation/models.py:486 +#: participation/models.py:490 msgid "Scores day 1" msgstr "Scores jour 1" -#: participation/models.py:486 +#: participation/models.py:490 msgid "Tweaks day 1" msgstr "Ajustements 1" -#: participation/models.py:487 +#: participation/models.py:491 msgid "Scores day 2" msgstr "Scores jour 2" -#: participation/models.py:487 +#: participation/models.py:491 msgid "Tweaks day 2" msgstr "Ajustements 2" -#: participation/models.py:488 +#: participation/models.py:492 msgid "Total D1 + D2" msgstr "Total J1 + J2" -#: participation/models.py:488 +#: participation/models.py:492 msgid "Scores day 3" msgstr "Scores jour 3" -#: participation/models.py:488 +#: participation/models.py:492 msgid "Tweaks day 3" msgstr "Ajustements 3" -#: participation/models.py:490 participation/models.py:1347 -#: participation/views.py:1747 +#: participation/models.py:494 participation/models.py:1355 +#: participation/views.py:1783 msgid "Total" msgstr "Total" -#: participation/models.py:490 participation/models.py:558 -#: participation/models.py:1347 +#: participation/models.py:494 participation/models.py:562 +#: participation/models.py:1355 #: participation/templates/participation/tournament_harmonize.html:14 -#: participation/views.py:1750 +#: participation/views.py:1786 msgid "Rank" msgstr "Rang" -#: 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 +#: participation/models.py:511 participation/models.py:525 +#: participation/models.py:542 participation/models.py:1271 +#: participation/models.py:1272 participation/models.py:1275 +#: participation/models.py:1378 participation/models.py:1380 +#: participation/models.py:1382 participation/models.py:1389 +#: participation/models.py:1393 participation/models.py:1642 +#: participation/models.py:1664 participation/models.py:2128 +#: participation/views.py:1857 msgid "Pool" msgstr "Poule" -#: participation/models.py:558 participation/models.py:723 +#: participation/models.py:562 participation/models.py:727 msgid "Score" msgstr "Score" -#: participation/models.py:558 +#: participation/models.py:562 msgid "Mention" msgstr "Mention" -#: participation/models.py:703 participation/models.py:1616 +#: participation/models.py:707 participation/models.py:1624 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:789 registration/admin.py:125 +#: participation/models.py:793 registration/admin.py:125 msgid "tournaments" msgstr "tournois" -#: participation/models.py:818 +#: participation/models.py:822 msgid "valid team" msgstr "équipe valide" -#: participation/models.py:819 +#: participation/models.py:823 msgid "The participation got the validation of the organizers." msgstr "La participation a été validée par les organisateur⋅rices." -#: participation/models.py:825 +#: participation/models.py:829 msgid "The team is selected for the final tournament." msgstr "L'équipe est sélectionnée pour la finale." -#: participation/models.py:829 +#: participation/models.py:833 msgid "mention" msgstr "mention" -#: participation/models.py:836 +#: participation/models.py:840 msgid "mention (final)" msgstr "Mention (pour la finale) :" -#: participation/models.py:846 +#: participation/models.py:850 #, python-brace-format msgid "Participation of the team {name} ({trigram})" msgstr "Participation de l'équipe {name} ({trigram})" -#: participation/models.py:855 +#: participation/models.py:859 #, python-brace-format msgid "" "

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

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

" -#: participation/models.py:863 +#: participation/models.py:867 msgid "Missing payments" msgstr "Paiements manquants" -#: participation/models.py:872 registration/models.py:310 +#: participation/models.py:876 registration/models.py:309 #, python-brace-format msgid "" "Please answer to the survey \"{name}\". You can go to the survey on ce lien, en utilisant le " "code que vous avez reçu par mail." -#: participation/models.py:876 registration/models.py:314 +#: participation/models.py:880 registration/models.py:313 msgid "Required answer to survey" msgstr "Réponse requise au questionnaire" -#: participation/models.py:893 +#: participation/models.py:897 msgid "" "

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

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

" -#: participation/models.py:903 participation/models.py:917 +#: participation/models.py:907 participation/models.py:921 msgid "Solutions due" msgstr "Rendu des solutions" -#: participation/models.py:909 +#: participation/models.py:913 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 " @@ -1561,7 +1562,7 @@ msgstr "" "parties.

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

" -#: participation/models.py:923 registration/models.py:624 +#: participation/models.py:927 registration/models.py:623 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." @@ -1571,11 +1572,11 @@ msgstr "" "{date:%d/%m/%Y %H:%M}. Vous pouvez y participer sur ce lien.

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

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

" -#: participation/models.py:950 participation/models.py:1013 -#: participation/models.py:1077 +#: participation/models.py:954 participation/models.py:1017 +#: participation/models.py:1081 #, 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:959 participation/models.py:1022 -#: participation/models.py:1086 +#: participation/models.py:963 participation/models.py:1026 +#: participation/models.py:1090 #, 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:969 participation/models.py:1032 -#: participation/models.py:1096 +#: participation/models.py:973 participation/models.py:1036 +#: participation/models.py:1100 #, 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:989 participation/models.py:1052 -#: participation/models.py:1116 +#: participation/models.py:993 participation/models.py:1056 +#: participation/models.py:1120 #: participation/templates/participation/upload_written_review.html:9 msgid "Templates:" msgstr "Modèles :" -#: participation/models.py:994 registration/models.py:646 +#: participation/models.py:998 registration/models.py:645 msgid "First round" msgstr "Premier tour" -#: participation/models.py:1006 +#: participation/models.py:1010 #, python-brace-format msgid "" "

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

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

" -#: participation/models.py:1057 participation/models.py:1121 -#: registration/models.py:657 +#: participation/models.py:1061 participation/models.py:1125 +#: registration/models.py:656 msgid "Second round" msgstr "Second tour" -#: participation/models.py:1070 +#: participation/models.py:1074 #, python-brace-format msgid "" "

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

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

" -#: participation/models.py:1127 +#: participation/models.py:1131 #, 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:1132 +#: participation/models.py:1136 msgid "Tournament ended" msgstr "Tournoi terminé" -#: participation/models.py:1157 participation/models.py:1158 -#: participation/models.py:1159 +#: participation/models.py:1161 participation/models.py:1162 +#: participation/models.py:1163 #, python-brace-format msgid "Round {round}" msgstr "Tour {round}" -#: participation/models.py:1173 +#: participation/models.py:1177 msgid "room" msgstr "salle" -#: participation/models.py:1175 +#: participation/models.py:1179 msgid "Room 1" msgstr "Salle 1" -#: participation/models.py:1176 +#: participation/models.py:1180 msgid "Room 2" msgstr "Salle 2" -#: participation/models.py:1179 +#: participation/models.py:1183 msgid "For 5-teams pools only" msgstr "Pour les poules de 5 équipe uniquement" -#: participation/models.py:1191 +#: participation/models.py:1195 msgid "juries" msgstr "jurys" -#: participation/models.py:1200 +#: participation/models.py:1204 msgid "president of the jury" msgstr "président⋅e du jury" -#: participation/models.py:1207 +#: participation/models.py:1211 msgid "BigBlueButton URL" msgstr "Lien BigBlueButton" -#: participation/models.py:1208 +#: participation/models.py:1212 msgid "The link of the BBB visio for this pool." msgstr "Le lien du salon BBB pour cette poule." -#: participation/models.py:1213 +#: participation/models.py:1217 msgid "results available" msgstr "résultats disponibles" -#: participation/models.py:1214 +#: participation/models.py:1218 msgid "" "Check this case when results become accessible to teams. They stay " "accessible to you. Only averages are given." @@ -1720,95 +1721,95 @@ msgstr "" "Ils restent toujours accessibles pour vous. Seules les moyennes sont " "communiquées." -#: participation/models.py:1246 +#: participation/models.py:1250 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:1273 participation/models.py:1347 -#: participation/views.py:1495 participation/views.py:1744 +#: participation/models.py:1281 participation/models.py:1355 +#: participation/views.py:1531 participation/views.py:1780 msgid "Problem" msgstr "Problème" -#: participation/models.py:1274 participation/views.py:1516 +#: participation/models.py:1282 participation/views.py:1552 msgid "Reporter" msgstr "Défenseur⋅se" -#: participation/models.py:1275 participation/views.py:1522 +#: participation/models.py:1283 participation/views.py:1558 msgid "Opponent" msgstr "Opposant⋅e" -#: participation/models.py:1276 participation/views.py:1529 +#: participation/models.py:1284 participation/views.py:1565 msgid "Reviewer" msgstr "Rapporteur⋅rice" -#: participation/models.py:1277 participation/views.py:1536 +#: participation/models.py:1285 participation/views.py:1572 msgid "Observer" msgstr "Observateur⋅rice" -#: participation/models.py:1278 participation/views.py:1510 +#: participation/models.py:1286 participation/views.py:1546 msgid "Role" msgstr "Rôle" -#: 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 +#: participation/models.py:1287 participation/models.py:1289 +#: participation/models.py:1290 participation/views.py:1588 +#: participation/views.py:1596 participation/views.py:1604 +#: participation/views.py:1614 msgid "Writing" msgstr "Écrit" -#: 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 +#: participation/models.py:1288 participation/models.py:1289 +#: participation/models.py:1290 participation/views.py:1592 +#: participation/views.py:1600 participation/views.py:1609 +#: participation/views.py:1618 msgid "Oral" msgstr "Oral" -#: participation/models.py:1283 participation/views.py:1544 -#: participation/views.py:1545 +#: participation/models.py:1291 participation/views.py:1580 +#: participation/views.py:1581 msgid "Juree" msgstr "Juré⋅e" -#: participation/models.py:1306 participation/models.py:1632 -#: participation/models.py:1654 participation/views.py:1614 +#: participation/models.py:1314 participation/models.py:1644 +#: participation/models.py:1666 participation/views.py:1650 msgid "Average" msgstr "Moyenne" -#: participation/models.py:1312 participation/views.py:1633 +#: participation/models.py:1320 participation/views.py:1669 msgid "Coefficient" msgstr "Coefficien" -#: participation/models.py:1313 participation/views.py:1676 +#: participation/models.py:1321 participation/views.py:1712 msgid "Subtotal" msgstr "Sous-total" -#: participation/models.py:1579 +#: participation/models.py:1587 #, 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:1667 +#: participation/models.py:1679 #, 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:1680 +#: participation/models.py:1692 #, 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:1700 +#: participation/models.py:1712 msgid "position" msgstr "position" -#: participation/models.py:1707 +#: participation/models.py:1719 msgid "reported solution" msgstr "solution défendue" -#: participation/models.py:1745 +#: participation/models.py:1757 msgid "penalties" msgstr "pénalités" -#: participation/models.py:1747 +#: participation/models.py:1759 msgid "" "Number of penalties for the reporter. The reporter will loose a 0.5 " "coefficient per penalty." @@ -1816,166 +1817,166 @@ 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:1873 participation/models.py:1876 -#: participation/models.py:1879 participation/models.py:1882 +#: participation/models.py:1885 participation/models.py:1888 +#: participation/models.py:1891 participation/models.py:1894 #, 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:1887 +#: participation/models.py:1899 #, python-brace-format msgid "Passage of {reporter} for problem {problem}" msgstr "Passage de {reporter} pour le problème {problem}" -#: participation/models.py:1891 participation/models.py:1900 -#: participation/models.py:1989 participation/models.py:2032 +#: participation/models.py:1903 participation/models.py:1912 +#: participation/models.py:2001 participation/models.py:2044 msgid "passage" msgstr "passage" -#: participation/models.py:1892 +#: participation/models.py:1904 msgid "passages" msgstr "passages" -#: participation/models.py:1911 +#: participation/models.py:1923 msgid "difference" msgstr "différence" -#: participation/models.py:1912 +#: participation/models.py:1924 msgid "Score to add/remove on the final score" msgstr "Score à ajouter/retrancher au score final" -#: participation/models.py:1919 +#: participation/models.py:1931 msgid "tweak" msgstr "harmonisation" -#: participation/models.py:1920 +#: participation/models.py:1932 msgid "tweaks" msgstr "harmonisations" -#: participation/models.py:1952 +#: participation/models.py:1964 msgid "solution for the final tournament" msgstr "solution pour la finale" -#: participation/models.py:1957 participation/models.py:2001 +#: participation/models.py:1969 participation/models.py:2013 msgid "file" msgstr "fichier" -#: participation/models.py:1967 +#: participation/models.py:1979 #, 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:1969 +#: participation/models.py:1981 msgid "for final" msgstr "pour la finale" -#: participation/models.py:1972 +#: participation/models.py:1984 msgid "solution" msgstr "solution" -#: participation/models.py:1973 +#: participation/models.py:1985 msgid "solutions" msgstr "solutions" -#: participation/models.py:2007 +#: participation/models.py:2019 #, 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:2015 +#: participation/models.py:2027 msgid "written review" msgstr "note de synthèse" -#: participation/models.py:2016 +#: participation/models.py:2028 msgid "written reviews" msgstr "notes de synthèse" -#: participation/models.py:2025 +#: participation/models.py:2037 msgid "jury" msgstr "jury" -#: participation/models.py:2037 +#: participation/models.py:2049 msgid "reporter writing note" msgstr "note d'écrit défenseur⋅se" -#: participation/models.py:2043 +#: participation/models.py:2055 msgid "reporter oral note" msgstr "note d'oral défenseur⋅se" -#: participation/models.py:2049 +#: participation/models.py:2061 msgid "opponent writing note" msgstr "note d'écrit opposant⋅e" -#: participation/models.py:2055 +#: participation/models.py:2067 msgid "opponent oral note" msgstr "note d'oral opposant⋅e" -#: participation/models.py:2061 +#: participation/models.py:2073 msgid "reviewer writing note" msgstr "note d'écrit rapporteur⋅rice" -#: participation/models.py:2067 +#: participation/models.py:2079 msgid "reviewer oral note" msgstr "note d'oral du rapporteur⋅rice" -#: participation/models.py:2073 +#: participation/models.py:2085 msgid "observer writing note" msgstr "note d'écrit de l'observateur⋅rice" -#: participation/models.py:2079 +#: participation/models.py:2091 msgid "observer oral note" msgstr "note d'oral de l'observateur⋅rice" -#: participation/models.py:2144 +#: participation/models.py:2156 #, python-brace-format msgid "Notes of {jury} for {passage}" msgstr "Notes de {jury} pour le {passage}" -#: participation/models.py:2147 +#: participation/models.py:2159 msgid "note" msgstr "note" -#: participation/models.py:2148 +#: participation/models.py:2160 msgid "notes" msgstr "notes" -#: participation/tables.py:39 +#: participation/tables.py:40 msgid "trigram" msgstr "trigramme" -#: participation/tables.py:50 +#: participation/tables.py:51 msgid "Validated" msgstr "Validée" -#: participation/tables.py:50 +#: participation/tables.py:51 msgid "Validation pending" msgstr "Validation en attente" -#: participation/tables.py:50 +#: participation/tables.py:51 msgid "Not validated" msgstr "Non validée" -#: participation/tables.py:64 +#: participation/tables.py:65 msgid "date" msgstr "date" -#: participation/tables.py:67 +#: participation/tables.py:68 #, python-brace-format msgid "From {start} to {end}" msgstr "Du {start} au {end}" -#: participation/tables.py:94 +#: participation/tables.py:95 #, python-brace-format msgid "Pool {code}" msgstr "Poule {code}" -#: participation/tables.py:98 +#: participation/tables.py:99 msgid "No defined team" msgstr "Pas d'équipe définie" -#: participation/tables.py:147 participation/tables.py:155 +#: participation/tables.py:157 participation/tables.py:165 #: participation/templates/participation/note_form.html:14 #: participation/templates/participation/passage_detail.html:15 #: participation/templates/participation/passage_detail.html:176 @@ -1991,7 +1992,7 @@ msgstr "Pas d'équipe définie" #: registration/templates/registration/update_user.html:16 #: registration/templates/registration/user_detail.html:220 #: survey/templates/survey/survey_detail.html:40 -#: survey/templates/survey/survey_detail.html:73 +#: survey/templates/survey/survey_detail.html:76 #: survey/templates/survey/survey_form.html:12 msgid "Update" msgstr "Modifier" @@ -2261,7 +2262,7 @@ msgid "Go to the Google Sheets page of the pool" msgstr "Aller à la page Google Sheets de la poule" #: participation/templates/participation/pool_detail.html:116 -#: participation/templates/participation/tournament_detail.html:109 +#: participation/templates/participation/tournament_detail.html:145 #: participation/templates/participation/tournament_harmonize.html:8 msgid "Ranking" msgstr "Classement" @@ -2422,7 +2423,7 @@ msgid "Payment of" msgstr "Paiement de" #: participation/templates/participation/team_detail.html:166 -#: registration/models.py:701 +#: registration/models.py:700 msgid "grouped" msgstr "groupé" @@ -2545,91 +2546,109 @@ msgid "date of maximal written reviews submission for the first round" msgstr "date limite de soumission des notes de synthèse pour le premier tour" #: participation/templates/participation/tournament_detail.html:44 +msgid "Solutions available for the second round" +msgstr "Solutions du second tour disponibles" + +#: participation/templates/participation/tournament_detail.html:51 +#: participation/templates/participation/tournament_detail.html:72 +msgid "Publish" +msgstr "Publier" + +#: participation/templates/participation/tournament_detail.html:55 +#: participation/templates/participation/tournament_detail.html:76 +msgid "Unpublish" +msgstr "Dépublier" + +#: participation/templates/participation/tournament_detail.html:61 msgid "date of maximal written reviews submission for the second round" msgstr "date limite de soumission des notes de synthèse pour le second tour" -#: participation/templates/participation/tournament_detail.html:48 +#: participation/templates/participation/tournament_detail.html:65 +msgid "Solutions available for the third round" +msgstr "Solutions du troisième tour disponibles" + +#: participation/templates/participation/tournament_detail.html:82 msgid "date of maximal written reviews submission for the third round" msgstr "date limite de soumission des notes de synthèse pour le troisième tour" -#: participation/templates/participation/tournament_detail.html:56 +#: participation/templates/participation/tournament_detail.html:90 msgid "To contact organizers" msgstr "Pour contacter les organisateur⋅rices" -#: participation/templates/participation/tournament_detail.html:59 +#: participation/templates/participation/tournament_detail.html:94 msgid "To contact juries" msgstr "Pour contacter les juré⋅es" -#: participation/templates/participation/tournament_detail.html:62 +#: participation/templates/participation/tournament_detail.html:97 msgid "To contact valid teams" msgstr "Pour contacter les équipes valides" -#: participation/templates/participation/tournament_detail.html:72 +#: participation/templates/participation/tournament_detail.html:108 msgid "Edit tournament" msgstr "Modifier le tournoi" -#: participation/templates/participation/tournament_detail.html:80 +#: participation/templates/participation/tournament_detail.html:116 #: tfjm/templates/navbar.html:35 msgid "Teams" msgstr "Équipes" -#: participation/templates/participation/tournament_detail.html:89 +#: participation/templates/participation/tournament_detail.html:125 msgid "Access to payments list" msgstr "Accéder à la liste des paiements" -#: participation/templates/participation/tournament_detail.html:98 +#: participation/templates/participation/tournament_detail.html:134 msgid "Pools" msgstr "Poules" -#: participation/templates/participation/tournament_detail.html:127 +#: participation/templates/participation/tournament_detail.html:163 msgid "Selected for final tournament" msgstr "Sélectionnée pour la finale" -#: participation/templates/participation/tournament_detail.html:135 +#: participation/templates/participation/tournament_detail.html:171 msgid "Select for final tournament" msgstr "Sélectionner pour la finale" -#: participation/templates/participation/tournament_detail.html:148 -#: participation/templates/participation/tournament_detail.html:152 -#: participation/templates/participation/tournament_detail.html:157 +#: participation/templates/participation/tournament_detail.html:184 +#: participation/templates/participation/tournament_detail.html:188 +#: participation/templates/participation/tournament_detail.html:193 msgid "Harmonize" msgstr "Harmoniser" -#: participation/templates/participation/tournament_detail.html:148 -#: participation/templates/participation/tournament_detail.html:152 -#: participation/templates/participation/tournament_detail.html:157 +#: participation/templates/participation/tournament_detail.html:184 +#: participation/templates/participation/tournament_detail.html:188 +#: participation/templates/participation/tournament_detail.html:193 msgid "Day" msgstr "Jour" -#: participation/templates/participation/tournament_detail.html:167 +#: participation/templates/participation/tournament_detail.html:203 msgid "Publish notes for first round" msgstr "Publier les notes pour le premier tour" -#: participation/templates/participation/tournament_detail.html:172 +#: participation/templates/participation/tournament_detail.html:208 msgid "Unpublish notes for first round" msgstr "Dépublier les notes pour le premier tour" -#: participation/templates/participation/tournament_detail.html:178 +#: participation/templates/participation/tournament_detail.html:214 msgid "Publish notes for second round" msgstr "Publier les notes pour le second tour" -#: participation/templates/participation/tournament_detail.html:183 +#: participation/templates/participation/tournament_detail.html:219 msgid "Unpublish notes for second round" msgstr "Dépublier les notes pour le second tour" -#: participation/templates/participation/tournament_detail.html:190 +#: participation/templates/participation/tournament_detail.html:226 msgid "Publish notes for third round" msgstr "Publier les notes pour le troisième tour" -#: participation/templates/participation/tournament_detail.html:195 +#: participation/templates/participation/tournament_detail.html:231 msgid "Unpublish notes for third round" msgstr "Dépublier les notes pour le troisième tour" -#: participation/templates/participation/tournament_detail.html:208 +#: participation/templates/participation/tournament_detail.html:244 msgid "Files available for download" msgstr "Fichiers disponibles au téléchargement" -#: participation/templates/participation/tournament_detail.html:214 +#: participation/templates/participation/tournament_detail.html:250 msgid "" "The files accessible below may contain personal information. In compliance " "with European law and out of respect for the confidentiality of participants " @@ -2642,7 +2661,7 @@ msgstr "" "données que dans un cadre strictement nécessaire en lien avec l'organisation " "du tournoi." -#: participation/templates/participation/tournament_detail.html:222 +#: participation/templates/participation/tournament_detail.html:258 msgid "" "Moreover, it is your responsibility to delete these files once you no longer " "need them, especially at the end of the tournament." @@ -2650,7 +2669,7 @@ msgstr "" "De plus, il est de votre responsabilité de supprimer ces fichiers une fois " "que vous n'en avez plus besoin, notamment à la fin du tournoi." -#: participation/templates/participation/tournament_detail.html:230 +#: participation/templates/participation/tournament_detail.html:266 msgid "" "I agree not to divulge participants data and to delete them at the end of " "the tournament." @@ -2658,44 +2677,44 @@ msgstr "" "Je m'engage à ne pas divulguer les données des participant⋅es et à les " "supprimer à l'issue du tournoi" -#: participation/templates/participation/tournament_detail.html:240 +#: participation/templates/participation/tournament_detail.html:276 msgid "Validated team participant data spreadsheet" msgstr "Tableur des données des équipes validées" -#: participation/templates/participation/tournament_detail.html:245 +#: participation/templates/participation/tournament_detail.html:281 msgid "All teams participant data spreadsheet" msgstr "Tableur des données de toutes les équipes" -#: participation/templates/participation/tournament_detail.html:250 +#: participation/templates/participation/tournament_detail.html:286 msgid "Archive of all authorisations sorted by team and person" msgstr "Archive de toutes les autorisations triées par équipe et personne" -#: participation/templates/participation/tournament_detail.html:255 +#: participation/templates/participation/tournament_detail.html:291 msgid "Archive of all submitted solutions sorted by team" msgstr "Archive de toutes les solutions envoyées triées par équipe" -#: participation/templates/participation/tournament_detail.html:260 +#: participation/templates/participation/tournament_detail.html:296 msgid "Archive of all sent solutions sorted by problem" msgstr "Archive de toutes les solutions envoyées triées par problème" -#: participation/templates/participation/tournament_detail.html:265 +#: participation/templates/participation/tournament_detail.html:301 msgid "Archive of all sent solutions sorted by pool" msgstr "Archive de toutes les solutions envoyées triées par poule" -#: participation/templates/participation/tournament_detail.html:270 +#: participation/templates/participation/tournament_detail.html:306 msgid "Archive of all summary notes sorted by pool and passage" msgstr "Archive de toutes les notes de synthèse triées par poule et passage" -#: participation/templates/participation/tournament_detail.html:276 +#: participation/templates/participation/tournament_detail.html:312 msgid "Note spreadsheet on Google Sheets" msgstr "Tableur de notes sur Google Sheets" -#: participation/templates/participation/tournament_detail.html:281 +#: participation/templates/participation/tournament_detail.html:317 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:672 +#: registration/models.py:671 msgid "Note" msgstr "Note" @@ -2882,93 +2901,101 @@ msgstr "Notes publiées !" msgid "Notes hidden!" msgstr "Notes dissimulées !" -#: participation/views.py:794 +#: participation/views.py:800 +msgid "Solutions are now available to teams!" +msgstr "Les solutions sont désormais accessibles aux équipes !" + +#: participation/views.py:802 +msgid "Solutions are not available to teams anymore." +msgstr "Les solutions ne sont plus accessibles aux équipes." + +#: participation/views.py:833 #, python-brace-format msgid "Harmonize notes of {tournament} - Day {round}" msgstr "Harmoniser les notes de {tournament} - Jour {round}" -#: participation/views.py:908 +#: participation/views.py:947 msgid "You can't upload a solution after the deadline." msgstr "Vous ne pouvez pas envoyer de solution après la date limite." -#: participation/views.py:1028 +#: participation/views.py:1064 #, python-brace-format msgid "Solutions of team {trigram}.zip" msgstr "Solutions de l'équipe {trigram}.zip" -#: participation/views.py:1029 +#: participation/views.py:1065 #, python-brace-format msgid "Written reviews of team {trigram}.zip" msgstr "Notes de synthèse de l'équipe {trigram}.zip" -#: participation/views.py:1046 participation/views.py:1062 +#: participation/views.py:1082 participation/views.py:1098 #, python-brace-format msgid "Solutions of {tournament}.zip" msgstr "Solutions de {tournament}.zip" -#: participation/views.py:1047 participation/views.py:1063 +#: participation/views.py:1083 participation/views.py:1099 #, python-brace-format msgid "Written reviews of {tournament}.zip" msgstr "Notes de synthèse de {tournament}.zip" -#: participation/views.py:1072 +#: participation/views.py:1108 #, python-brace-format msgid "Solutions for pool {pool} of tournament {tournament}.zip" msgstr "Solutions pour la poule {pool} du tournoi {tournament}.zip" -#: participation/views.py:1073 +#: participation/views.py:1109 #, python-brace-format msgid "Written reviews for pool {pool} of tournament {tournament}.zip" msgstr "Notes de synthèses pour la poule {pool} du tournoi {tournament}.zip" -#: participation/views.py:1115 +#: participation/views.py:1151 #, python-brace-format msgid "Jury of pool {pool} for {tournament} with teams {teams}" msgstr "Jury de la poule {pool} pour {tournament} avec les équipes {teams}" -#: participation/views.py:1131 +#: participation/views.py:1167 #, python-brace-format msgid "The jury {name} is already in the pool!" msgstr "{name} est déjà dans la poule !" -#: participation/views.py:1151 +#: participation/views.py:1187 msgid "New jury account" msgstr "Nouveau compte de juré⋅e" -#: participation/views.py:1175 +#: participation/views.py:1211 #, python-brace-format msgid "The jury {name} has been successfully added!" msgstr "{name} a été ajouté⋅e avec succès en tant que juré⋅e !" -#: participation/views.py:1211 +#: participation/views.py:1247 #, python-brace-format msgid "The jury {name} has been successfully removed!" msgstr "{name} a été retiré⋅e avec succès du jury !" -#: participation/views.py:1237 +#: participation/views.py:1273 #, python-brace-format msgid "The jury {name} has been successfully promoted president!" msgstr "{name} a été nommé⋅e président⋅e du jury !" -#: participation/views.py:1265 +#: participation/views.py:1301 msgid "The following user is not registered as a jury:" msgstr "L'utilisateur⋅rice suivant n'est pas inscrit⋅e en tant que juré⋅e :" -#: participation/views.py:1281 +#: participation/views.py:1317 msgid "Notes were successfully uploaded." msgstr "Les notes ont bien été envoyées." -#: participation/views.py:1912 +#: participation/views.py:1948 #, python-brace-format msgid "Notation sheets of pool {pool} of {tournament}.zip" msgstr "Feuilles de notations pour la poule {pool} du tournoi {tournament}.zip" -#: participation/views.py:1917 +#: participation/views.py:1953 #, python-brace-format msgid "Notation sheets of {tournament}.zip" msgstr "Feuilles de notation de {tournament}.zip" -#: participation/views.py:2091 +#: participation/views.py:2127 msgid "You can't upload a written review after the deadline." msgstr "Vous ne pouvez pas envoyer de note de synthèse après la date limite." @@ -3000,7 +3027,7 @@ msgid "Mark as invalid" msgstr "Marquer comme invalide" #: registration/apps.py:14 registration/models.py:132 -#: registration/models.py:697 +#: registration/models.py:696 msgid "registrations" msgstr "inscriptions" @@ -3012,7 +3039,7 @@ msgstr "rôle" msgid "participant" msgstr "participant⋅e" -#: registration/forms.py:26 registration/models.py:533 +#: registration/forms.py:26 registration/models.py:532 msgid "coach" msgstr "encadrant⋅e" @@ -3073,31 +3100,31 @@ msgstr "Homme" msgid "Other" msgstr "Autre" -#: registration/models.py:175 +#: registration/models.py:174 msgid "address" msgstr "adresse" -#: registration/models.py:179 +#: registration/models.py:178 msgid "zip code" msgstr "code postal" -#: registration/models.py:185 +#: registration/models.py:184 msgid "city" msgstr "ville" -#: registration/models.py:190 +#: registration/models.py:189 msgid "country" msgstr "pays" -#: registration/models.py:195 +#: registration/models.py:194 msgid "phone number" msgstr "numéro de téléphone" -#: registration/models.py:200 +#: registration/models.py:199 msgid "health issues" msgstr "problèmes de santé" -#: registration/models.py:202 +#: registration/models.py:201 msgid "" "You can indicate here your allergies or anything that is important to know " "for organizers." @@ -3105,11 +3132,11 @@ msgstr "" "Vous pouvez indiquer ici vos allergies ou n'importe quoi qui peut être bon à " "savoir pour les organisateur⋅rices." -#: registration/models.py:206 +#: registration/models.py:205 msgid "housing constraints" msgstr "contraintes de logement" -#: registration/models.py:208 +#: registration/models.py:207 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 " @@ -3122,15 +3149,15 @@ msgstr "" "organisateur⋅rices. Laissez vide si vous n'avez rien de spécifique à " "déclarer." -#: registration/models.py:215 +#: registration/models.py:214 msgid "photo authorization" msgstr "autorisation de droit à l'image" -#: registration/models.py:222 +#: registration/models.py:221 msgid "photo authorization (final)" msgstr "autorisation de droit à l'image (finale)" -#: registration/models.py:268 +#: registration/models.py:267 #, 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:274 +#: registration/models.py:273 msgid "No team" msgstr "Pas d'équipe" -#: registration/models.py:282 +#: registration/models.py:281 #, python-brace-format msgid "" "You have not uploaded your photo authorization. You can do it by clicking on " @@ -3153,11 +3180,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:287 registration/models.py:300 +#: registration/models.py:286 registration/models.py:299 msgid "Photo authorization" msgstr "Autorisation de droit à l'image" -#: registration/models.py:295 +#: registration/models.py:294 #, python-brace-format msgid "" "You have not uploaded your photo authorization for the final tournament. You " @@ -3166,75 +3193,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:329 +#: registration/models.py:328 msgid "Team selected for the final tournament" msgstr "Équipe sélectionnée pour la finale" -#: registration/models.py:351 +#: registration/models.py:350 msgid "participant registration" msgstr "inscription de participant⋅e" -#: registration/models.py:352 +#: registration/models.py:351 msgid "participant registrations" msgstr "inscriptions de participant⋅es" -#: registration/models.py:361 +#: registration/models.py:360 msgid "birth date" msgstr "date de naissance" -#: registration/models.py:367 +#: registration/models.py:366 msgid "12th grade" msgstr "Terminale" -#: registration/models.py:368 +#: registration/models.py:367 msgid "11th grade" msgstr "Première" -#: registration/models.py:369 +#: registration/models.py:368 msgid "10th grade or lower" msgstr "Seconde ou inférieur" -#: registration/models.py:371 +#: registration/models.py:370 msgid "student class" msgstr "classe" -#: registration/models.py:376 +#: registration/models.py:375 msgid "school" msgstr "école" -#: registration/models.py:381 +#: registration/models.py:380 msgid "responsible name" msgstr "nom d'un⋅e responsable légal⋅e" -#: registration/models.py:386 +#: registration/models.py:385 msgid "responsible phone number" msgstr "numéro de téléphone d'un⋅e responsable légal⋅e" -#: registration/models.py:391 +#: registration/models.py:390 msgid "responsible email address" msgstr "adresse e-mail d'un⋅e responsable légal⋅e" -#: registration/models.py:396 +#: registration/models.py:395 msgid "parental authorization" msgstr "autorisation parentale" -#: registration/models.py:403 +#: registration/models.py:402 msgid "parental authorization (final)" msgstr "autorisation parentale (finale)" -#: registration/models.py:410 +#: registration/models.py:409 msgid "health sheet" msgstr "fiche sanitaire" -#: registration/models.py:417 +#: registration/models.py:416 msgid "vaccine sheet" msgstr "carnet de vaccination" -#: registration/models.py:425 +#: registration/models.py:424 msgid "student" msgstr "élève" -#: registration/models.py:436 +#: registration/models.py:435 #, python-brace-format msgid "" "You have not uploaded your parental authorization. You can do it by clicking " @@ -3243,11 +3270,11 @@ msgstr "" "Vous n'avez pas envoyé votre autorisation parentale. Vous pouvez le faire en " "cliquant sur ce lien." -#: registration/models.py:441 registration/models.py:501 +#: registration/models.py:440 registration/models.py:500 msgid "Parental authorization" msgstr "Autorisation parentale" -#: registration/models.py:447 +#: registration/models.py:446 #, python-brace-format msgid "" "You have not uploaded your health sheet. You can do it by clicking on ce lien." -#: registration/models.py:452 +#: registration/models.py:451 msgid "Health sheet" msgstr "Fiche sanitaire" -#: registration/models.py:458 +#: registration/models.py:457 #, python-brace-format msgid "" "You have not uploaded your vaccine sheet. You can do it by clicking on ce lien." -#: registration/models.py:463 +#: registration/models.py:462 msgid "Vaccine sheet" msgstr "Carnet de vaccination" -#: registration/models.py:472 +#: registration/models.py:471 #, python-brace-format msgid "" "You have to pay {amount} € for your registration, or send a scholarship " @@ -3284,15 +3311,15 @@ msgstr "" "notification de bourse ou un justificatif de paiement. Vous pouvez le faire " "sur la page de paiement." -#: registration/models.py:478 registration/models.py:487 +#: registration/models.py:477 registration/models.py:486 msgid "Payment" msgstr "Paiement" -#: registration/models.py:484 +#: registration/models.py:483 msgid "Your payment is under approval." msgstr "Votre paiement est en cours de validation." -#: registration/models.py:495 +#: registration/models.py:494 #, python-brace-format msgid "" "You have not uploaded your parental authorization for the final tournament. " @@ -3301,19 +3328,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:510 +#: registration/models.py:509 msgid "student registration" msgstr "inscription d'élève" -#: registration/models.py:511 +#: registration/models.py:510 msgid "student registrations" msgstr "inscriptions d'élève" -#: registration/models.py:522 +#: registration/models.py:521 msgid "most recent degree in mathematics, computer science or physics" msgstr "Dernier diplôme obtenu en mathématiques, informatique ou physique" -#: registration/models.py:523 +#: registration/models.py:522 msgid "" "Your most recent degree in maths, computer science or physics, or your last " "entrance exam (CAPES, Agrégation,…)" @@ -3321,23 +3348,23 @@ msgstr "" "Votre dernier diplôme en mathématiques, informatique ou physique, ou votre " "dernier concours obtenu (CAPES, Agrégation, …)" -#: registration/models.py:528 registration/models.py:550 +#: registration/models.py:527 registration/models.py:549 msgid "professional activity" msgstr "activité professionnelle" -#: registration/models.py:541 +#: registration/models.py:540 msgid "coach registration" msgstr "inscription d'encadrant⋅e" -#: registration/models.py:542 +#: registration/models.py:541 msgid "coach registrations" msgstr "inscriptions d'encadrant⋅es" -#: registration/models.py:554 +#: registration/models.py:553 msgid "administrator" msgstr "administrateur⋅rice" -#: registration/models.py:555 +#: registration/models.py:554 msgid "" "An administrator has all rights. Please don't give this right to all juries " "and volunteers." @@ -3345,15 +3372,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:565 +#: registration/models.py:564 msgid "admin" msgstr "admin" -#: registration/models.py:565 +#: registration/models.py:564 msgid "volunteer" msgstr "bénévole" -#: registration/models.py:578 +#: registration/models.py:577 msgid "" "Registrations for tournament {tournament} are closing on {date:%Y-%m-%d %H:" "%M}. There are for now {validated_teams} validated teams (+ {pending_teams} " @@ -3363,11 +3390,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:586 +#: registration/models.py:585 msgid "Registrations" msgstr "Inscriptions" -#: registration/models.py:593 +#: registration/models.py:592 #, python-brace-format msgid "" "The team {trigram} requested to be validated for the tournament of " @@ -3378,7 +3405,7 @@ msgstr "" "Vous pouvez vérifier le statut de l'équipe sur la page de " "l'équipe." -#: registration/models.py:610 +#: registration/models.py:609 #, python-brace-format msgid "" "There are {valid} validated payments, {pending} pending and {invalid} " @@ -3389,11 +3416,11 @@ msgstr "" "invalides pour le tournoi {tournament}. Vous pouvez vérifier le statut des " "paiements sur la liste des paiements." -#: registration/models.py:617 +#: registration/models.py:616 msgid "Payments" msgstr "Paiements" -#: registration/models.py:641 registration/models.py:652 +#: registration/models.py:640 registration/models.py:651 #, python-brace-format msgid "" "

You are in the jury of the pool {pool} for the tournament of " @@ -3402,7 +3429,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:665 +#: registration/models.py:664 #, python-brace-format msgid "" "

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

" -#: registration/models.py:681 +#: registration/models.py:680 msgid "volunteer registration" msgstr "inscription de bénévole" -#: registration/models.py:682 +#: registration/models.py:681 msgid "volunteer registrations" msgstr "inscriptions de bénévoles" -#: registration/models.py:703 +#: registration/models.py:702 msgid "" "If set to true, then one payment is made for the full team, for example if " "the school pays for all." @@ -3429,100 +3456,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:708 +#: registration/models.py:707 msgid "total amount" msgstr "montant total" -#: registration/models.py:709 +#: registration/models.py:708 msgid "Corresponds to the total required amount to pay, in euros." msgstr "Correspond au montant total à payer, en euros." -#: registration/models.py:714 +#: registration/models.py:713 msgid "token" msgstr "jeton" -#: registration/models.py:717 +#: registration/models.py:716 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:721 +#: registration/models.py:720 msgid "for final tournament" msgstr "pour la finale" -#: registration/models.py:726 +#: registration/models.py:725 msgid "type" msgstr "type" -#: registration/models.py:729 +#: registration/models.py:728 msgid "No payment" msgstr "Pas de paiement" -#: registration/models.py:730 +#: registration/models.py:729 #: registration/templates/registration/payment_form.html:72 msgid "Credit card" msgstr "Carte bancaire" -#: registration/models.py:731 +#: registration/models.py:730 msgid "Scholarship" msgstr "Notification de bourse" -#: registration/models.py:732 +#: registration/models.py:731 #: registration/templates/registration/payment_form.html:77 msgid "Bank transfer" msgstr "Virement bancaire" -#: registration/models.py:733 +#: registration/models.py:732 msgid "Other (please indicate)" msgstr "Autre (veuillez spécifier)" -#: registration/models.py:734 +#: registration/models.py:733 msgid "The tournament is free" msgstr "Le tournoi est gratuit" -#: registration/models.py:741 +#: registration/models.py:740 msgid "Hello Asso checkout intent ID" msgstr "ID de l'intention de paiement Hello Asso" -#: registration/models.py:748 +#: registration/models.py:747 msgid "receipt" msgstr "justificatif" -#: registration/models.py:749 +#: registration/models.py:748 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:756 +#: registration/models.py:755 msgid "additional information" msgstr "informations additionnelles" -#: registration/models.py:757 +#: registration/models.py:756 msgid "To help us to find your payment." msgstr "Pour nous aider à retrouver votre paiement, si nécessaire." -#: registration/models.py:763 +#: registration/models.py:762 msgid "payment valid" msgstr "paiement valide" -#: registration/models.py:823 +#: registration/models.py:822 msgid "Reminder for your payment" msgstr "Rappel pour votre paiement" -#: registration/models.py:834 +#: registration/models.py:833 msgid "Payment confirmation" msgstr "Confirmation de paiement" -#: registration/models.py:856 +#: registration/models.py:855 #, python-brace-format msgid "Payment of {registrations}" msgstr "Paiements de {registrations}" -#: registration/models.py:859 +#: registration/models.py:858 msgid "payment" msgstr "paiement" -#: registration/models.py:860 +#: registration/models.py:859 msgid "payments" msgstr "paiements" @@ -4356,27 +4383,27 @@ msgstr "" "quelques minutes, et sera faite automatiquement. Si ce n'est pas le cas, " "merci de nous contacter." -#: registration/views.py:742 +#: registration/views.py:743 #, python-brace-format msgid "Photo authorization of {student}.{ext}" msgstr "Autorisation de droit à l'image de {student}.{ext}" -#: registration/views.py:766 +#: registration/views.py:767 #, python-brace-format msgid "Health sheet of {student}.{ext}" msgstr "Fiche sanitaire de {student}.{ext}" -#: registration/views.py:790 +#: registration/views.py:791 #, python-brace-format msgid "Vaccine sheet of {student}.{ext}" msgstr "Carnet de vaccination de {student}.{ext}" -#: registration/views.py:815 +#: registration/views.py:816 #, python-brace-format msgid "Parental authorization of {student}.{ext}" msgstr "Autorisation parentale de {student}.{ext}" -#: registration/views.py:839 +#: registration/views.py:840 #, python-brace-format msgid "Payment receipt of {registrations}.{ext}" msgstr "Justificatif de paiement de {registrations}.{ext}" @@ -4445,7 +4472,7 @@ msgstr "équipes ayant complété le sondage" msgid "survey" msgstr "sondage" -#: survey/tables.py:18 survey/templates/survey/survey_detail.html:51 +#: survey/tables.py:18 survey/templates/survey/survey_detail.html:52 msgid "completed" msgstr "complété" @@ -4469,15 +4496,15 @@ msgstr "Taux de complétion :" msgid "Send invites" msgstr "Envoyer les invitations" -#: survey/templates/survey/survey_detail.html:63 +#: survey/templates/survey/survey_detail.html:66 msgid "Yes" msgstr "Oui" -#: survey/templates/survey/survey_detail.html:65 +#: survey/templates/survey/survey_detail.html:68 msgid "No" msgstr "Non" -#: survey/templates/survey/survey_detail.html:72 +#: survey/templates/survey/survey_detail.html:75 msgid "Update survey" msgstr "Modifier le sondage" @@ -4541,11 +4568,11 @@ msgstr "Privé, réservé aux utilisateur⋅rices explicitement autorisé⋅es" msgid "Admin users" msgstr "Administrateur⋅rices" -#: tfjm/settings.py:175 +#: tfjm/settings.py:174 msgid "English" msgstr "Anglais" -#: tfjm/settings.py:176 +#: tfjm/settings.py:175 msgid "French" msgstr "Français" diff --git a/participation/models.py b/participation/models.py index 03ad83c..9c8b231 100644 --- a/participation/models.py +++ b/participation/models.py @@ -440,6 +440,10 @@ class Tournament(models.Model): return Participation.objects.filter(final=True) return self.participation_set + @property + def organizers_and_presidents(self): + return VolunteerRegistration.objects.filter(Q(admin=True) | Q(organized_tournaments=self) | Q(pools_presided__tournament=self)) + @property def solutions(self): if self.final: diff --git a/participation/templates/participation/tournament_detail.html b/participation/templates/participation/tournament_detail.html index baf387b..8c0b088 100644 --- a/participation/templates/participation/tournament_detail.html +++ b/participation/templates/participation/tournament_detail.html @@ -23,44 +23,80 @@
{% if tournament.price %}{{ tournament.price }} €{% else %}{% trans "Free" %}{% endif %}
{% endif %} -
{% trans 'remote'|capfirst %}
+
{% trans "remote"|capfirst %}
{{ tournament.remote|yesno }}
-
{% trans 'dates'|capfirst %}
+
{% trans "dates"|capfirst %}
{% trans "From" %} {{ tournament.date_start }} {% trans "to" %} {{ tournament.date_end }}
-
{% trans 'date of registration closing'|capfirst %}
+
{% trans "date of registration closing"|capfirst %}
{{ tournament.inscription_limit }}
-
{% trans 'date of maximal solution submission'|capfirst %}
+
{% trans "date of maximal solution submission"|capfirst %}
{{ tournament.solution_limit }}
-
{% trans 'date of the random draw'|capfirst %}
+
{% trans "date of the random draw"|capfirst %}
{{ tournament.solutions_draw }}
-
{% trans 'date of maximal written reviews submission for the first round'|capfirst %}
+
{% trans "date of maximal written reviews submission for the first round"|capfirst %}
{{ tournament.reviews_first_phase_limit }}
-
{% trans 'date of maximal written reviews submission for the second round'|capfirst %}
+
{% trans "Solutions available for the second round" %}
+
+ {{ tournament.solutions_available_second_phase|yesno }} + {% if user.is_authenticated and user.registration in tournament.organizers_and_presidents.all %} + {% now 'Y-m-d' as today %} + {% if not tournament.solutions_available_second_phase %} + {% if today >= tournament.date_first_phase|date:"Y-m-d" %} + {% trans "Publish" %} + {% endif %} + {% else %} + {% if today <= tournament.date_second_phase|date:"Y-m-d" %} + {% trans "Unpublish" %} + {% endif %} + {% endif %} + {% endif %} +
+ +
{% trans "date of maximal written reviews submission for the second round"|capfirst %}
{{ tournament.reviews_second_phase_limit }}
- {% if TFJM.APP == "ETEAM" %} -
{% trans 'date of maximal written reviews submission for the third round'|capfirst %}
+ {% if TFJM.NB_ROUNDS == 3 %} +
{% trans "Solutions available for the third round" %}
+
+ {{ tournament.solutions_available_third_phase|yesno }} + {% if tournament.solutions_available_second_phase and user.is_authenticated and user.registration in tournament.organizers_and_presidents.all %} + {% now 'Y-m-d' as today %} + {% if not tournament.solutions_available_third_phase %} + {% if today >= tournament.date_second_phase|date:"Y-m-d" %} + {% trans "Publish" %} + {% endif %} + {% else %} + {% if today <= tournament.date_third_phase|date:"Y-m-d" %} + {% trans "Unpublish" %} + {% endif %} + {% endif %} + {% endif %} +
+ +
{% trans "date of maximal written reviews submission for the third round"|capfirst %}
{{ tournament.reviews_third_phase_limit }}
{% endif %} -
{% trans 'description'|capfirst %}
+
{% trans "description"|capfirst %}
{{ tournament.description }}
{% if TFJM.ML_MANAGEMENT %} -
{% trans 'To contact organizers' %}
+
{% trans "To contact organizers" %}
{{ tournament.organizers_email }}
-
{% trans 'To contact juries' %}
-
{{ tournament.jurys_email }}
+ {% if user.is_authenticated and user.registration.is_volunteer %} +
{% trans "To contact juries" %}
+
{{ tournament.jurys_email }}
-
{% trans 'To contact valid teams' %}
-
{{ tournament.teams_email }}
+
{% trans "To contact valid teams" %}
+
{{ tournament.teams_email }}
+ {% endif %} {% endif %} @@ -199,7 +235,7 @@ {% endif %} - + {% endif %} {% if user.registration.is_admin or user.registration in tournament.organizers.all %} diff --git a/participation/urls.py b/participation/urls.py index 4812a05..cd81f7b 100644 --- a/participation/urls.py +++ b/participation/urls.py @@ -12,7 +12,7 @@ from .views import CreateTeamView, FinalNotationSheetTemplateView, GSheetNotific TeamAuthorizationsView, TeamDetailView, TeamLeaveView, TeamListView, TeamUpdateView, \ TeamUploadMotivationLetterView, TournamentCreateView, TournamentDetailView, TournamentExportCSVView, \ TournamentHarmonizeNoteView, TournamentHarmonizeView, TournamentListView, TournamentPaymentsView, \ - TournamentPublishNotesView, TournamentUpdateView, WrittenReviewUploadView + TournamentPublishNotesView, TournamentPublishSolutionsView, TournamentUpdateView, WrittenReviewUploadView app_name = "participation" @@ -48,6 +48,8 @@ urlpatterns = [ name="tournament_notation_sheets"), path("tournament//notation/notifications/", GSheetNotificationsView.as_view(), name="tournament_gsheet_notifications"), + path("tournament//publish-solutions//", TournamentPublishSolutionsView.as_view(), + name="tournament_publish_solutions"), path("tournament//publish-notes//", TournamentPublishNotesView.as_view(), name="tournament_publish_notes"), path("tournament//harmonize//", TournamentHarmonizeView.as_view(), diff --git a/participation/views.py b/participation/views.py index 8e5ff4e..b266154 100644 --- a/participation/views.py +++ b/participation/views.py @@ -747,12 +747,12 @@ class TournamentPublishNotesView(VolunteerMixin, SingleObjectMixin, RedirectView return self.handle_no_permission() tournament = self.get_object() reg = request.user.registration - if not reg.is_admin and (not reg.is_volunteer or tournament not in reg.organized_tournaments.all()): + if not reg.is_volunteer or reg not in tournament.organizers_and_presidents.all(): return self.handle_no_permission() return super().dispatch(request, *args, **kwargs) def get(self, request, *args, **kwargs): - if int(kwargs["round"]) not in (1, 2): + if int(kwargs["round"]) not in range(1, settings.NB_ROUNDS): raise Http404 tournament = Tournament.objects.get(pk=kwargs["pk"]) @@ -767,6 +767,45 @@ class TournamentPublishNotesView(VolunteerMixin, SingleObjectMixin, RedirectView return reverse_lazy("participation:tournament_detail", args=(kwargs['pk'],)) +class TournamentPublishSolutionsView(VolunteerMixin, SingleObjectMixin, RedirectView): + """ + On rend les solutions du tour suivant accessibles aux équipes. + """ + model = Tournament + + def dispatch(self, request, *args, **kwargs): + """ + Les admins, orgas et PJ peuvent rendre les solutions accessibles. + """ + if not request.user.is_authenticated: + return self.handle_no_permission() + tournament = self.get_object() + reg = request.user.registration + if not reg.is_volunteer or reg not in tournament.organizers_and_presidents.all(): + return self.handle_no_permission() + return super().dispatch(request, *args, **kwargs) + + def get(self, request, *args, **kwargs): + if int(kwargs["round"]) not in range(2, settings.NB_ROUNDS + 1): + raise Http404 + + tournament = Tournament.objects.get(pk=kwargs["pk"]) + publish_solutions = 'hide' not in request.GET + if int(kwargs['round']) == 2: + tournament.solutions_available_second_phase = publish_solutions + elif int(kwargs['round']) == 3: + tournament.solutions_available_third_phase = publish_solutions + tournament.save() + if 'hide' not in request.GET: + messages.success(request, _("Solutions are now available to teams!")) + else: + messages.warning(request, _("Solutions are not available to teams anymore.")) + return super().get(request, *args, **kwargs) + + def get_redirect_url(self, *args, **kwargs): + return reverse_lazy("participation:tournament_detail", args=(kwargs['pk'],)) + + class TournamentHarmonizeView(VolunteerMixin, DetailView): """ Harmonize the notes of a tournament. @@ -779,7 +818,7 @@ class TournamentHarmonizeView(VolunteerMixin, DetailView): return self.handle_no_permission() tournament = self.get_object() reg = request.user.registration - if not reg.is_admin and (not reg.is_volunteer or tournament not in reg.organized_tournaments.all()): + if not reg.is_volunteer or reg not in tournament.organizers_and_presidents.all(): return self.handle_no_permission() if self.kwargs['round'] not in range(1, settings.NB_ROUNDS + 1): raise Http404 @@ -812,7 +851,7 @@ class TournamentHarmonizeNoteView(VolunteerMixin, DetailView): return self.handle_no_permission() tournament = self.get_object() reg = request.user.registration - if not reg.is_admin and (not reg.is_volunteer or tournament not in reg.organized_tournaments.all()): + if not reg.is_volunteer or reg not in tournament.organizers_and_presidents.all(): return self.handle_no_permission() if self.kwargs['round'] not in range(1, settings.NB_ROUNDS + 1) \ or self.kwargs['action'] not in ('add', 'remove') \ @@ -852,7 +891,7 @@ class SelectTeamFinalView(VolunteerMixin, DetailView): return self.handle_no_permission() tournament = self.get_object() reg = request.user.registration - if not reg.is_admin and (not reg.is_volunteer or tournament not in reg.organized_tournaments.all()): + if not reg.is_volunteer or reg not in tournament.organizers_and_presidents.all(): return self.handle_no_permission() participation_qs = tournament.participations.filter(pk=self.kwargs["participation_id"]) if not participation_qs.exists(): @@ -1003,17 +1042,14 @@ class SolutionsDownloadView(VolunteerMixin, View): return super().dispatch(request, *args, **kwargs) elif 'tournament_id' in kwargs: tournament = Tournament.objects.get(pk=kwargs["tournament_id"]) - if reg.is_volunteer \ - and (tournament in reg.organized_tournaments.all() - or reg.pools_presided.filter(tournament=tournament).exists()): + if reg.is_volunteer and reg in tournament.organizers_and_presidents.all(): return super().dispatch(request, *args, **kwargs) else: pool = Pool.objects.get(pk=kwargs["pool_id"]) tournament = pool.tournament if reg.is_volunteer \ - and (reg in tournament.organizers.all() - or reg in pool.juries.all() - or reg.pools_presided.filter(tournament=tournament).exists()): + and (reg in tournament.organizers_and_presidents.all() + or reg in pool.juries.all()): return super().dispatch(request, *args, **kwargs) return self.handle_no_permission() @@ -2001,7 +2037,7 @@ class PassageDetailView(LoginRequiredMixin, DetailView): reg = request.user.registration passage = self.get_object() if reg.is_admin or reg.is_volunteer \ - and (self.get_object().pool.tournament in reg.organized_tournaments.all() + and (reg in self.get_object().pool.tournament.organizers_and_presidents.all() or reg in passage.pool.juries.all() or reg.pools_presided.filter(tournament=passage.pool.tournament).exists()) \ or reg.participates and reg.team \ diff --git a/tfjm/templates/sidebar.html b/tfjm/templates/sidebar.html index c58ab7d..bbb3fec 100644 --- a/tfjm/templates/sidebar.html +++ b/tfjm/templates/sidebar.html @@ -23,7 +23,7 @@