1
0
mirror of https://gitlab.com/animath/si/plateforme.git synced 2024-11-30 09:33:02 +00:00

Compare commits

...

2 Commits

Author SHA1 Message Date
Emmy D'Anello
d84db949c6
Fix trigram validation
Signed-off-by: Emmy D'Anello <emmy.danello@animath.fr>
2024-06-13 11:03:10 +02:00
Emmy D'Anello
2627b3a9b8
Add migrations for ETEAM
Signed-off-by: Emmy D'Anello <emmy.danello@animath.fr>
2024-06-13 10:57:51 +02:00
5 changed files with 306 additions and 163 deletions

View File

@ -0,0 +1,69 @@
# Generated by Django 5.0.6 on 2024-06-13 08:53
import django.core.validators
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("draw", "0004_alter_round_number"),
]
operations = [
migrations.AlterField(
model_name="round",
name="number",
field=models.PositiveSmallIntegerField(
choices=[(1, "Round 1"), (2, "Round 2"), (3, "Round 3")],
help_text="The number of the round, 1 or 2 (or 3 for ETEAM)",
validators=[
django.core.validators.MinValueValidator(1),
django.core.validators.MaxValueValidator(3),
],
verbose_name="number",
),
),
migrations.AlterField(
model_name="teamdraw",
name="accepted",
field=models.PositiveSmallIntegerField(
choices=[
(1, "Problem #1"),
(2, "Problem #2"),
(3, "Problem #3"),
(4, "Problem #4"),
(5, "Problem #5"),
(6, "Problem #6"),
(7, "Problem #7"),
(8, "Problem #8"),
(9, "Problem #9"),
(10, "Problem #10"),
],
default=None,
null=True,
verbose_name="accepted problem",
),
),
migrations.AlterField(
model_name="teamdraw",
name="purposed",
field=models.PositiveSmallIntegerField(
choices=[
(1, "Problem #1"),
(2, "Problem #2"),
(3, "Problem #3"),
(4, "Problem #4"),
(5, "Problem #5"),
(6, "Problem #6"),
(7, "Problem #7"),
(8, "Problem #8"),
(9, "Problem #9"),
(10, "Problem #10"),
],
default=None,
null=True,
verbose_name="purposed problem",
),
),
]

View File

@ -193,7 +193,7 @@ class Round(models.Model):
choices=[
(1, _('Round 1')),
(2, _('Round 2')),
] + ([] if settings.NB_ROUNDS == 2 else [(3, _('Round 3'))]),
(3, _('Round 3'))],
verbose_name=_('number'),
help_text=_("The number of the round, 1 or 2 (or 3 for ETEAM)"),
validators=[MinValueValidator(1), MaxValueValidator(settings.NB_ROUNDS)],

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: TFJM\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-06-08 00:37+0200\n"
"POT-Creation-Date: 2024-06-13 10:56+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Emmy D'Anello <emmy.danello@animath.fr>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -37,7 +37,7 @@ msgstr "Canaux d'équipes"
msgid "Private channels"
msgstr "Messages privés"
#: chat/models.py:29 participation/models.py:36 participation/models.py:266
#: chat/models.py:29 participation/models.py:36 participation/models.py:272
#: participation/tables.py:18 participation/tables.py:34
msgid "name"
msgstr "nom"
@ -78,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:26 participation/admin.py:79 participation/admin.py:140
#: participation/admin.py:171 participation/models.py:721
#: participation/models.py:745 participation/models.py:1006
#: participation/admin.py:171 participation/models.py:727
#: participation/models.py:751 participation/models.py:1012
#: 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:429 draw/models.py:456
#: participation/admin.py:136 participation/admin.py:155
#: participation/models.py:1509 participation/models.py:1518
#: participation/models.py:1515 participation/models.py:1524
#: participation/tables.py:84
msgid "pool"
msgstr "poule"
@ -108,8 +108,8 @@ msgstr ""
"concernée."
#: chat/models.py:84 draw/templates/draw/tournament_content.html:277
#: participation/admin.py:167 participation/models.py:255
#: participation/models.py:736
#: participation/admin.py:167 participation/models.py:261
#: participation/models.py:742
#: participation/templates/participation/tournament_harmonize.html:15
#: registration/models.py:158 registration/models.py:754
#: registration/tables.py:39
@ -259,13 +259,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:256
#: participation/admin.py:109 participation/models.py:262
#: participation/tables.py:88
msgid "teams"
msgstr "équipes"
#: draw/admin.py:92 draw/models.py:234 draw/models.py:448
#: participation/models.py:1010
#: participation/models.py:1016
msgid "round"
msgstr "tour"
@ -407,7 +407,7 @@ msgstr "La poule en cours, où les équipes choisissent leurs problèmes"
msgid "rounds"
msgstr "tours"
#: draw/models.py:257 participation/models.py:1018
#: draw/models.py:257 participation/models.py:1024
msgid "letter"
msgstr "lettre"
@ -445,12 +445,12 @@ msgstr "L'instance complète de la poule."
msgid "Pool {letter}{number}"
msgstr "Poule {letter}{number}"
#: draw/models.py:430 participation/models.py:1510
#: draw/models.py:430 participation/models.py:1516
msgid "pools"
msgstr "poules"
#: draw/models.py:442 participation/models.py:996 participation/models.py:1659
#: participation/models.py:1689 participation/models.py:1731
#: draw/models.py:442 participation/models.py:1002 participation/models.py:1665
#: participation/models.py:1695 participation/models.py:1737
msgid "participation"
msgstr "participation"
@ -474,8 +474,8 @@ msgid ""
msgstr ""
"L'ordre de choix dans la poule, entre 0 et la taille de la poule moins 1."
#: draw/models.py:479 draw/models.py:502 participation/models.py:1532
#: participation/models.py:1696
#: draw/models.py:479 draw/models.py:502 participation/models.py:1538
#: participation/models.py:1702
#, python-brace-format
msgid "Problem #{problem}"
msgstr "Problème n°{problem}"
@ -686,26 +686,26 @@ msgstr "Changelog de type \"{action}\" pour le modèle {model} le {timestamp}"
msgid "valid"
msgstr "valide"
#: participation/admin.py:87 participation/models.py:757
#: participation/admin.py:87 participation/models.py:763
msgid "selected for final"
msgstr "sélectionnée pour la finale"
#: participation/admin.py:124 participation/admin.py:183
#: participation/models.py:1539 participation/tables.py:112
#: participation/models.py:1545 participation/tables.py:112
msgid "defender"
msgstr "défenseur⋅se"
#: participation/admin.py:128 participation/models.py:1546
#: participation/models.py:1743
#: participation/admin.py:128 participation/models.py:1552
#: participation/models.py:1749
msgid "opponent"
msgstr "opposant⋅e"
#: participation/admin.py:132 participation/models.py:1553
#: participation/models.py:1744
#: participation/admin.py:132 participation/models.py:1559
#: participation/models.py:1750
msgid "reporter"
msgstr "rapporteur⋅rice"
#: participation/admin.py:187 participation/models.py:1694
#: participation/admin.py:187 participation/models.py:1700
msgid "problem"
msgstr "numéro de problème"
@ -952,134 +952,139 @@ msgstr ""
msgid "Pending validation"
msgstr "Validation en attente"
#: participation/models.py:252
#: participation/models.py:241
#, python-brace-format
msgid "The team code must be composed of {nb_letters} uppercase letters."
msgstr "Le code d'équipe doit être composé de {nb_letters} lettres majuscules."
#: participation/models.py:258
#, python-brace-format
msgid "Team {name} ({trigram})"
msgstr "Équipe {name} ({trigram})"
#: participation/models.py:271
#: participation/models.py:277
msgid "start"
msgstr "début"
#: participation/models.py:276
#: participation/models.py:282
msgid "end"
msgstr "fin"
#: participation/models.py:282
#: participation/models.py:288
#: participation/templates/participation/tournament_detail.html:18
msgid "place"
msgstr "lieu"
#: participation/models.py:286
#: participation/models.py:292
msgid "max team count"
msgstr "nombre maximal d'équipes"
#: participation/models.py:291
#: participation/models.py:297
#: participation/templates/participation/tournament_detail.html:22
msgid "price"
msgstr "prix"
#: participation/models.py:296
#: participation/models.py:302
#: participation/templates/participation/tournament_detail.html:26
msgid "remote"
msgstr "à distance"
#: participation/models.py:301
#: participation/models.py:307
msgid "limit date for registrations"
msgstr "date limite d'inscription"
#: participation/models.py:306
#: participation/models.py:312
msgid "limit date to upload solutions"
msgstr "date limite pour envoyer les solutions"
#: participation/models.py:311
#: participation/models.py:317
msgid "random draw for solutions"
msgstr "tirage au sort des solutions"
#: participation/models.py:316
#: participation/models.py:322
msgid "first phase date"
msgstr "date du premier tour"
#: participation/models.py:321
#: participation/models.py:327
msgid "limit date to upload the syntheses for the first phase"
msgstr "date limite pour envoyer les notes de synthèses pour la première phase"
#: participation/models.py:326
#: participation/models.py:332
msgid "first second date"
msgstr "date du second tour"
#: participation/models.py:331
#: participation/models.py:337
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:336
#: participation/models.py:342
msgid "limit date to upload the syntheses for the second phase"
msgstr "date limite d'envoi des notes de synthèse pour la seconde phase"
#: participation/models.py:341
#: participation/models.py:347
msgid "third phase date"
msgstr "date du troisième tour"
#: participation/models.py:346
#: participation/models.py:352
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:351
#: participation/models.py:357
msgid "limit date to upload the syntheses for the third phase"
msgstr ""
"date limite pour envoyer les notes de synthèses pour la troisième phase"
#: participation/models.py:356
#: participation/models.py:362
#: participation/templates/participation/tournament_detail.html:52
msgid "description"
msgstr "description"
#: participation/models.py:362
#: participation/models.py:368
#: participation/templates/participation/tournament_detail.html:12
msgid "organizers"
msgstr "organisateur⋅rices"
#: participation/models.py:367
#: participation/models.py:373
#: participation/templates/participation/team_detail.html:167
msgid "final"
msgstr "finale"
#: participation/models.py:375
#: participation/models.py:381
msgid "Google Sheet ID"
msgstr "ID de la feuille Google Sheets"
#: participation/models.py:722 registration/admin.py:125
#: participation/models.py:728 registration/admin.py:125
msgid "tournaments"
msgstr "tournois"
#: participation/models.py:751
#: participation/models.py:757
msgid "valid team"
msgstr "équipe valide"
#: participation/models.py:752
#: participation/models.py:758
msgid "The participation got the validation of the organizers."
msgstr "La participation a été validée par les organisateur⋅rices."
#: participation/models.py:758
#: participation/models.py:764
msgid "The team is selected for the final tournament."
msgstr "L'équipe est sélectionnée pour la finale."
#: participation/models.py:762
#: participation/models.py:768
msgid "mention"
msgstr "mention"
#: participation/models.py:769
#: participation/models.py:775
msgid "mention (final)"
msgstr "Mention (pour la finale) :"
#: participation/models.py:779
#: participation/models.py:785
#, python-brace-format
msgid "Participation of the team {name} ({trigram})"
msgstr "Participation de l'équipe {name} ({trigram})"
#: participation/models.py:786
#: participation/models.py:792
#, python-brace-format
msgid ""
"<p>The team {trigram} has {nb_missing_payments} missing payments. Each "
@ -1092,11 +1097,11 @@ msgstr ""
"notification de bourse) pour participer au tournoi.</p><p>Les participant⋅es "
"qui n'ont pas encore payé sont : {participants}.</p>"
#: participation/models.py:794
#: participation/models.py:800
msgid "Missing payments"
msgstr "Paiements manquants"
#: participation/models.py:811
#: participation/models.py:817
msgid ""
"<p>The solutions for the tournament of {tournament} are due on the {date:%Y-"
"%m-%d %H:%M}.</p><p>You have currently sent <strong>{nb_solutions}</strong> "
@ -1111,11 +1116,11 @@ msgstr ""
"pouvez envoyer vos solutions sur <a href='{url}'>votre page de "
"participation</a>.</p>"
#: participation/models.py:821 participation/models.py:835
#: participation/models.py:827 participation/models.py:841
msgid "Solutions due"
msgstr "Rendu des solutions"
#: participation/models.py:827
#: participation/models.py:833
msgid ""
"<p>The solutions for the tournament of {tournament} are due on the {date:%Y-"
"%m-%d %H:%M}.</p><p>Remember that you can only fix minor changes to your "
@ -1128,7 +1133,7 @@ msgstr ""
"parties.</p><p>Vous pouvez envoyer vos solutions sur <a href='{url}'>votre "
"page de participation</a>.</p>"
#: participation/models.py:841 registration/models.py:607
#: participation/models.py:847 registration/models.py:607
msgid ""
"<p>The draw of the solutions for the tournament {tournament} is planned on "
"the {date:%Y-%m-%d %H:%M}. You can join it on <a href='{url}'>this link</a>."
@ -1138,11 +1143,11 @@ msgstr ""
"{date:%d/%m/%Y %H:%M}. Vous pouvez y participer sur <a href='{url}'>ce lien</"
"a>.</p>"
#: participation/models.py:847 registration/models.py:614
#: participation/models.py:853 registration/models.py:614
msgid "Draw of solutions"
msgstr "Tirage au sort des solutions"
#: participation/models.py:857
#: participation/models.py:863
#, python-brace-format
msgid ""
"<p>The solutions draw is ended. You can check the result on <a "
@ -1154,8 +1159,8 @@ msgstr ""
"tour, vous défendrez <a href='{solution_url}'>votre solution du problème "
"{problem}</a>.</p>"
#: participation/models.py:866 participation/models.py:908
#: participation/models.py:951
#: participation/models.py:872 participation/models.py:914
#: participation/models.py:957
#, python-brace-format
msgid ""
"<p>You will oppose the solution of the team {opponent} on the <a "
@ -1166,8 +1171,8 @@ msgstr ""
"href='{solution_url}'>problème {problem}</a>. Vous pouvez envoyer votre note "
"de synthèse sur <a href='{passage_url}'>cette page</a>.</p>"
#: participation/models.py:875 participation/models.py:917
#: participation/models.py:960
#: participation/models.py:881 participation/models.py:923
#: participation/models.py:966
#, python-brace-format
msgid ""
"<p>You will report the solution of the team {reporter} on the <a "
@ -1178,11 +1183,11 @@ msgstr ""
"href='{solution_url}'>problème {problem}</a>. Vous pouvez envoyer votre note "
"de synthèse sur <a href='{passage_url}'>cette page</a>.</p>"
#: participation/models.py:891 registration/models.py:629
#: participation/models.py:897 registration/models.py:629
msgid "First round"
msgstr "Premier tour"
#: participation/models.py:901
#: participation/models.py:907
#, python-brace-format
msgid ""
"<p>For the second round, you will defend <a href='{solution_url}'>your "
@ -1191,12 +1196,12 @@ msgstr ""
"<p>Pour le second tour, vous défendrez <a href='{solution_url}'>votre "
"solution du problème {problem}</a>.</p>"
#: participation/models.py:933 participation/models.py:976
#: participation/models.py:939 participation/models.py:982
#: registration/models.py:640
msgid "Second round"
msgstr "Second tour"
#: participation/models.py:944
#: participation/models.py:950
#, python-brace-format
msgid ""
"<p>For the third round, you will defend <a href='{solution_url}'>your "
@ -1205,7 +1210,7 @@ msgstr ""
"<p>Pour le troisième tour, vous défendrez <a href='{solution_url}'>votre "
"solution du problème {problem}</a>.</p>"
#: participation/models.py:982
#: participation/models.py:988
#, python-brace-format
msgid ""
"<p>The tournament {tournament} is ended. You can check the results on the <a "
@ -1214,57 +1219,57 @@ msgstr ""
"<p>Le tournoi {tournament} est terminé. Vous pouvez consulter les résultats "
"sur la <a href='{url}'>page du tournoi</a>.</p>"
#: participation/models.py:987
#: participation/models.py:993
msgid "Tournament ended"
msgstr "Tournoi terminé"
#: participation/models.py:997 participation/models.py:1040
#: participation/models.py:1003 participation/models.py:1046
msgid "participations"
msgstr "participations"
#: participation/models.py:1012 participation/models.py:1013
#: participation/models.py:1014
#: participation/models.py:1018 participation/models.py:1019
#: participation/models.py:1020
#, python-brace-format
msgid "Round {round}"
msgstr "Tour {round}"
#: participation/models.py:1028
#: participation/models.py:1034
msgid "room"
msgstr "salle"
#: participation/models.py:1030
#: participation/models.py:1036
msgid "Room 1"
msgstr "Salle 1"
#: participation/models.py:1031
#: participation/models.py:1037
msgid "Room 2"
msgstr "Salle 2"
#: participation/models.py:1034
#: participation/models.py:1040
msgid "For 5-teams pools only"
msgstr "Pour les poules de 5 équipe uniquement"
#: participation/models.py:1046
#: participation/models.py:1052
msgid "juries"
msgstr "jurys"
#: participation/models.py:1055
#: participation/models.py:1061
msgid "president of the jury"
msgstr "président⋅e du jury"
#: participation/models.py:1062
#: participation/models.py:1068
msgid "BigBlueButton URL"
msgstr "Lien BigBlueButton"
#: participation/models.py:1063
#: participation/models.py:1069
msgid "The link of the BBB visio for this pool."
msgstr "Le lien du salon BBB pour cette poule."
#: participation/models.py:1068
#: participation/models.py:1074
msgid "results available"
msgstr "résultats disponibles"
#: participation/models.py:1069
#: participation/models.py:1075
msgid ""
"Check this case when results become accessible to teams. They stay "
"accessible to you. Only averages are given."
@ -1273,33 +1278,33 @@ msgstr ""
"Ils restent toujours accessibles pour vous. Seules les moyennes sont "
"communiquées."
#: participation/models.py:1101
#: participation/models.py:1107
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:1490
#: participation/models.py:1496
#, 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:1503
#: participation/models.py:1509
#, 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:1523
#: participation/models.py:1529
msgid "position"
msgstr "position"
#: participation/models.py:1530
#: participation/models.py:1536
msgid "defended solution"
msgstr "solution défendue"
#: participation/models.py:1558
#: participation/models.py:1564
msgid "penalties"
msgstr "pénalités"
#: participation/models.py:1560
#: participation/models.py:1566
msgid ""
"Number of penalties for the defender. The defender will loose a 0.5 "
"coefficient per penalty."
@ -1307,120 +1312,120 @@ 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:1629 participation/models.py:1632
#: participation/models.py:1635
#: participation/models.py:1635 participation/models.py:1638
#: participation/models.py:1641
#, 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:1640
#: participation/models.py:1646
#, python-brace-format
msgid "Passage of {defender} for problem {problem}"
msgstr "Passage de {defender} pour le problème {problem}"
#: participation/models.py:1644 participation/models.py:1653
#: participation/models.py:1738 participation/models.py:1780
#: participation/models.py:1650 participation/models.py:1659
#: participation/models.py:1744 participation/models.py:1786
msgid "passage"
msgstr "passage"
#: participation/models.py:1645
#: participation/models.py:1651
msgid "passages"
msgstr "passages"
#: participation/models.py:1664
#: participation/models.py:1670
msgid "difference"
msgstr "différence"
#: participation/models.py:1665
#: participation/models.py:1671
msgid "Score to add/remove on the final score"
msgstr "Score à ajouter/retrancher au score final"
#: participation/models.py:1672
#: participation/models.py:1678
msgid "tweak"
msgstr "harmonisation"
#: participation/models.py:1673
#: participation/models.py:1679
msgid "tweaks"
msgstr "harmonisations"
#: participation/models.py:1701
#: participation/models.py:1707
msgid "solution for the final tournament"
msgstr "solution pour la finale"
#: participation/models.py:1706 participation/models.py:1749
#: participation/models.py:1712 participation/models.py:1755
msgid "file"
msgstr "fichier"
#: participation/models.py:1716
#: participation/models.py:1722
#, 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:1718
#: participation/models.py:1724
msgid "for final"
msgstr "pour la finale"
#: participation/models.py:1721
#: participation/models.py:1727
msgid "solution"
msgstr "solution"
#: participation/models.py:1722
#: participation/models.py:1728
msgid "solutions"
msgstr "solutions"
#: participation/models.py:1755
#: participation/models.py:1761
#, python-brace-format
msgid "Synthesis of {team} as {type} for problem {problem} of {defender}"
msgstr ""
"Note de synthèse de l'équipe {team} en tant que {type} pour le problème "
"{problem} de {defender}"
#: participation/models.py:1763
#: participation/models.py:1769
msgid "synthesis"
msgstr "note de synthèse"
#: participation/models.py:1764
#: participation/models.py:1770
msgid "syntheses"
msgstr "notes de synthèse"
#: participation/models.py:1773
#: participation/models.py:1779
msgid "jury"
msgstr "jury"
#: participation/models.py:1785
#: participation/models.py:1791
msgid "defender writing note"
msgstr "note d'écrit défenseur⋅se"
#: participation/models.py:1791
#: participation/models.py:1797
msgid "defender oral note"
msgstr "note d'oral défenseur⋅se"
#: participation/models.py:1797
#: participation/models.py:1803
msgid "opponent writing note"
msgstr "note d'écrit opposant⋅e"
#: participation/models.py:1803
#: participation/models.py:1809
msgid "opponent oral note"
msgstr "note d'oral opposant⋅e"
#: participation/models.py:1809
#: participation/models.py:1815
msgid "reporter writing note"
msgstr "note d'écrit rapporteur⋅rice"
#: participation/models.py:1815
#: participation/models.py:1821
msgid "reporter oral note"
msgstr "note d'oral du rapporteur⋅rice"
#: participation/models.py:1875
#: participation/models.py:1881
#, python-brace-format
msgid "Notes of {jury} for {passage}"
msgstr "Notes de {jury} pour le {passage}"
#: participation/models.py:1878
#: participation/models.py:1884
msgid "note"
msgstr "note"
#: participation/models.py:1879
#: participation/models.py:1885
msgid "notes"
msgstr "notes"
@ -2981,8 +2986,8 @@ msgid ""
"You recently registered on the ETEAM platform. Please click on the link "
"below to confirm your registration."
msgstr ""
"Vous vous êtes inscrit⋅e sur la plateforme de l'ETEAM. Merci de cliquer sur le "
"lien ci-dessous pour confirmer votre inscription."
"Vous vous êtes inscrit⋅e sur la plateforme de l'ETEAM. Merci de cliquer sur "
"le lien ci-dessous pour confirmer votre inscription."
#: registration/templates/registration/mails/email_validation_email.html:26
#: registration/templates/registration/mails/email_validation_email.txt:9
@ -3067,13 +3072,12 @@ msgstr "L'équipe de l'ETEAM"
#: 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 ETEAM. 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 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 €."
#: registration/templates/registration/mails/payment_reminder.html:24
#: registration/templates/registration/mails/payment_reminder.txt:9
@ -3841,31 +3845,31 @@ msgstr "Nous contacter"
msgid "About"
msgstr "À propos"
#: tfjm/templates/index_eteam.html:9 tfjm/templates/index_tfjm.html:9
#: tfjm/templates/index_eteam.html:11 tfjm/templates/index_tfjm.html:11
msgid "Welcome onto the registration site of the"
msgstr " Bienvenue sur le site d'inscription au"
#: tfjm/templates/index_eteam.html:18
#: tfjm/templates/index_eteam.html:20
msgid "You want to participate to the ETEAM ?"
msgstr " Tu souhaites participer à l'ETEAM ?"
#: tfjm/templates/index_eteam.html:20
#: tfjm/templates/index_eteam.html:22
msgid "Your team is selected and already complete?"
msgstr "Ton équipe est sélectionnée et déjà formée ?"
#: tfjm/templates/index_eteam.html:25 tfjm/templates/index_tfjm.html:25
#: tfjm/templates/index_eteam.html:27 tfjm/templates/index_tfjm.html:27
msgid "Register now!"
msgstr "Inscris-toi maintenant !"
#: tfjm/templates/index_eteam.html:26 tfjm/templates/index_tfjm.html:26
#: tfjm/templates/index_eteam.html:28 tfjm/templates/index_tfjm.html:28
msgid "I already have an account"
msgstr "J'ai déjà un compte"
#: tfjm/templates/index_eteam.html:32 tfjm/templates/index_tfjm.html:32
#: tfjm/templates/index_eteam.html:34 tfjm/templates/index_tfjm.html:34
msgid "How does it work?"
msgstr "Comment ça marche ?"
#: tfjm/templates/index_eteam.html:35
#: tfjm/templates/index_eteam.html:37
#, python-format
msgid ""
"To participate to the ETEAM, you must be selected by your national "
@ -3878,7 +3882,7 @@ msgstr ""
"créer un compte sur la <strong><a href=\"%(signup_url)s\">page "
"d'inscription</a></strong>. Vous devrez ensuite confirmer votre adresse mail."
#: tfjm/templates/index_eteam.html:44
#: tfjm/templates/index_eteam.html:46
#, python-format
msgid ""
"You can access your account via the <strong><a href=\"%(login_url)s\">Login</"
@ -3900,16 +3904,16 @@ msgstr ""
"valider votre équipe pour pouvoir travailler sur les problèmes de votre "
"choix."
#: tfjm/templates/index_eteam.html:53 tfjm/templates/index_tfjm.html:62
#: tfjm/templates/index_eteam.html:55 tfjm/templates/index_tfjm.html:64
msgid "I have a question"
msgstr "J'ai une question"
#: tfjm/templates/index_eteam.html:56
#: tfjm/templates/index_eteam.html:58
msgid ""
"Do not hesitate to consult the <a href=\"/doc/\" "
"target=\"_blank\">documentation</a> of the site, to check if the answer is "
"not already there. Also refer of course to the <a href=\"https://eteam.tfjm."
"org/rules/\" target=\"_blank\">𝕋𝔽𝕁𝕄² rules</a>. For any other question, do "
"org/rules/\" target=\"_blank\">ETEAM rules</a>. For any other question, do "
"not hesitate to contact us by email at the address <a href=\"mailto:"
"eteam_moc@proton.me \"> eteam_moc@proton.me </a>."
msgstr ""
@ -3920,15 +3924,15 @@ msgstr ""
"autre question, n'hésitez pas à nous contacter par mail à l'adresse <a "
"href=\"mailto:eteam_moc@proton.me\"> eteam_moc@proton.me </a>."
#: tfjm/templates/index_tfjm.html:18
#: tfjm/templates/index_tfjm.html:20
msgid "You want to participate to the 𝕋𝔽𝕁𝕄² ?"
msgstr " Tu souhaites participer au 𝕋𝔽𝕁𝕄² ?"
#: tfjm/templates/index_tfjm.html:20
#: tfjm/templates/index_tfjm.html:22
msgid "Your team is already complete?"
msgstr "Ton équipe est déjà formée ?"
#: tfjm/templates/index_tfjm.html:35
#: tfjm/templates/index_tfjm.html:37
#, python-format
msgid ""
"To participate to the 𝕋𝔽𝕁𝕄², you just need to create an account on the "
@ -3939,7 +3943,7 @@ msgstr ""
"<strong><a href=\"%(signup_url)s\">page d'inscription</a></strong>. Vous "
"devrez ensuite confirmer votre adresse mail."
#: tfjm/templates/index_tfjm.html:43
#: tfjm/templates/index_tfjm.html:45
#, python-format
msgid ""
"You can access your account via the <strong><a href=\"%(login_url)s\">Login</"
@ -3961,11 +3965,11 @@ msgstr ""
"valider votre équipe pour pouvoir travailler sur les problèmes de votre "
"choix."
#: tfjm/templates/index_tfjm.html:52
#: tfjm/templates/index_tfjm.html:54
msgid "I can't find a team, help me!"
msgstr "Je ne trouve pas d'équipe, aidez-moi !"
#: tfjm/templates/index_tfjm.html:56
#: tfjm/templates/index_tfjm.html:58
msgid ""
"You can contact us at the address <a href=\"mailto:contact@tfjm."
"org\">contact@tfjm.org</a> so that we can help you get in touch with other "
@ -3975,7 +3979,7 @@ msgstr ""
"org\">contact@tfjm.org</a> pour que nous puissions vous mettre en relation "
"avec d'autres participant⋅es qui cherchent également une équipe."
#: tfjm/templates/index_tfjm.html:65
#: tfjm/templates/index_tfjm.html:67
msgid ""
"Do not hesitate to consult the <a href=\"/doc/\" "
"target=\"_blank\">documentation</a> of the site, to check if the answer is "
@ -3995,11 +3999,11 @@ msgstr ""
"&#109;&#46;&#111;&#114;&#103;\"> &#99;&#111;&#110;&#116;&#97;&#99;&#116;&#64;"
"&#116;&#102;&#106;&#109;&#46;&#111;&#114;&#103; </a>."
#: tfjm/templates/index_tfjm.html:77
#: tfjm/templates/index_tfjm.html:79
msgid "Save the dates!"
msgstr "Attention aux dates !"
#: tfjm/templates/index_tfjm.html:78
#: tfjm/templates/index_tfjm.html:80
msgid ""
"If you don't end your registration by the indicated deadline, you will "
"unfortunately not be able to participate in the 𝕋𝔽𝕁𝕄²."
@ -4007,7 +4011,7 @@ msgstr ""
"Si vous ne finalisez pas votre inscription avant la date limite indiquée, "
"vous ne pourrez malheureusement pas participer au 𝕋𝔽𝕁𝕄²."
#: tfjm/templates/navbar.html:19 tfjm/urls.py:33
#: tfjm/templates/navbar.html:19 tfjm/urls.py:34
msgid "Home"
msgstr "Accueil"
@ -4091,16 +4095,3 @@ msgstr "Aucun résultat."
#: tfjm/templates/sidebar.html:10 tfjm/templates/sidebar.html:21
msgid "Informations"
msgstr "Informations"
#~ msgid ""
#~ "Please note that these dates may be subject to change. If your local "
#~ "organizers gave you different dates, trust them."
#~ msgstr ""
#~ "Veuillez noter que ces dates peuvent être sujettes à changement. Si vos "
#~ "organisateur⋅rices locaux⋅ales vous ont donné des dates différentes, "
#~ "faites-leur confiance."
#~ msgid "date when solutions of round 2 are available"
#~ msgstr ""
#~ "date à partir de laquelle les solutions pour le second tour sont "
#~ "disponibles"

View File

@ -0,0 +1,77 @@
# Generated by Django 5.0.6 on 2024-06-13 08:53
import django.core.validators
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("participation", "0016_tournament_date_first_phase_and_more"),
]
operations = [
migrations.AlterField(
model_name="passage",
name="solution_number",
field=models.PositiveSmallIntegerField(
choices=[
(1, "Problem #1"),
(2, "Problem #2"),
(3, "Problem #3"),
(4, "Problem #4"),
(5, "Problem #5"),
(6, "Problem #6"),
(7, "Problem #7"),
(8, "Problem #8"),
(9, "Problem #9"),
(10, "Problem #10"),
],
verbose_name="defended solution",
),
),
migrations.AlterField(
model_name="pool",
name="round",
field=models.PositiveSmallIntegerField(
choices=[(1, "Round 1"), (2, "Round 2"), (3, "Round 3")],
verbose_name="round",
),
),
migrations.AlterField(
model_name="solution",
name="problem",
field=models.PositiveSmallIntegerField(
choices=[
(1, "Problem #1"),
(2, "Problem #2"),
(3, "Problem #3"),
(4, "Problem #4"),
(5, "Problem #5"),
(6, "Problem #6"),
(7, "Problem #7"),
(8, "Problem #8"),
(9, "Problem #9"),
(10, "Problem #10"),
],
verbose_name="problem",
),
),
migrations.AlterField(
model_name="team",
name="trigram",
field=models.CharField(
help_text="The code must be composed of 4 uppercase letters.",
max_length=4,
unique=True,
validators=[
django.core.validators.RegexValidator("^[A-Z]{3}[A-Z]*$"),
django.core.validators.RegexValidator(
"^(?!BIT$|CNO$|CRO$|CUL$|FTG$|FCK$|FUC$|FUK$|FYS$|HIV$|IST$|MST$|KKK$|KYS$|SEX$)",
message="This team code is forbidden.",
),
],
verbose_name="code",
),
),
]

View File

@ -38,13 +38,13 @@ class Team(models.Model):
)
trigram = models.CharField(
max_length=settings.TEAM_CODE_LENGTH,
max_length=4,
verbose_name=_("code"),
help_text=format_lazy(_("The code must be composed of {nb_letters} uppercase letters."),
nb_letters=settings.TEAM_CODE_LENGTH),
unique=True,
validators=[
RegexValidator("^[A-Z]{" + str(settings.TEAM_CODE_LENGTH) + "}$"),
RegexValidator("^[A-Z]{3}[A-Z]*$"),
RegexValidator(fr"^(?!{'|'.join(f'{t}$' for t in settings.FORBIDDEN_TRIGRAMS)})",
message=_("This team code is forbidden.")),
],
@ -236,6 +236,12 @@ class Team(models.Model):
get_sympa_client().unsubscribe(self.email, "equipes-non-valides", False)
get_sympa_client().delete_list(f"equipe-{self.trigram}")
def clean(self):
if self.trigram and len(self.trigram) != settings.TEAM_CODE_LENGTH:
raise ValidationError({'trigram': _("The team code must be composed of {nb_letters} uppercase letters.")},
params={'nb_letters': settings.TEAM_CODE_LENGTH})
return super().clean()
def save(self, *args, **kwargs):
if not self.access_code:
# if the team got created, generate the access code, create the contact mailing list