diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 75aee92..75fe4d8 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -2,15 +2,6 @@ stages:
- test
- quality-assurance
-py311:
- stage: test
- image: python:3.11-alpine
- before_script:
- - apk add --no-cache libmagic
- - apk add --no-cache gettext
- - pip install tox --no-cache-dir
- script: tox -e py311
-
py312:
stage: test
image: python:3.12-alpine
diff --git a/locale/fr/LC_MESSAGES/django.po b/locale/fr/LC_MESSAGES/django.po
index e4f83f3..25d74ed 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: 2024-10-28 20:14+0100\n"
+"POT-Creation-Date: 2025-01-14 19:29+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Emmy D'Anello \n"
"Language-Team: LANGUAGE \n"
@@ -78,8 +78,8 @@ 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:783
-#: participation/models.py:807 participation/models.py:1131
+#: participation/admin.py:176 participation/models.py:788
+#: participation/models.py:812 participation/models.py:1136
#: registration/models.py:763
#: registration/templates/registration/payment_form.html:53
msgid "tournament"
@@ -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:1666 participation/models.py:1675
+#: participation/models.py:1671 participation/models.py:1680
#: participation/tables.py:84
msgid "pool"
msgstr "poule"
@@ -109,7 +109,7 @@ msgstr ""
#: chat/models.py:84 draw/templates/draw/tournament_content.html:277
#: participation/admin.py:172 participation/models.py:261
-#: participation/models.py:798
+#: participation/models.py:803
#: participation/templates/participation/tournament_harmonize.html:15
#: registration/models.py:158 registration/models.py:754
#: registration/tables.py:39
@@ -265,7 +265,7 @@ msgid "teams"
msgstr "équipes"
#: draw/admin.py:92 draw/models.py:245 draw/models.py:465
-#: participation/models.py:1135
+#: participation/models.py:1140
msgid "round"
msgstr "tour"
@@ -644,7 +644,7 @@ msgstr "Le numéro du tour doit être entre 1 et {nb}."
msgid "rounds"
msgstr "tours"
-#: draw/models.py:268 participation/models.py:1143
+#: draw/models.py:268 participation/models.py:1148
msgid "letter"
msgstr "lettre"
@@ -682,12 +682,12 @@ msgstr "L'instance complète de la poule."
msgid "Pool {letter}{number}"
msgstr "Poule {letter}{number}"
-#: draw/models.py:447 participation/models.py:1667
+#: draw/models.py:447 participation/models.py:1672
msgid "pools"
msgstr "poules"
-#: draw/models.py:459 participation/models.py:1121 participation/models.py:1886
-#: participation/models.py:1920 participation/models.py:1962
+#: draw/models.py:459 participation/models.py:1126 participation/models.py:1891
+#: participation/models.py:1925 participation/models.py:1967
msgid "participation"
msgstr "participation"
@@ -711,8 +711,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:1252
-#: participation/models.py:1689 participation/models.py:1927
+#: draw/models.py:496 draw/models.py:519 participation/models.py:1257
+#: participation/models.py:1694 participation/models.py:1932
#: participation/views.py:1492 participation/views.py:1757
#, python-brace-format
msgid "Problem #{problem}"
@@ -985,31 +985,31 @@ msgstr "Changelog de type \"{action}\" pour le modèle {model} le {timestamp}"
msgid "valid"
msgstr "valide"
-#: participation/admin.py:87 participation/models.py:819
+#: 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:1696 participation/tables.py:114
+#: participation/models.py:1701 participation/tables.py:114
msgid "reporter"
msgstr "défenseur⋅se"
-#: participation/admin.py:128 participation/models.py:1703
-#: participation/models.py:1974
+#: participation/admin.py:128 participation/models.py:1708
+#: participation/models.py:1979
msgid "opponent"
msgstr "opposant⋅e"
-#: participation/admin.py:132 participation/models.py:1710
-#: participation/models.py:1975
+#: participation/admin.py:132 participation/models.py:1715
+#: participation/models.py:1980
msgid "reviewer"
msgstr "rapporteur⋅rice"
-#: participation/admin.py:136 participation/models.py:1717
-#: participation/models.py:1976
+#: participation/admin.py:136 participation/models.py:1722
+#: participation/models.py:1981
msgid "observer"
msgstr "observateur⋅rice"
-#: participation/admin.py:192 participation/models.py:1925
+#: participation/admin.py:192 participation/models.py:1930
msgid "problem"
msgstr "numéro de problème"
@@ -1033,7 +1033,25 @@ msgstr "Aucune équipe n'a été trouvée avec ce code d'accès."
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:94 participation/forms.py:367
+#: participation/forms.py:85
+msgid "IMPORTANT"
+msgstr "IMPORTANT"
+
+#: participation/forms.py:86
+msgid ""
+"For the tournaments in the region \"Île-de-France\": registration is\n"
+"unified for each tournament. By choosing a tournament \"Île-de-France\",\n"
+"you're accepting that your team may be selected for one of these "
+"tournaments.\n"
+"In case of date conflict, please write them in your motivation letter."
+msgstr ""
+"Pour les tournois franciliens : l'inscription est unifiée pour chacun des "
+"tournois. En choisissant un tournoi « Île-de-France », vous acceptez que "
+"votre équipe puisse être sélectionnée pour l'un des tournois concernés. En "
+"cas de contraintes de date, merci de les indiquer dans votre lettre de "
+"motivation."
+
+#: participation/forms.py:115 participation/forms.py:388
#: registration/forms.py:141 registration/forms.py:163
#: registration/forms.py:185 registration/forms.py:207
#: registration/forms.py:229 registration/forms.py:251
@@ -1041,7 +1059,7 @@ msgstr "La validation de l'équipe est déjà faite ou en cours."
msgid "The uploaded file size must be under 2 Mo."
msgstr "Le fichier envoyé doit peser moins de 2 Mo."
-#: participation/forms.py:96 registration/forms.py:143
+#: participation/forms.py:117 registration/forms.py:143
#: registration/forms.py:165 registration/forms.py:187
#: registration/forms.py:209 registration/forms.py:231
#: registration/forms.py:253 registration/forms.py:312
@@ -1049,39 +1067,39 @@ msgstr "Le fichier envoyé doit peser moins de 2 Mo."
msgid "The uploaded file must be a PDF, PNG of JPEG file."
msgstr "Le fichier envoyé doit être au format PDF, PNG ou JPEG."
-#: participation/forms.py:114
+#: participation/forms.py:135
msgid "I engage myself to participate to the whole tournament."
msgstr "Je m'engage à participer à l'intégralité du tournoi."
-#: participation/forms.py:129
+#: participation/forms.py:150
msgid "Message to address to the team:"
msgstr "Message à adresser à l'équipe :"
-#: participation/forms.py:176
+#: participation/forms.py:197
msgid "The uploaded file size must be under 5 Mo."
msgstr "Le fichier envoyé doit peser moins de 5 Mo."
-#: participation/forms.py:178 participation/forms.py:369
+#: participation/forms.py:199 participation/forms.py:390
msgid "The uploaded file must be a PDF file."
msgstr "Le fichier envoyé doit être au format PDF."
-#: participation/forms.py:182
+#: participation/forms.py:203
msgid "The PDF file must not have more than 30 pages."
msgstr "Le fichier PDF ne doit pas avoir plus de 30 pages."
-#: participation/forms.py:236
+#: participation/forms.py:257
msgid "Add"
msgstr "Ajouter"
-#: participation/forms.py:251
+#: participation/forms.py:272
msgid "This user already exists, but is a participant."
msgstr "Cet⋅te utilisateur⋅rice existe déjà, mais en tant que participant⋅e."
-#: participation/forms.py:262
+#: participation/forms.py:283
msgid "Spreadsheet file:"
msgstr "Fichier tableur :"
-#: participation/forms.py:288
+#: participation/forms.py:309
msgid ""
"This file contains non-UTF-8 and non-ISO-8859-1 content. Please send your "
"sheet as a CSV file."
@@ -1089,24 +1107,24 @@ msgstr ""
"Ce fichier contient des éléments non-UTF-8 et non-ISO-8859-1. Merci "
"d'envoyer votre tableur au format CSV."
-#: participation/forms.py:328
+#: participation/forms.py:349
msgid "The following note is higher of the maximum expected value:"
msgstr "La note suivante est supérieure au maximum attendu :"
-#: participation/forms.py:334
+#: participation/forms.py:355
msgid "The following user was not found:"
msgstr "L'utilisateur⋅rice suivant n'a pas été trouvé :"
-#: participation/forms.py:350
+#: participation/forms.py:371
msgid "The reporter, the opponent and the reviewer must be different."
msgstr ""
"Les équipes défenseuse, opposante et rapportrice doivent être différent⋅es."
-#: participation/forms.py:354
+#: participation/forms.py:375
msgid "This reporter did not work on this problem."
msgstr "Ce⋅tte défenseur⋅se ne travaille pas sur ce problème."
-#: participation/forms.py:373
+#: participation/forms.py:394
msgid "The PDF file must not have more than 2 pages."
msgstr "Le fichier PDF ne doit pas avoir plus de 2 pages."
@@ -1274,189 +1292,204 @@ msgstr "début"
msgid "end"
msgstr "fin"
-#: participation/models.py:288
+#: participation/models.py:287
+msgid "unified registration"
+msgstr "inscription unifiée"
+
+#: participation/models.py:293
#: participation/templates/participation/tournament_detail.html:18
msgid "place"
msgstr "lieu"
-#: participation/models.py:292
+#: participation/models.py:297
msgid "max team count"
msgstr "nombre maximal d'équipes"
-#: participation/models.py:297
+#: participation/models.py:302
#: participation/templates/participation/tournament_detail.html:22
msgid "price"
msgstr "prix"
-#: participation/models.py:302
+#: participation/models.py:307
#: participation/templates/participation/tournament_detail.html:26
msgid "remote"
msgstr "à distance"
-#: participation/models.py:307
+#: participation/models.py:312
msgid "limit date for registrations"
msgstr "date limite d'inscription"
-#: participation/models.py:312
+#: participation/models.py:317
msgid "limit date to upload solutions"
msgstr "date limite pour envoyer les solutions"
-#: participation/models.py:317
+#: participation/models.py:322
msgid "random draw for solutions"
msgstr "tirage au sort des solutions"
-#: participation/models.py:322
+#: participation/models.py:327
msgid "first phase date"
msgstr "date du premier tour"
-#: participation/models.py:327
+#: 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:332
+#: participation/models.py:337
msgid "first second date"
msgstr "date du second tour"
-#: participation/models.py:337
+#: 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:342
+#: 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:347
+#: participation/models.py:352
msgid "third phase date"
msgstr "date du troisième tour"
-#: participation/models.py:352
+#: 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:357
+#: 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:362
+#: participation/models.py:367
#: participation/templates/participation/tournament_detail.html:52
msgid "description"
msgstr "description"
-#: participation/models.py:368
+#: participation/models.py:373
#: participation/templates/participation/tournament_detail.html:12
msgid "organizers"
msgstr "organisateur⋅rices"
-#: participation/models.py:373
+#: participation/models.py:378
#: participation/templates/participation/team_detail.html:167
msgid "final"
msgstr "finale"
-#: participation/models.py:381
+#: participation/models.py:386
msgid "Google Sheet ID"
msgstr "ID de la feuille Google Sheets"
-#: participation/models.py:461
+#: participation/models.py:466 participation/views.py:1811
msgid "Notation sheet"
msgstr "Feuille de notation"
-#: participation/models.py:473 participation/models.py:474
-#: participation/models.py:476 participation/models.py:716
+#: 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:481 participation/models.py:553
-#: participation/models.py:1327 participation/views.py:1731
+#: participation/models.py:486 participation/models.py:558
+#: participation/models.py:1332 participation/views.py:1731
msgid "Team"
msgstr "Équipe"
-#: participation/models.py:481
+#: participation/models.py:486
msgid "Scores day 1"
msgstr "Scores jour 1"
-#: participation/models.py:481
+#: participation/models.py:486
msgid "Tweaks day 1"
msgstr "Ajustements 1"
-#: participation/models.py:482
+#: participation/models.py:487
msgid "Scores day 2"
msgstr "Scores jour 2"
-#: participation/models.py:482
+#: participation/models.py:487
msgid "Tweaks day 2"
msgstr "Ajustements 2"
-#: participation/models.py:483
+#: participation/models.py:488
msgid "Total D1 + D2"
msgstr "Total J1 + J2"
-#: participation/models.py:483
+#: participation/models.py:488
msgid "Scores day 3"
msgstr "Scores jour 3"
-#: participation/models.py:483
+#: participation/models.py:488
msgid "Tweaks day 3"
msgstr "Ajustements 3"
-#: participation/models.py:485 participation/models.py:1327
+#: participation/models.py:490 participation/models.py:1332
#: participation/views.py:1738
msgid "Total"
msgstr "Total"
-#: participation/models.py:485 participation/models.py:553
-#: participation/models.py:1327
+#: participation/models.py:490 participation/models.py:558
+#: participation/models.py:1332
#: participation/templates/participation/tournament_harmonize.html:14
#: participation/views.py:1741
msgid "Rank"
msgstr "Rang"
-#: participation/models.py:553 participation/models.py:718
+#: participation/models.py:507 participation/models.py:521
+#: participation/models.py:538 participation/models.py:1248
+#: participation/models.py:1249 participation/models.py:1252
+#: participation/models.py:1355 participation/models.py:1357
+#: participation/models.py:1359 participation/models.py:1366
+#: participation/models.py:1370 participation/models.py:1615
+#: participation/models.py:1637 participation/models.py:2101
+#: participation/views.py:1812
+msgid "Pool"
+msgstr "Poule"
+
+#: participation/models.py:558 participation/models.py:723
msgid "Score"
msgstr "Score"
-#: participation/models.py:553
+#: participation/models.py:558
msgid "Mention"
msgstr "Mention"
-#: participation/models.py:698 participation/models.py:1596
+#: participation/models.py:703 participation/models.py:1601
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:784 registration/admin.py:125
+#: participation/models.py:789 registration/admin.py:125
msgid "tournaments"
msgstr "tournois"
-#: participation/models.py:813
+#: participation/models.py:818
msgid "valid team"
msgstr "équipe valide"
-#: participation/models.py:814
+#: 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:820
+#: 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:824
+#: participation/models.py:829
msgid "mention"
msgstr "mention"
-#: participation/models.py:831
+#: participation/models.py:836
msgid "mention (final)"
msgstr "Mention (pour la finale) :"
-#: participation/models.py:841
+#: participation/models.py:846
#, python-brace-format
msgid "Participation of the team {name} ({trigram})"
msgstr "Participation de l'équipe {name} ({trigram})"
-#: participation/models.py:848
+#: participation/models.py:853
#, python-brace-format
msgid ""
"The team {trigram} has {nb_missing_payments} missing payments. Each "
@@ -1469,11 +1502,11 @@ msgstr ""
"notification de bourse) pour participer au tournoi.
Les participant⋅es "
"qui n'ont pas encore payé sont : {participants}.
"
-#: participation/models.py:856
+#: participation/models.py:861
msgid "Missing payments"
msgstr "Paiements manquants"
-#: participation/models.py:873
+#: participation/models.py:878
msgid ""
"The solutions for the tournament of {tournament} are due on the {date:%Y-"
"%m-%d %H:%M}.
You have currently sent {nb_solutions} "
@@ -1488,11 +1521,11 @@ msgstr ""
"pouvez envoyer vos solutions sur votre page de "
"participation.
"
-#: participation/models.py:883 participation/models.py:897
+#: participation/models.py:888 participation/models.py:902
msgid "Solutions due"
msgstr "Rendu des solutions"
-#: participation/models.py:889
+#: participation/models.py:894
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 "
@@ -1505,7 +1538,7 @@ msgstr ""
"parties.
Vous pouvez envoyer vos solutions sur votre "
"page de participation.
"
-#: participation/models.py:903 registration/models.py:607
+#: participation/models.py:908 registration/models.py:607
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."
@@ -1515,11 +1548,11 @@ msgstr ""
"{date:%d/%m/%Y %H:%M}. Vous pouvez y participer sur ce lien"
"a>.
"
-#: participation/models.py:909 registration/models.py:614
+#: participation/models.py:914 registration/models.py:614
msgid "Draw of solutions"
msgstr "Tirage au sort des solutions"
-#: participation/models.py:921
+#: participation/models.py:926
#, python-brace-format
msgid ""
"The solutions draw is ended. You can check the result on votre solution du problème "
"{problem}.
"
-#: participation/models.py:930 participation/models.py:993
-#: participation/models.py:1057
+#: participation/models.py:935 participation/models.py:998
+#: participation/models.py:1062
#, 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:939 participation/models.py:1002
-#: participation/models.py:1066
+#: participation/models.py:944 participation/models.py:1007
+#: participation/models.py:1071
#, 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:949 participation/models.py:1012
-#: participation/models.py:1076
+#: participation/models.py:954 participation/models.py:1017
+#: participation/models.py:1081
#, 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:969 participation/models.py:1032
-#: participation/models.py:1096
+#: participation/models.py:974 participation/models.py:1037
+#: participation/models.py:1101
#: participation/templates/participation/upload_written_review.html:9
msgid "Templates:"
msgstr "Modèles :"
-#: participation/models.py:974 registration/models.py:629
+#: participation/models.py:979 registration/models.py:629
msgid "First round"
msgstr "Premier tour"
-#: participation/models.py:986
+#: participation/models.py:991
#, python-brace-format
msgid ""
"For the second round, you will present your "
@@ -1586,12 +1619,12 @@ msgstr ""
"Pour le second tour, vous défendrez votre "
"solution du problème {problem}.
"
-#: participation/models.py:1037 participation/models.py:1101
+#: participation/models.py:1042 participation/models.py:1106
#: registration/models.py:640
msgid "Second round"
msgstr "Second tour"
-#: participation/models.py:1050
+#: participation/models.py:1055
#, python-brace-format
msgid ""
"For the third round, you will present your "
@@ -1600,7 +1633,7 @@ msgstr ""
"Pour le troisième tour, vous défendrez votre "
"solution du problème {problem}.
"
-#: participation/models.py:1107
+#: participation/models.py:1112
#, 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:1112
+#: participation/models.py:1117
msgid "Tournament ended"
msgstr "Tournoi terminé"
-#: participation/models.py:1122 participation/models.py:1165
+#: participation/models.py:1127 participation/models.py:1170
msgid "participations"
msgstr "participations"
-#: participation/models.py:1137 participation/models.py:1138
-#: participation/models.py:1139
+#: participation/models.py:1142 participation/models.py:1143
+#: participation/models.py:1144
#, python-brace-format
msgid "Round {round}"
msgstr "Tour {round}"
-#: participation/models.py:1153
+#: participation/models.py:1158
msgid "room"
msgstr "salle"
-#: participation/models.py:1155
+#: participation/models.py:1160
msgid "Room 1"
msgstr "Salle 1"
-#: participation/models.py:1156
+#: participation/models.py:1161
msgid "Room 2"
msgstr "Salle 2"
-#: participation/models.py:1159
+#: participation/models.py:1164
msgid "For 5-teams pools only"
msgstr "Pour les poules de 5 équipe uniquement"
-#: participation/models.py:1171
+#: participation/models.py:1176
msgid "juries"
msgstr "jurys"
-#: participation/models.py:1180
+#: participation/models.py:1185
msgid "president of the jury"
msgstr "président⋅e du jury"
-#: participation/models.py:1187
+#: participation/models.py:1192
msgid "BigBlueButton URL"
msgstr "Lien BigBlueButton"
-#: participation/models.py:1188
+#: participation/models.py:1193
msgid "The link of the BBB visio for this pool."
msgstr "Le lien du salon BBB pour cette poule."
-#: participation/models.py:1193
+#: participation/models.py:1198
msgid "results available"
msgstr "résultats disponibles"
-#: participation/models.py:1194
+#: participation/models.py:1199
msgid ""
"Check this case when results become accessible to teams. They stay "
"accessible to you. Only averages are given."
@@ -1668,91 +1701,95 @@ msgstr ""
"Ils restent toujours accessibles pour vous. Seules les moyennes sont "
"communiquées."
-#: participation/models.py:1226
+#: participation/models.py:1231
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:1253 participation/models.py:1327
+#: participation/models.py:1258 participation/models.py:1332
#: participation/views.py:1486 participation/views.py:1735
msgid "Problem"
msgstr "Problème"
-#: participation/models.py:1254 participation/views.py:1507
+#: participation/models.py:1259 participation/views.py:1507
msgid "Reporter"
msgstr "Défenseur⋅se"
-#: participation/models.py:1255 participation/views.py:1513
+#: participation/models.py:1260 participation/views.py:1513
msgid "Opponent"
msgstr "Opposant⋅e"
-#: participation/models.py:1256 participation/views.py:1520
+#: participation/models.py:1261 participation/views.py:1520
msgid "Reviewer"
msgstr "Rapporteur⋅rice"
-#: participation/models.py:1257 participation/views.py:1527
+#: participation/models.py:1262 participation/views.py:1527
msgid "Observer"
msgstr "Observateur⋅rice"
-#: participation/models.py:1258 participation/views.py:1501
+#: participation/models.py:1263 participation/views.py:1501
msgid "Role"
msgstr "Rôle"
-#: participation/models.py:1259 participation/models.py:1261
-#: participation/models.py:1262
+#: participation/models.py:1264 participation/models.py:1266
+#: participation/models.py:1267 participation/views.py:1543
+#: participation/views.py:1551 participation/views.py:1559
+#: participation/views.py:1569
msgid "Writing"
msgstr "Écrit"
-#: participation/models.py:1260 participation/models.py:1261
-#: participation/models.py:1262
+#: participation/models.py:1265 participation/models.py:1266
+#: participation/models.py:1267 participation/views.py:1547
+#: participation/views.py:1555 participation/views.py:1564
+#: participation/views.py:1573
msgid "Oral"
msgstr "Oral"
-#: participation/models.py:1263 participation/views.py:1535
+#: participation/models.py:1268 participation/views.py:1535
#: participation/views.py:1536
msgid "Juree"
msgstr "Juré⋅e"
-#: participation/models.py:1286 participation/models.py:1612
-#: participation/models.py:1634 participation/views.py:1605
+#: participation/models.py:1291 participation/models.py:1617
+#: participation/models.py:1639 participation/views.py:1605
msgid "Average"
msgstr "Moyenne"
-#: participation/models.py:1292 participation/views.py:1624
+#: participation/models.py:1297 participation/views.py:1624
msgid "Coefficient"
msgstr "Coefficien"
-#: participation/models.py:1293 participation/views.py:1667
+#: participation/models.py:1298 participation/views.py:1667
msgid "Subtotal"
msgstr "Sous-total"
-#: participation/models.py:1559
+#: participation/models.py:1564
#, 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:1647
+#: participation/models.py:1652
#, 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:1660
+#: participation/models.py:1665
#, 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:1680
+#: participation/models.py:1685
msgid "position"
msgstr "position"
-#: participation/models.py:1687
+#: participation/models.py:1692
msgid "reported solution"
msgstr "solution défendue"
-#: participation/models.py:1725
+#: participation/models.py:1730
msgid "penalties"
msgstr "pénalités"
-#: participation/models.py:1727
+#: participation/models.py:1732
msgid ""
"Number of penalties for the reporter. The reporter will loose a 0.5 "
"coefficient per penalty."
@@ -1760,128 +1797,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:1853 participation/models.py:1856
-#: participation/models.py:1859 participation/models.py:1862
+#: participation/models.py:1858 participation/models.py:1861
+#: participation/models.py:1864 participation/models.py:1867
#, 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:1867
+#: participation/models.py:1872
#, python-brace-format
msgid "Passage of {reporter} for problem {problem}"
msgstr "Passage de {reporter} pour le problème {problem}"
-#: participation/models.py:1871 participation/models.py:1880
-#: participation/models.py:1969 participation/models.py:2012
+#: participation/models.py:1876 participation/models.py:1885
+#: participation/models.py:1974 participation/models.py:2017
msgid "passage"
msgstr "passage"
-#: participation/models.py:1872
+#: participation/models.py:1877
msgid "passages"
msgstr "passages"
-#: participation/models.py:1891
+#: participation/models.py:1896
msgid "difference"
msgstr "différence"
-#: participation/models.py:1892
+#: participation/models.py:1897
msgid "Score to add/remove on the final score"
msgstr "Score à ajouter/retrancher au score final"
-#: participation/models.py:1899
+#: participation/models.py:1904
msgid "tweak"
msgstr "harmonisation"
-#: participation/models.py:1900
+#: participation/models.py:1905
msgid "tweaks"
msgstr "harmonisations"
-#: participation/models.py:1932
+#: participation/models.py:1937
msgid "solution for the final tournament"
msgstr "solution pour la finale"
-#: participation/models.py:1937 participation/models.py:1981
+#: participation/models.py:1942 participation/models.py:1986
msgid "file"
msgstr "fichier"
-#: participation/models.py:1947
+#: participation/models.py:1952
#, 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:1949
+#: participation/models.py:1954
msgid "for final"
msgstr "pour la finale"
-#: participation/models.py:1952
+#: participation/models.py:1957
msgid "solution"
msgstr "solution"
-#: participation/models.py:1953
+#: participation/models.py:1958
msgid "solutions"
msgstr "solutions"
-#: participation/models.py:1987
+#: participation/models.py:1992
#, 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:1995
+#: participation/models.py:2000
msgid "written review"
msgstr "note de synthèse"
-#: participation/models.py:1996
+#: participation/models.py:2001
msgid "written reviews"
msgstr "notes de synthèse"
-#: participation/models.py:2005
+#: participation/models.py:2010
msgid "jury"
msgstr "jury"
-#: participation/models.py:2017
+#: participation/models.py:2022
msgid "reporter writing note"
msgstr "note d'écrit défenseur⋅se"
-#: participation/models.py:2023
+#: participation/models.py:2028
msgid "reporter oral note"
msgstr "note d'oral défenseur⋅se"
-#: participation/models.py:2029
+#: participation/models.py:2034
msgid "opponent writing note"
msgstr "note d'écrit opposant⋅e"
-#: participation/models.py:2035
+#: participation/models.py:2040
msgid "opponent oral note"
msgstr "note d'oral opposant⋅e"
-#: participation/models.py:2041
+#: participation/models.py:2046
msgid "reviewer writing note"
msgstr "note d'écrit rapporteur⋅rice"
-#: participation/models.py:2047
+#: participation/models.py:2052
msgid "reviewer oral note"
msgstr "note d'oral du rapporteur⋅rice"
-#: participation/models.py:2053
+#: participation/models.py:2058
msgid "observer writing note"
msgstr "note d'écrit de l'observateur⋅rice"
-#: participation/models.py:2059
+#: participation/models.py:2064
msgid "observer oral note"
msgstr "note d'oral de l'observateur⋅rice"
-#: participation/models.py:2124
+#: participation/models.py:2129
#, python-brace-format
msgid "Notes of {jury} for {passage}"
msgstr "Notes de {jury} pour le {passage}"
-#: participation/models.py:2127
+#: participation/models.py:2132
msgid "note"
msgstr "note"
-#: participation/models.py:2128
+#: participation/models.py:2133
msgid "notes"
msgstr "notes"
@@ -1919,7 +1956,7 @@ msgstr "Poule {code}"
msgid "No defined team"
msgstr "Pas d'équipe définie"
-#: participation/tables.py:147
+#: participation/tables.py:147 participation/tables.py:155
#: participation/templates/participation/note_form.html:14
#: participation/templates/participation/passage_detail.html:15
#: participation/templates/participation/passage_detail.html:176
@@ -1930,7 +1967,7 @@ msgstr "Pas d'équipe définie"
#: participation/templates/participation/team_detail.html:251
#: participation/templates/participation/tournament_form.html:12
#: participation/templates/participation/update_team.html:12
-#: registration/tables.py:46
+#: registration/tables.py:46 registration/tables.py:57
#: registration/templates/registration/payment_form.html:210
#: registration/templates/registration/update_user.html:16
#: registration/templates/registration/user_detail.html:220
@@ -2697,6 +2734,10 @@ msgstr ""
"d'adresse e-mail, soit une autorisation, soit des personnes, soit la lettre "
"de motivation, soit le tournoi n'a pas été choisi."
+#: participation/views.py:234
+msgid "Team validation"
+msgstr "Validation d'équipe"
+
#: participation/views.py:246
msgid "You are not an organizer of the tournament."
msgstr "Vous n'êtes pas un⋅e organisateur⋅rice du tournoi."
@@ -2705,6 +2746,14 @@ msgstr "Vous n'êtes pas un⋅e organisateur⋅rice du tournoi."
msgid "This team has no pending validation."
msgstr "L'équipe n'a pas de validation en attente."
+#: participation/views.py:269
+msgid "Team validated"
+msgstr "Équipe validée"
+
+#: participation/views.py:278
+msgid "Team not validated"
+msgstr "Équipe non validée"
+
#: participation/views.py:281
msgid "You must specify if you validate the registration or not."
msgstr "Vous devez spécifier si vous validez l'inscription ou non."
@@ -2915,26 +2964,18 @@ msgid "This email address is already used."
msgstr "Cette adresse e-mail est déjà utilisée."
#: registration/forms.py:45
-#, fuzzy
-#| msgid ""
-#| "Registrations for the tournament of {tournament} are ending on the {date:"
-#| "%Y-%m-%d %H:%M}."
msgid ""
"Registrations are not opened yet. They will open on the {opening_date:%Y-%m-"
"%d %H:%M}."
msgstr ""
-"Les inscriptions pour le tournoi de {tournament} se terminent le {date:%d/%m/"
-"%Y %H:%M}."
+"Les inscriptions ne sont pas ouvertes pour l'instant. Elles ouvriront le "
+"{opening_date:%d/%m/%Y %H:%M}."
#: registration/forms.py:49
-#, fuzzy
-#| msgid ""
-#| "Registrations for the tournament of {tournament} are ending on the {date:"
-#| "%Y-%m-%d %H:%M}."
msgid ""
-"Registrations for this year are closed since {opening_date:%Y-%m-%d %H:%M}."
+"Registrations for this year are closed since {closing_date:%Y-%m-%d %H:%M}."
msgstr ""
-"Les inscriptions pour le tournoi de {tournament} se terminent le {date:%d/%m/"
+"Les inscriptions pour cette année sont closes depuis le {closing_date:%d/%m/"
"%Y %H:%M}."
#: registration/forms.py:301
@@ -2962,8 +3003,8 @@ msgstr "Activez votre compte"
#, python-brace-format
msgid ""
"Your email address is not validated. Please click on the link you received "
-"by email. You can resend a mail by clicking on this link."
+"by email. You can resend a mail by clicking on this link."
msgstr ""
"Votre adresse mail n'est pas validée. Merci de cliquer sur le lien que vous "
"avez reçu par mail. Vous pouvez renvoyer un mail en cliquant sur team page."
+"{tournament}. You can check the status of the team on the team page."
msgstr ""
"L'équipe {trigram} a demandé à être validée pour le tournoi {tournament}. "
"Vous pouvez vérifier le statut de l'équipe sur la page de "
@@ -3499,8 +3540,6 @@ msgstr ""
#: registration/templates/registration/mails/add_organizer.txt:14
#: registration/templates/registration/mails/email_validation_email.html:39
#: registration/templates/registration/mails/email_validation_email.txt:15
-#: registration/templates/registration/mails/payment_confirmation.html:41
-#: registration/templates/registration/mails/payment_reminder.html:52
msgid "The ETEAM team."
msgstr "L'équipe de l'ETEAM"
@@ -3546,10 +3585,10 @@ msgstr "Merci"
#, python-format
msgid ""
"We successfully received the payment of %(amount)s € for your participation "
-"for the ETEAM in the team %(team)s!"
+"for the TFJM² in the team %(team)s for the tournament %(tournament)s!"
msgstr ""
-"Nous avons bien reçu le paiement de %(amount)s € pour la participation à "
-"l'ETEAM dans l'équipe %(team)s !"
+"Nous avons bien reçu le paiement de %(amount)s € pour votre participation au "
+"TFJM² dans l'équipe %(team)s pour le tournoi %(tournament)s !"
#: registration/templates/registration/mails/payment_confirmation.html:22
#: registration/templates/registration/mails/payment_confirmation.txt:8
@@ -3590,6 +3629,15 @@ msgstr "Dates du tournoi :"
#: registration/templates/registration/mails/payment_confirmation.html:36
#: registration/templates/registration/mails/payment_confirmation.txt:16
msgid ""
+"Please note that these dates may be subject to change. If your local "
+"organizers gave you different dates, trust them."
+msgstr ""
+"Merci de noter que ces dates peuvent évoluer. Si vos organisateur⋅rices "
+"régionaux⋅les vous ont donné des dates différentes, croyez-les."
+
+#: registration/templates/registration/mails/payment_confirmation.html:40
+#: registration/templates/registration/mails/payment_confirmation.txt:18
+msgid ""
"NB: This mail don't represent a payment receipt. The payer should receive a "
"mail from Hello Asso. If it is not the case, please contact us if necessary"
msgstr ""
@@ -3597,20 +3645,26 @@ msgstr ""
"a payé devrait recevoir un mail de Hello Asso. Si ce n'est pas le cas, merci "
"de nous contacter si nécessaire."
-#: registration/templates/registration/mails/payment_confirmation.txt:19
-msgid "The ETEAM team"
-msgstr "L'équipe de l'ETEAM"
+#: registration/templates/registration/mails/payment_confirmation.html:45
+#: registration/templates/registration/mails/payment_reminder.html:52
+msgid "The TFJM² team."
+msgstr "L'équipe du TFJM²"
+
+#: registration/templates/registration/mails/payment_confirmation.txt:21
+msgid "The TFJM² team"
+msgstr "L'équipe du TFJM²"
#: registration/templates/registration/mails/payment_reminder.html:16
#: registration/templates/registration/mails/payment_reminder.txt:4
#, python-format
msgid ""
-"You are registered for the ETEAM. Your team %(team)s has been successfully "
-"validated. To end your inscription, you must pay the amount of %(amount)s €."
+"You are registered for the TFJM² of %(tournament)s. Your team %(team)s has "
+"been successfully validated. To end your inscription, you must pay the "
+"amount of %(amount)s €."
msgstr ""
-"Vous êtes inscrit⋅e pour l'ETEAM. Votre équipe %(team)s a été validée avec "
-"succès. Pour finaliser votre inscription, vous devez payer le montant de "
-"%(amount)s €."
+"Vous êtes inscrit⋅e pour le tournoi de %(tournament)s du TFJM². Votre équipe "
+"%(team)s a été validée avec succès. Pour finaliser votre inscription, vous "
+"devez payer le montant de %(amount)s €."
#: registration/templates/registration/mails/payment_reminder.html:24
#: registration/templates/registration/mails/payment_reminder.txt:9
@@ -3931,38 +3985,40 @@ msgstr ""
"Votre paiement est en attente de validation par les organisateur⋅rices."
#: registration/templates/registration/signup.html:5
-#: registration/templates/registration/signup.html:12
-#: registration/templates/registration/signup.html:39 registration/views.py:48
+#: registration/templates/registration/signup.html:37 registration/views.py:48
msgid "Sign up"
msgstr "Inscription"
-#: registration/templates/registration/signup.html:17
+#: registration/templates/registration/signup.html:15
msgid ""
"Thank you for your great interest, but registrations are not opened yet!"
msgstr ""
-"Merci pour votre grand intérêt, mais les inscriptions ne sont pas encore ouvertes !"
+"Merci pour votre grand intérêt, mais les inscriptions ne sont pas encore "
+"ouvertes !"
-#: registration/templates/registration/signup.html:18
+#: registration/templates/registration/signup.html:16
msgid "They will open on:"
msgstr "Elles ouvriront le :"
-#: registration/templates/registration/signup.html:19
+#: registration/templates/registration/signup.html:17
msgid "Please come back at this time to register!"
msgstr "Merci de revenir à ce moment-là pour vous inscrire !"
-#: registration/templates/registration/signup.html:23
+#: registration/templates/registration/signup.html:21
msgid "Registrations are closed for this year. We hope to see you next year!"
-msgstr "Les inscriptions sont closes pour cette année. Nous espérons vous revoir l'année prochaine !"
+msgstr ""
+"Les inscriptions sont closes pour cette année. Nous espérons vous revoir "
+"l'année prochaine !"
-#: registration/templates/registration/signup.html:24
+#: registration/templates/registration/signup.html:22
msgid "If needed, you can contact us by mail."
msgstr "Si nécessaire, vous pouvez nous contacter par mail."
-#: registration/templates/registration/signup.html:34
+#: registration/templates/registration/signup.html:32
msgid "By registering, you certify that you have read and accepted our"
msgstr "En vous inscrivant, vous certifiez avoir lu et accepté notre"
-#: registration/templates/registration/signup.html:35
+#: registration/templates/registration/signup.html:33
msgid "privacy policy"
msgstr "politique de confidentialité"
@@ -4420,7 +4476,7 @@ msgstr "Inscris-toi maintenant !"
msgid "I already have an account"
msgstr "J'ai déjà un compte"
-#: tfjm/templates/index_eteam.html:34 tfjm/templates/index_tfjm.html:34
+#: tfjm/templates/index_eteam.html:34 tfjm/templates/index_tfjm.html:43
msgid "How does it work?"
msgstr "Comment ça marche ?"
@@ -4459,7 +4515,7 @@ msgstr ""
"valider votre équipe pour pouvoir travailler sur les problèmes de votre "
"choix."
-#: tfjm/templates/index_eteam.html:55 tfjm/templates/index_tfjm.html:64
+#: tfjm/templates/index_eteam.html:55 tfjm/templates/index_tfjm.html:73
msgid "I have a question"
msgstr "J'ai une question"
@@ -4467,16 +4523,16 @@ msgstr "J'ai une question"
msgid ""
"Do not hesitate to consult the documentation of the site, to check if the answer is "
-"not already there. Also refer of course to the ETEAM rules. For any other question, do "
-"not hesitate to contact us by email at the address eteam_moc@proton.me ."
+"not already there. Also refer of course to the ETEAM rules. For any other "
+"question, do not hesitate to contact us by email at the address eteam_moc@proton.me ."
msgstr ""
"N'hésitez pas à consulter la documentation du site, pour vérifier si la réponse n'y "
-"est pas déjà. Référez-vous également bien sûr au règlement de l'ETEAM. Pour toute "
-"autre question, n'hésitez pas à nous contacter par mail à l'adresse règlement de l'ETEAM. Pour "
+"toute autre question, n'hésitez pas à nous contacter par mail à l'adresse eteam_moc@proton.me ."
#: tfjm/templates/index_tfjm.html:20
@@ -4487,7 +4543,25 @@ msgstr " Tu souhaites participer au 𝕋𝔽𝕁𝕄² ?"
msgid "Your team is already complete?"
msgstr "Ton équipe est déjà formée ?"
-#: tfjm/templates/index_tfjm.html:37
+#: tfjm/templates/index_tfjm.html:34
+msgid "New in 2025"
+msgstr "Nouveautés 2025"
+
+#: tfjm/templates/index_tfjm.html:35
+msgid ""
+"Registration for Ile-de-France tournaments is now unified. If you live in or "
+"near the Ile-de-France region, your registration will be pooled with each of "
+"the region's tournaments, and the organizers will take care of team "
+"allocation. However, date constraints can be indicated in the motivation "
+"letter."
+msgstr ""
+"L'inscription dans les tournois franciliens est désormais unifiée. Si vous "
+"résidez en Île-de-France ou proche, votre inscription sera mise en commun "
+"avec chacun des tournois de la région, et les organisateur⋅rices s'occuperont "
+"de la répartition des équipes. Les contraintes de date peuvent toutefois "
+"être indiquées dans la lettre de motivation."
+
+#: tfjm/templates/index_tfjm.html:46
#, python-format
msgid ""
"To participate to the 𝕋𝔽𝕁𝕄², you just need to create an account on the "
@@ -4498,7 +4572,7 @@ msgstr ""
"page d'inscription. Vous "
"devrez ensuite confirmer votre adresse mail."
-#: tfjm/templates/index_tfjm.html:45
+#: tfjm/templates/index_tfjm.html:54
#, python-format
msgid ""
"You can access your account via the Login"
@@ -4520,45 +4594,46 @@ msgstr ""
"valider votre équipe pour pouvoir travailler sur les problèmes de votre "
"choix."
-#: tfjm/templates/index_tfjm.html:54
+#: tfjm/templates/index_tfjm.html:63
msgid "I can't find a team, help me!"
msgstr "Je ne trouve pas d'équipe, aidez-moi !"
-#: tfjm/templates/index_tfjm.html:58
-msgid ""
-"You can contact us at the address contact@tfjm.org so that we can help you get in touch with other "
-"participants who are also looking for a team."
-msgstr ""
-"Vous pouvez nous contacter à l'adresse contact@tfjm.org pour que nous puissions vous mettre en relation "
-"avec d'autres participant⋅es qui cherchent également une équipe."
-
#: tfjm/templates/index_tfjm.html:67
msgid ""
+"You can contact us at the address contact@tfjm.org so that we can help "
+"you get in touch with other participants who are also looking for a team."
+msgstr ""
+"Vous pouvez nous contacter à l'adresse contact@tfjm.org pour que nous "
+"puissions vous mettre en relation avec d'autres participant⋅es qui cherchent "
+"également une équipe."
+
+#: tfjm/templates/index_tfjm.html:76
+msgid ""
"Do not hesitate to consult the documentation of the site, to check if the answer is "
"not already there. Also refer of course to the 𝕋𝔽𝕁𝕄² rules. For any other question, do "
-"not hesitate to contact us by email at the address contact@tf"
-"jm.org ."
+"not hesitate to contact us by email at the address "
+"contact@tfjm.org "
+"."
msgstr ""
"N'hésitez pas à consulter la documentation du site, pour vérifier si la réponse n'y "
"est pas déjà. Référez-vous également bien sûr au règlement du 𝕋𝔽𝕁𝕄². Pour toute autre "
"question, n'hésitez pas à nous contacter par mail à l'adresse contact@"
-"tfjm.org ."
+"href=\"mailto:contact@tfjm.org\"> "
+"contact@tfjm.org "
+"
."
-#: tfjm/templates/index_tfjm.html:79
+#: tfjm/templates/index_tfjm.html:88
msgid "Save the dates!"
msgstr "Attention aux dates !"
-#: tfjm/templates/index_tfjm.html:80
+#: tfjm/templates/index_tfjm.html:89
msgid ""
"If you don't end your registration by the indicated deadline, you will "
"unfortunately not be able to participate in the 𝕋𝔽𝕁𝕄²."
diff --git a/participation/forms.py b/participation/forms.py
index 04795d4..75c60a3 100644
--- a/participation/forms.py
+++ b/participation/forms.py
@@ -5,7 +5,7 @@ from io import StringIO
import re
from crispy_forms.helper import FormHelper
-from crispy_forms.layout import Div, Field, Submit
+from crispy_forms.layout import Div, Field, HTML, Layout, Submit
from django import forms
from django.contrib.auth.models import User
from django.core.exceptions import ValidationError
@@ -77,9 +77,30 @@ class ParticipationForm(forms.ModelForm):
"""
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
- if settings.TFJM_APP == "ETEAM":
- # One single tournament only
+ if settings.SINGLE_TOURNAMENT:
del self.fields['tournament']
+ self.helper = FormHelper()
+ idf_warning_banner = f"""
+
+
{_("IMPORTANT")}
+{_("""For the tournaments in the region "Île-de-France": registration is
+unified for each tournament. By choosing a tournament "Île-de-France",
+you're accepting that your team may be selected for one of these tournaments.
+In case of date conflict, please write them in your motivation letter.""")}
+
+"""
+ unified_registration_tournament_ids = ",".join(
+ str(tournament.id) for tournament in Tournament.objects.filter(
+ unified_registration=True).all())
+ self.helper.layout = Layout(
+ 'tournament',
+ Div(
+ HTML(idf_warning_banner),
+ css_id="idf_warning_banner",
+ data_tid_unified=unified_registration_tournament_ids,
+ ),
+ 'final',
+ )
class Meta:
model = Participation
diff --git a/participation/migrations/0023_tournament_unified_registration.py b/participation/migrations/0023_tournament_unified_registration.py
new file mode 100644
index 0000000..73cfe67
--- /dev/null
+++ b/participation/migrations/0023_tournament_unified_registration.py
@@ -0,0 +1,21 @@
+# Generated by Django 5.1.5 on 2025-01-14 18:06
+
+import django.core.validators
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ("participation", "0022_alter_note_observer_oral"),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name="tournament",
+ name="unified_registration",
+ field=models.BooleanField(
+ default=False, verbose_name="unified registration"
+ ),
+ ),
+ ]
diff --git a/participation/models.py b/participation/models.py
index 8ee43b7..6b91063 100644
--- a/participation/models.py
+++ b/participation/models.py
@@ -283,6 +283,11 @@ class Tournament(models.Model):
default=date.today,
)
+ unified_registration = models.BooleanField(
+ verbose_name=_("unified registration"),
+ default=False,
+ )
+
place = models.CharField(
max_length=255,
verbose_name=_("place"),
diff --git a/participation/templates/participation/mails/request_validation.html b/participation/templates/participation/mails/request_validation.html
index 29b96d6..cbf75d1 100644
--- a/participation/templates/participation/mails/request_validation.html
+++ b/participation/templates/participation/mails/request_validation.html
@@ -2,28 +2,28 @@
- Validation request - ETEAM
+ Demande de validation - TFJM²
-Hi,
+Bonjour,
-The team "{{ team.name }}" ({{ team.trigram }}) has just asked to validate his team to take part
-in ETEAM.
-You can decide whether or not to accept the team by going to the team page:
+L'équipe « {{ team.name }} » ({{ team.trigram }}) vient de demander à valider son équipe pour participer
+au {{ team.participation.get_problem_display }} du TFJM².
+Vous pouvez décider d'accepter ou de refuser l'équipe en vous rendant sur la page de l'équipe :
https://{{ domain }}{% url "participation:team_detail" pk=team.pk %}
-Sincerely yours,
+Cordialement,
-The ETEAM team
+L'organisation du TFJM²
diff --git a/participation/templates/participation/mails/request_validation.txt b/participation/templates/participation/mails/request_validation.txt
index fe84e37..d9ff5bf 100644
--- a/participation/templates/participation/mails/request_validation.txt
+++ b/participation/templates/participation/mails/request_validation.txt
@@ -1,10 +1,10 @@
-Hi {{ user }},
+Bonjour {{ user }},
-The team "{{ team.name }}" ({{ team.trigram }}) has just asked to validate his team to take part
-in ETEAM.
-You can decide whether or not to accept the team by going to the team page:
+L'équipe « {{ team.name }} » ({{ team.trigram }}) vient de demander à valider son équipe pour participer
+au {{ team.participation.get_problem_display }} du TFJM².
+Vous pouvez décider d'accepter ou de refuser l'équipe en vous rendant sur la page de l'équipe :
https://{{ domain }}{% url "participation:team_detail" pk=team.pk %}
-Sincerely yours,
+Cordialement,
-The ETEAM team
+L'organisation du TFJM²
diff --git a/participation/templates/participation/mails/team_not_validated.html b/participation/templates/participation/mails/team_not_validated.html
index 3697650..915a003 100644
--- a/participation/templates/participation/mails/team_not_validated.html
+++ b/participation/templates/participation/mails/team_not_validated.html
@@ -2,21 +2,21 @@
- Team not validated – ETEAM
+ Équipe non validée – TFJM²
-Hi,
+Bonjour,
-Unfortunately, your team "{{ team.name }}" ({{ team.trigram }}) has not been validated.
-Please check that your authorisations are correctly filled in.
-The organisers are sending you this message:
+Maleureusement, votre équipe « {{ team.name }} » ({{ team.trigram }}) n'a pas été validée. Veuillez vérifier que vos autorisations
+de droit à l'image sont correctes. Les organisateurs vous adressent ce message :
{{ message }}
-Please contact us at eteam_moc@proton.me if you need further information.
+N'hésitez pas à nous contacter à l'adresse contact@tfjm.org
+pour plus d'informations.
-Sincerely yours,
+Cordialement,
-The ETEAM team
+Le comité d'organisation du TFJM²
diff --git a/participation/templates/participation/mails/team_not_validated.txt b/participation/templates/participation/mails/team_not_validated.txt
index 8ed8a4e..9479fba 100644
--- a/participation/templates/participation/mails/team_not_validated.txt
+++ b/participation/templates/participation/mails/team_not_validated.txt
@@ -1,13 +1,12 @@
-Hi,
+Bonjour,
-Unfortunately, your team "{{ team.name }}" ({{ team.trigram }}) has not been validated.
-Please check that your authorisations are correctly filled in.
-The organisers are sending you this message:
+Maleureusement, votre équipe « {{ team.name }} » ({{ team.trigram }}) n'a pas été validée. Veuillez vérifier que vos
+autorisations de droit à l'image sont correctes. Les organisateurs vous adressent ce message :
{{ message }}
-Please contact us at eteam_moc@proton.me if you need further information.
+N'hésitez pas à nous contacter à l'adresse contact@tfjm.org pour plus d'informations.
-Sincerely yours,
+Cordialement,
-The ETEAM team
+Le comité d'organisation du TFJM²
diff --git a/participation/templates/participation/mails/team_validated.html b/participation/templates/participation/mails/team_validated.html
index 025c64e..9281279 100644
--- a/participation/templates/participation/mails/team_validated.html
+++ b/participation/templates/participation/mails/team_validated.html
@@ -2,36 +2,37 @@
- Team validated – ETEAM
+ Équipe validée – TFJM²
- Hello {{ registration }},
+ Bonjour {{ registration }},
- Congratulations! Your team "{{ team.name }}" ({{ team.trigram }}) is now validated! You are now ready to
- to work on your problems. You can then upload your solutions to the platform.
+ Félicitations ! Votre équipe « {{ team.name }} » ({{ team.trigram }}) est désormais validée ! Vous êtes désormais
+ apte à travailler sur vos problèmes. Vous pourrez ensuite envoyer vos solutions sur la plateforme.
{% if payment %}
- You must now pay your participation fee of € {{ payment.amount }}.
- You can pay by credit card or bank transfer. You'll find information
- on the payment page which you can find on
- your account.
- If you have a scholarship, registration is free, but you must submit a justification on the same page.
+ Vous devez désormais vous acquitter de vos frais de participation, de {{ payment.amount }} € par élève.
+ Vous pouvez payer par carte bancaire ou par virement bancaire. Vous trouverez les informations
+ sur la page de paiement.
+ Si vous disposez d'une bourse, l'inscription est gratuite, mais vous devez soumettre un justificatif
+ sur la même page.
{% elif registration.is_coach and team.participation.tournament.price %}
- Your team must now pay a participation fee of {{ team.participation.tournament.price }} € per student (supervisors are exempt). Students with scholarships are exempt⋅es from these fees.
- You can track the status of payments on
- your team page.
+ Votre équipe doit désormais s'acquitter des frais de participation de {{ team.participation.tournament.price }} €
+ par élève (les encadrant⋅es sont exonéré⋅es). Les élèves qui disposent d'une bourse sont exonéré⋅es de ces frais.
+ Vous pouvez suivre l'état des paiements sur
+ la page de votre équipe.
{% endif %}
{% if message %}
- The organisers send you this message:
+ Les organisateur⋅ices vous adressent ce message :
{{ message }}
@@ -39,7 +40,7 @@
{% endif %}
- The ETEAM team
+ Le comité d'organisation du TFJM²
diff --git a/participation/templates/participation/mails/team_validated.txt b/participation/templates/participation/mails/team_validated.txt
index 98b1814..20888c0 100644
--- a/participation/templates/participation/mails/team_validated.txt
+++ b/participation/templates/participation/mails/team_validated.txt
@@ -1,21 +1,23 @@
-Hello {{registration }},
+Bonjour {{ registration }},
-Congratulations! Your team "{{ team.name }}" ({{ team.trigram }}) is now validated! You are now ready to
-to work on your problems. You can then upload your solutions to the platform.
-{% if payment %}
-You must now pay your participation fee of € {{ payment.amount }}.
-You can pay by credit card or bank transfer. You'll find information
-on the payment page which you can find on your account:
+Félicitations ! Votre équipe « {{ team.name }} » ({{ team.trigram }}) est désormais validée ! Vous êtes désormais apte
+à travailler sur vos problèmes. Vous pourrez ensuite envoyer vos solutions sur la plateforme.
+{% if team.participation.amount %}
+Vous devez désormais vous acquitter de vos frais de participation, de {{ team.participation.amount }} €.
+Vous pouvez payer par carte bancaire ou par virement bancaire. Vous trouverez les informations
+sur la page de paiement que vous pouvez retrouver sur votre compte :
https://{{ domain }}{% url 'registration:my_account_detail' %}
-If you have a scholarship, registration is free, but you must submit a justification on the same page.
+Si vous disposez d'une bourse, l'inscription est gratuite, mais vous devez soumettre un justificatif
+sur la même page.
{% elif registration.is_coach and team.participation.tournament.price %}
-Your team must now pay a participation fee of {{ team.participation.tournament.price }} € per student (supervisors are exempt). Students with scholarships are exempt⋅es from these fees.
-You can track the status of payments on your team page:
+Votre équipe doit désormais s'acquitter des frais de participation de {{ team.participation.tournament.price }} €
+par élève (les encadrant⋅es sont exonéré⋅es). Les élèves qui disposent d'une bourse sont exonéré⋅es de ces frais.
+Vous pouvez suivre l'état des paiements sur la page de votre équipe :
https://{{ domain }}{% url 'participation:team_detail' pk=team.pk %}
{% endif %}
{% if message %}
-The organisers send you this message:
+Les organisateurices vous adressent ce message :
{{ message }}
{% endif %}
-The ETEAM team
+Le comité d'organisation du TFJM²
diff --git a/participation/templates/participation/update_team.html b/participation/templates/participation/update_team.html
index e053da8..63ad727 100644
--- a/participation/templates/participation/update_team.html
+++ b/participation/templates/participation/update_team.html
@@ -1,15 +1,37 @@
{% extends request.content_only|yesno:"empty.html,base.html" %}
-{% load crispy_forms_filters i18n %}
+{% load crispy_forms_filters crispy_forms_tags i18n %}
{% block content %}
{% endblock content %}
+{% block extrajavascript %}
+
+{% endblock %}
diff --git a/registration/templates/registration/mails/payment_confirmation.html b/registration/templates/registration/mails/payment_confirmation.html
index 4b6c6f3..279ac6b 100644
--- a/registration/templates/registration/mails/payment_confirmation.html
+++ b/registration/templates/registration/mails/payment_confirmation.html
@@ -14,7 +14,7 @@
{% blocktrans trimmed with amount=payment.amount team=payment.team.trigram tournament=payment.tournament.name %}
- We successfully received the payment of {{ amount }} € for your participation for the ETEAM in the team {{ team }}!
+ We successfully received the payment of {{ amount }} € for your participation for the TFJM² in the team {{ team }} for the tournament {{ tournament }}!
{% endblocktrans %}
@@ -32,13 +32,17 @@
+
+ {% trans "Please note that these dates may be subject to change. If your local organizers gave you different dates, trust them." %}
+
+
{% trans "NB: This mail don't represent a payment receipt. The payer should receive a mail from Hello Asso. If it is not the case, please contact us if necessary" %}
--
- {% trans "The ETEAM team." %}
+ {% trans "The TFJM² team." %}