Add forbidden trigrams, closes #17

This commit is contained in:
Emmy D'Anello 2023-02-19 19:49:03 +01:00
parent 4a39d206d5
commit 600ebd087e
Signed by: ynerant
GPG Key ID: 3A75C55819C8CF85
4 changed files with 174 additions and 130 deletions

View File

@ -0,0 +1,19 @@
# Generated by Django 3.2.18 on 2023-02-19 22:13
import django.core.validators
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('participation', '0002_initial'),
]
operations = [
migrations.AlterField(
model_name='team',
name='trigram',
field=models.CharField(help_text='The trigram must be composed of three uppercase letters.', max_length=3, unique=True, validators=[django.core.validators.RegexValidator('^[A-Z]{3}$'), django.core.validators.RegexValidator('^(?!BIT$|CNO$|CRO$|CUL$|FTG$|FCK$|FUC$|FUK$|FYS$|HIV$|IST$|MST$|KKK$|KYS$|SEX$)', message='This trigram is forbidden.')], verbose_name='trigram'),
),
]

View File

@ -39,7 +39,11 @@ class Team(models.Model):
verbose_name=_("trigram"), verbose_name=_("trigram"),
help_text=_("The trigram must be composed of three uppercase letters."), help_text=_("The trigram must be composed of three uppercase letters."),
unique=True, unique=True,
validators=[RegexValidator("[A-Z]{3}")], validators=[
RegexValidator(r"^[A-Z]{3}$"),
RegexValidator(fr"^(?!{'|'.join(f'{t}$' for t in settings.FORBIDDEN_TRIGRAMS)})",
message=_("This trigram is forbidden.")),
],
) )
access_code = models.CharField( access_code = models.CharField(

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: TFJM\n" "Project-Id-Version: TFJM\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-01-10 20:31+0100\n" "POT-Creation-Date: 2023-02-19 19:48+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Emmy D'Anello <emmy.danello@animath.fr>\n" "Last-Translator: Emmy D'Anello <emmy.danello@animath.fr>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -99,88 +99,88 @@ msgstr "changelogs"
msgid "Changelog of type \"{action}\" for model {model} at {timestamp}" msgid "Changelog of type \"{action}\" for model {model} at {timestamp}"
msgstr "Changelog de type \"{action}\" pour le modèle {model} le {timestamp}" msgstr "Changelog de type \"{action}\" pour le modèle {model} le {timestamp}"
#: apps/participation/admin.py:19 apps/participation/models.py:314 #: apps/participation/admin.py:19 apps/participation/models.py:318
#: apps/participation/tables.py:44 apps/registration/models.py:370 #: apps/participation/tables.py:44 apps/registration/models.py:370
msgid "valid" msgid "valid"
msgstr "valide" msgstr "valide"
#: apps/participation/forms.py:30 #: apps/participation/forms.py:29
msgid "This name is already used." msgid "This name is already used."
msgstr "Ce nom est déjà utilisé." msgstr "Ce nom est déjà utilisé."
#: apps/participation/forms.py:37 apps/participation/models.py:40 #: apps/participation/forms.py:36 apps/participation/models.py:40
msgid "The trigram must be composed of three uppercase letters." msgid "The trigram must be composed of three uppercase letters."
msgstr "Le trigramme doit être composé de trois lettres majuscules." msgstr "Le trigramme doit être composé de trois lettres majuscules."
#: apps/participation/forms.py:40 #: apps/participation/forms.py:39
msgid "This trigram is already used." msgid "This trigram is already used."
msgstr "Ce trigramme est déjà utilisé." msgstr "Ce trigramme est déjà utilisé."
#: apps/participation/forms.py:55 #: apps/participation/forms.py:54
msgid "No team was found with this access code." msgid "No team was found with this access code."
msgstr "Aucune équipe n'a été trouvée avec ce code d'accès." msgstr "Aucune équipe n'a été trouvée avec ce code d'accès."
#: apps/participation/forms.py:84 apps/participation/forms.py:284 #: apps/participation/forms.py:83 apps/participation/forms.py:281
#: apps/registration/forms.py:117 apps/registration/forms.py:139 #: apps/registration/forms.py:121 apps/registration/forms.py:143
#: apps/registration/forms.py:161 apps/registration/forms.py:215 #: apps/registration/forms.py:165 apps/registration/forms.py:219
msgid "The uploaded file size must be under 2 Mo." msgid "The uploaded file size must be under 2 Mo."
msgstr "Le fichier envoyé doit peser moins de 2 Mo." msgstr "Le fichier envoyé doit peser moins de 2 Mo."
#: apps/participation/forms.py:86 apps/registration/forms.py:119 #: apps/participation/forms.py:85 apps/registration/forms.py:123
#: apps/registration/forms.py:141 apps/registration/forms.py:163 #: apps/registration/forms.py:145 apps/registration/forms.py:167
#: apps/registration/forms.py:217 #: apps/registration/forms.py:221
msgid "The uploaded file must be a PDF, PNG of JPEG file." msgid "The uploaded file must be a PDF, PNG of JPEG file."
msgstr "Le fichier envoyé doit être au format PDF, PNG ou JPEG." msgstr "Le fichier envoyé doit être au format PDF, PNG ou JPEG."
#: apps/participation/forms.py:104 #: apps/participation/forms.py:103
msgid "I engage myself to participate to the whole TFJM²." msgid "I engage myself to participate to the whole TFJM²."
msgstr "Je m'engage à participer à l'intégralité du TFJM²." msgstr "Je m'engage à participer à l'intégralité du TFJM²."
#: apps/participation/forms.py:119 #: apps/participation/forms.py:118
msgid "Message to address to the team:" msgid "Message to address to the team:"
msgstr "Message à adresser à l'équipe :" msgstr "Message à adresser à l'équipe :"
#: apps/participation/forms.py:157 #: apps/participation/forms.py:154
msgid "The uploaded file size must be under 5 Mo." msgid "The uploaded file size must be under 5 Mo."
msgstr "Le fichier envoyé doit peser moins de 5 Mo." msgstr "Le fichier envoyé doit peser moins de 5 Mo."
#: apps/participation/forms.py:159 apps/participation/forms.py:286 #: apps/participation/forms.py:156 apps/participation/forms.py:283
msgid "The uploaded file must be a PDF file." msgid "The uploaded file must be a PDF file."
msgstr "Le fichier envoyé doit être au format PDF." msgstr "Le fichier envoyé doit être au format PDF."
#: apps/participation/forms.py:163 #: apps/participation/forms.py:160
msgid "The PDF file must not have more than 30 pages." msgid "The PDF file must not have more than 30 pages."
msgstr "Le fichier PDF ne doit pas avoir plus de 30 pages." msgstr "Le fichier PDF ne doit pas avoir plus de 30 pages."
#: apps/participation/forms.py:200 #: apps/participation/forms.py:197
msgid "CSV file:" msgid "CSV file:"
msgstr "Tableur au format CSV :" msgstr "Tableur au format CSV :"
#: apps/participation/forms.py:217 #: apps/participation/forms.py:214
msgid "" msgid ""
"This file contains non-UTF-8 content. Please send your sheet as a CSV file." "This file contains non-UTF-8 content. Please send your sheet as a CSV file."
msgstr "" msgstr ""
"Ce fichier contient des éléments non-UTF-8. Merci d'envoyer votre tableur au " "Ce fichier contient des éléments non-UTF-8. Merci d'envoyer votre tableur au "
"format CSV." "format CSV."
#: apps/participation/forms.py:242 #: apps/participation/forms.py:239
msgid "The following note is higher of the maximum expected value:" msgid "The following note is higher of the maximum expected value:"
msgstr "La note suivante est supérieure au maximum attendu :" msgstr "La note suivante est supérieure au maximum attendu :"
#: apps/participation/forms.py:250 #: apps/participation/forms.py:247
msgid "The following user was not found:" msgid "The following user was not found:"
msgstr "L'utilisateur⋅rice suivant n'a pas été trouvé :" msgstr "L'utilisateur⋅rice suivant n'a pas été trouvé :"
#: apps/participation/forms.py:267 #: apps/participation/forms.py:264
msgid "The defender, the opponent and the reporter must be different." msgid "The defender, the opponent and the reporter must be different."
msgstr "" msgstr ""
"Læ défenseur⋅se, l'opposant⋅e et læ rapporteur⋅e doivent être différent⋅es." "Læ défenseur⋅se, l'opposant⋅e et læ rapporteur⋅e doivent être différent⋅es."
#: apps/participation/forms.py:271 #: apps/participation/forms.py:268
msgid "This defender did not work on this problem." msgid "This defender did not work on this problem."
msgstr "Ce⋅tte défenseur⋅se ne travaille pas sur ce problème." msgstr "Ce⋅tte défenseur⋅se ne travaille pas sur ce problème."
#: apps/participation/models.py:33 apps/participation/models.py:131 #: apps/participation/models.py:33 apps/participation/models.py:135
#: apps/participation/tables.py:17 apps/participation/tables.py:34 #: apps/participation/tables.py:17 apps/participation/tables.py:34
msgid "name" msgid "name"
msgstr "nom" msgstr "nom"
@ -189,158 +189,162 @@ msgstr "nom"
msgid "trigram" msgid "trigram"
msgstr "trigramme" msgstr "trigramme"
#: apps/participation/models.py:47 #: apps/participation/models.py:45
msgid "This trigram is forbidden."
msgstr "Ce trigramme est interdit."
#: apps/participation/models.py:51
msgid "access code" msgid "access code"
msgstr "code d'accès" msgstr "code d'accès"
#: apps/participation/models.py:48 #: apps/participation/models.py:52
msgid "The access code let other people to join the team." msgid "The access code let other people to join the team."
msgstr "Le code d'accès permet aux autres participants de rejoindre l'équipe." msgstr "Le code d'accès permet aux autres participants de rejoindre l'équipe."
#: apps/participation/models.py:52 #: apps/participation/models.py:56
msgid "motivation letter" msgid "motivation letter"
msgstr "lettre de motivation" msgstr "lettre de motivation"
#: apps/participation/models.py:118 #: apps/participation/models.py:122
#, python-brace-format #, python-brace-format
msgid "Team {name} ({trigram})" msgid "Team {name} ({trigram})"
msgstr "Équipe {name} ({trigram})" msgstr "Équipe {name} ({trigram})"
#: apps/participation/models.py:121 apps/participation/models.py:299 #: apps/participation/models.py:125 apps/participation/models.py:303
#: apps/registration/models.py:123 #: apps/registration/models.py:123
msgid "team" msgid "team"
msgstr "équipe" msgstr "équipe"
#: apps/participation/models.py:122 apps/participation/tables.py:85 #: apps/participation/models.py:126 apps/participation/tables.py:85
msgid "teams" msgid "teams"
msgstr "équipes" msgstr "équipes"
#: apps/participation/models.py:136 #: apps/participation/models.py:140
msgid "start" msgid "start"
msgstr "début" msgstr "début"
#: apps/participation/models.py:141 #: apps/participation/models.py:145
msgid "end" msgid "end"
msgstr "fin" msgstr "fin"
#: apps/participation/models.py:147 #: apps/participation/models.py:151
#: apps/participation/templates/participation/tournament_detail.html:18 #: apps/participation/templates/participation/tournament_detail.html:18
msgid "place" msgid "place"
msgstr "lieu" msgstr "lieu"
#: apps/participation/models.py:151 #: apps/participation/models.py:155
msgid "max team count" msgid "max team count"
msgstr "nombre maximal d'équipes" msgstr "nombre maximal d'équipes"
#: apps/participation/models.py:156 #: apps/participation/models.py:160
#: apps/participation/templates/participation/tournament_detail.html:21 #: apps/participation/templates/participation/tournament_detail.html:21
msgid "price" msgid "price"
msgstr "prix" msgstr "prix"
#: apps/participation/models.py:161 #: apps/participation/models.py:165
#: apps/participation/templates/participation/tournament_detail.html:24 #: apps/participation/templates/participation/tournament_detail.html:24
msgid "remote" msgid "remote"
msgstr "à distance" msgstr "à distance"
#: apps/participation/models.py:166 #: apps/participation/models.py:170
msgid "limit date for registrations" msgid "limit date for registrations"
msgstr "date limite d'inscription" msgstr "date limite d'inscription"
#: apps/participation/models.py:171 #: apps/participation/models.py:175
msgid "limit date to upload solutions" msgid "limit date to upload solutions"
msgstr "date limite pour envoyer les solutions" msgstr "date limite pour envoyer les solutions"
#: apps/participation/models.py:176 #: apps/participation/models.py:180
msgid "random draw for solutions" msgid "random draw for solutions"
msgstr "tirage au sort des solutions" msgstr "tirage au sort des solutions"
#: apps/participation/models.py:181 #: apps/participation/models.py:185
msgid "limit date to upload the syntheses for the first phase" 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" msgstr "date limite pour envoyer les notes de synthèses pour la première phase"
#: apps/participation/models.py:186 #: apps/participation/models.py:190
msgid "date when the solutions for the second round become available" msgid "date when the solutions for the second round become available"
msgstr "date à laquelle les solutions pour le second tour sont accessibles" msgstr "date à laquelle les solutions pour le second tour sont accessibles"
#: apps/participation/models.py:191 #: apps/participation/models.py:195
msgid "limit date to upload the syntheses for the second phase" 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" msgstr "date limite d'envoi des notes de synthèse pour la seconde phase"
#: apps/participation/models.py:196 #: apps/participation/models.py:200
#: apps/participation/templates/participation/tournament_detail.html:48 #: apps/participation/templates/participation/tournament_detail.html:48
msgid "description" msgid "description"
msgstr "description" msgstr "description"
#: apps/participation/models.py:202 #: apps/participation/models.py:206
#: apps/participation/templates/participation/tournament_detail.html:12 #: apps/participation/templates/participation/tournament_detail.html:12
msgid "organizers" msgid "organizers"
msgstr "organisateur⋅rices" msgstr "organisateur⋅rices"
#: apps/participation/models.py:207 #: apps/participation/models.py:211
msgid "final" msgid "final"
msgstr "finale" msgstr "finale"
#: apps/participation/models.py:284 apps/participation/models.py:308 #: apps/participation/models.py:288 apps/participation/models.py:312
#: apps/participation/models.py:340 #: apps/participation/models.py:344
msgid "tournament" msgid "tournament"
msgstr "tournoi" msgstr "tournoi"
#: apps/participation/models.py:285 #: apps/participation/models.py:289
msgid "tournaments" msgid "tournaments"
msgstr "tournois" msgstr "tournois"
#: apps/participation/models.py:315 #: apps/participation/models.py:319
msgid "The participation got the validation of the organizers." msgid "The participation got the validation of the organizers."
msgstr "La participation a été validée par les organisateur⋅rices." msgstr "La participation a été validée par les organisateur⋅rices."
#: apps/participation/models.py:320 #: apps/participation/models.py:324
msgid "selected for final" msgid "selected for final"
msgstr "sélectionnée pour la finale" msgstr "sélectionnée pour la finale"
#: apps/participation/models.py:321 #: apps/participation/models.py:325
msgid "The team is selected for the final tournament." msgid "The team is selected for the final tournament."
msgstr "L'équipe est sélectionnée pour la finale." msgstr "L'équipe est sélectionnée pour la finale."
#: apps/participation/models.py:328 #: apps/participation/models.py:332
#, python-brace-format #, python-brace-format
msgid "Participation of the team {name} ({trigram})" msgid "Participation of the team {name} ({trigram})"
msgstr "Participation de l'équipe {name} ({trigram})" msgstr "Participation de l'équipe {name} ({trigram})"
#: apps/participation/models.py:331 apps/participation/models.py:528 #: apps/participation/models.py:335 apps/participation/models.py:532
#: apps/participation/models.py:558 apps/participation/models.py:596 #: apps/participation/models.py:562 apps/participation/models.py:600
msgid "participation" msgid "participation"
msgstr "participation" msgstr "participation"
#: apps/participation/models.py:332 apps/participation/models.py:354 #: apps/participation/models.py:336 apps/participation/models.py:358
msgid "participations" msgid "participations"
msgstr "participations" msgstr "participations"
#: apps/participation/models.py:344 #: apps/participation/models.py:348
msgid "round" msgid "round"
msgstr "tour" msgstr "tour"
#: apps/participation/models.py:346 apps/participation/models.py:347 #: apps/participation/models.py:350 apps/participation/models.py:351
#, python-brace-format #, python-brace-format
msgid "Round {round}" msgid "Round {round}"
msgstr "Tour {round}" msgstr "Tour {round}"
#: apps/participation/models.py:360 #: apps/participation/models.py:364
msgid "juries" msgid "juries"
msgstr "jurys" msgstr "jurys"
#: apps/participation/models.py:367 #: apps/participation/models.py:371
msgid "BigBlueButton URL" msgid "BigBlueButton URL"
msgstr "Lien BigBlueButton" msgstr "Lien BigBlueButton"
#: apps/participation/models.py:368 #: apps/participation/models.py:372
msgid "The link of the BBB visio for this pool." msgid "The link of the BBB visio for this pool."
msgstr "Le lien du salon BBB pour cette poule." msgstr "Le lien du salon BBB pour cette poule."
#: apps/participation/models.py:373 #: apps/participation/models.py:377
msgid "results available" msgid "results available"
msgstr "résultats disponibles" msgstr "résultats disponibles"
#: apps/participation/models.py:374 #: apps/participation/models.py:378
msgid "" msgid ""
"Check this case when results become accessible to teams. They stay " "Check this case when results become accessible to teams. They stay "
"accessible to you. Only averages are given." "accessible to you. Only averages are given."
@ -349,45 +353,45 @@ msgstr ""
"Ils restent toujours accessibles pour vous. Seules les moyennes sont " "Ils restent toujours accessibles pour vous. Seules les moyennes sont "
"communiquées." "communiquées."
#: apps/participation/models.py:390 #: apps/participation/models.py:394
#, python-brace-format #, python-brace-format
msgid "Pool of day {round} for tournament {tournament} with teams {teams}" msgid "Pool of day {round} for tournament {tournament} with teams {teams}"
msgstr "Poule du jour {round} du tournoi {tournament} avec les équipes {teams}" msgstr "Poule du jour {round} du tournoi {tournament} avec les équipes {teams}"
#: apps/participation/models.py:396 apps/participation/models.py:404 #: apps/participation/models.py:400 apps/participation/models.py:408
msgid "pool" msgid "pool"
msgstr "poule" msgstr "poule"
#: apps/participation/models.py:397 #: apps/participation/models.py:401
msgid "pools" msgid "pools"
msgstr "poules" msgstr "poules"
#: apps/participation/models.py:409 #: apps/participation/models.py:413
msgid "defended solution" msgid "defended solution"
msgstr "solution défendue" msgstr "solution défendue"
#: apps/participation/models.py:411 apps/participation/models.py:565 #: apps/participation/models.py:415 apps/participation/models.py:569
#, python-brace-format #, python-brace-format
msgid "Problem #{problem}" msgid "Problem #{problem}"
msgstr "Problème n°{problem}" msgstr "Problème n°{problem}"
#: apps/participation/models.py:418 apps/participation/tables.py:106 #: apps/participation/models.py:422 apps/participation/tables.py:106
msgid "defender" msgid "defender"
msgstr "défenseur" msgstr "défenseur"
#: apps/participation/models.py:425 apps/participation/models.py:608 #: apps/participation/models.py:429 apps/participation/models.py:612
msgid "opponent" msgid "opponent"
msgstr "opposant" msgstr "opposant"
#: apps/participation/models.py:432 apps/participation/models.py:609 #: apps/participation/models.py:436 apps/participation/models.py:613
msgid "reporter" msgid "reporter"
msgstr "rapporteur" msgstr "rapporteur"
#: apps/participation/models.py:437 #: apps/participation/models.py:441
msgid "penalties" msgid "penalties"
msgstr "pénalités" msgstr "pénalités"
#: apps/participation/models.py:439 #: apps/participation/models.py:443
msgid "" msgid ""
"Number of penalties for the defender. The defender will loose a 0.5 " "Number of penalties for the defender. The defender will loose a 0.5 "
"coefficient per penalty." "coefficient per penalty."
@ -395,124 +399,124 @@ msgstr ""
"Nombre de pénalités pour læ défenseur⋅se. Læ défenseur⋅se perd un " "Nombre de pénalités pour læ défenseur⋅se. Læ défenseur⋅se perd un "
"coefficient 0.5 sur sa solution écrite par pénalité." "coefficient 0.5 sur sa solution écrite par pénalité."
#: apps/participation/models.py:499 apps/participation/models.py:502 #: apps/participation/models.py:503 apps/participation/models.py:506
#: apps/participation/models.py:505 #: apps/participation/models.py:509
#, python-brace-format #, python-brace-format
msgid "Team {trigram} is not registered in the pool." msgid "Team {trigram} is not registered in the pool."
msgstr "L'équipe {trigram} n'est pas inscrite dans la poule." msgstr "L'équipe {trigram} n'est pas inscrite dans la poule."
#: apps/participation/models.py:510 #: apps/participation/models.py:514
#, python-brace-format #, python-brace-format
msgid "Passage of {defender} for problem {problem}" msgid "Passage of {defender} for problem {problem}"
msgstr "Passage de {defender} pour le problème {problem}" msgstr "Passage de {defender} pour le problème {problem}"
#: apps/participation/models.py:514 apps/participation/models.py:522 #: apps/participation/models.py:518 apps/participation/models.py:526
#: apps/participation/models.py:603 apps/participation/models.py:645 #: apps/participation/models.py:607 apps/participation/models.py:649
msgid "passage" msgid "passage"
msgstr "passage" msgstr "passage"
#: apps/participation/models.py:515 #: apps/participation/models.py:519
msgid "passages" msgid "passages"
msgstr "passages" msgstr "passages"
#: apps/participation/models.py:533 #: apps/participation/models.py:537
msgid "difference" msgid "difference"
msgstr "différence" msgstr "différence"
#: apps/participation/models.py:534 #: apps/participation/models.py:538
msgid "Score to add/remove on the final score" msgid "Score to add/remove on the final score"
msgstr "Score à ajouter/retrancher au score final" msgstr "Score à ajouter/retrancher au score final"
#: apps/participation/models.py:541 #: apps/participation/models.py:545
msgid "tweak" msgid "tweak"
msgstr "harmonisation" msgstr "harmonisation"
#: apps/participation/models.py:542 #: apps/participation/models.py:546
msgid "tweaks" msgid "tweaks"
msgstr "harmonisations" msgstr "harmonisations"
#: apps/participation/models.py:563 #: apps/participation/models.py:567
msgid "problem" msgid "problem"
msgstr "numéro de problème" msgstr "numéro de problème"
#: apps/participation/models.py:570 #: apps/participation/models.py:574
msgid "solution for the final tournament" msgid "solution for the final tournament"
msgstr "solution pour la finale" msgstr "solution pour la finale"
#: apps/participation/models.py:575 apps/participation/models.py:614 #: apps/participation/models.py:579 apps/participation/models.py:618
msgid "file" msgid "file"
msgstr "fichier" msgstr "fichier"
#: apps/participation/models.py:581 #: apps/participation/models.py:585
#, python-brace-format #, python-brace-format
msgid "Solution of team {team} for problem {problem}" msgid "Solution of team {team} for problem {problem}"
msgstr "Solution de l'équipe {team} pour le problème {problem}" msgstr "Solution de l'équipe {team} pour le problème {problem}"
#: apps/participation/models.py:583 #: apps/participation/models.py:587
msgid "for final" msgid "for final"
msgstr "pour la finale" msgstr "pour la finale"
#: apps/participation/models.py:586 #: apps/participation/models.py:590
msgid "solution" msgid "solution"
msgstr "solution" msgstr "solution"
#: apps/participation/models.py:587 #: apps/participation/models.py:591
msgid "solutions" msgid "solutions"
msgstr "solutions" msgstr "solutions"
#: apps/participation/models.py:620 #: apps/participation/models.py:624
#, python-brace-format #, python-brace-format
msgid "Synthesis of {team} as {type} for problem {problem} of {defender}" msgid "Synthesis of {team} as {type} for problem {problem} of {defender}"
msgstr "" msgstr ""
"Note de synthèse de l'équipe {team} en tant que {type} pour le problème " "Note de synthèse de l'équipe {team} en tant que {type} pour le problème "
"{problem} de {defender}" "{problem} de {defender}"
#: apps/participation/models.py:628 #: apps/participation/models.py:632
msgid "synthesis" msgid "synthesis"
msgstr "note de synthèse" msgstr "note de synthèse"
#: apps/participation/models.py:629 #: apps/participation/models.py:633
msgid "syntheses" msgid "syntheses"
msgstr "notes de synthèse" msgstr "notes de synthèse"
#: apps/participation/models.py:638 #: apps/participation/models.py:642
msgid "jury" msgid "jury"
msgstr "jury" msgstr "jury"
#: apps/participation/models.py:650 #: apps/participation/models.py:654
msgid "defender writing note" msgid "defender writing note"
msgstr "note d'écrit de læ défenseur⋅se" msgstr "note d'écrit de læ défenseur⋅se"
#: apps/participation/models.py:656 #: apps/participation/models.py:660
msgid "defender oral note" msgid "defender oral note"
msgstr "note d'oral de læ défenseur⋅se" msgstr "note d'oral de læ défenseur⋅se"
#: apps/participation/models.py:662 #: apps/participation/models.py:666
msgid "opponent writing note" msgid "opponent writing note"
msgstr "note d'écrit de l'opposant⋅e" msgstr "note d'écrit de l'opposant⋅e"
#: apps/participation/models.py:668 #: apps/participation/models.py:672
msgid "opponent oral note" msgid "opponent oral note"
msgstr "note d'oral de l'opposant⋅e" msgstr "note d'oral de l'opposant⋅e"
#: apps/participation/models.py:674 #: apps/participation/models.py:678
msgid "reporter writing note" msgid "reporter writing note"
msgstr "note d'écrit de læ rapporteur⋅e" msgstr "note d'écrit de læ rapporteur⋅e"
#: apps/participation/models.py:680 #: apps/participation/models.py:684
msgid "reporter oral note" msgid "reporter oral note"
msgstr "note d'oral de læ rapporteur⋅e" msgstr "note d'oral de læ rapporteur⋅e"
#: apps/participation/models.py:698 #: apps/participation/models.py:702
#, python-brace-format #, python-brace-format
msgid "Notes of {jury} for {passage}" msgid "Notes of {jury} for {passage}"
msgstr "Notes de {jury} pour le {passage}" msgstr "Notes de {jury} pour le {passage}"
#: apps/participation/models.py:705 #: apps/participation/models.py:709
msgid "note" msgid "note"
msgstr "note" msgstr "note"
#: apps/participation/models.py:706 #: apps/participation/models.py:710
msgid "notes" msgid "notes"
msgstr "notes" msgstr "notes"
@ -939,7 +943,7 @@ msgid "Invalidate"
msgstr "Invalider" msgstr "Invalider"
#: apps/participation/templates/participation/team_detail.html:171 #: apps/participation/templates/participation/team_detail.html:171
#: apps/participation/views.py:328 #: apps/participation/views.py:332
msgid "Upload motivation letter" msgid "Upload motivation letter"
msgstr "Envoyer la lettre de motivation" msgstr "Envoyer la lettre de motivation"
@ -948,7 +952,7 @@ msgid "Update team"
msgstr "Modifier l'équipe" msgstr "Modifier l'équipe"
#: apps/participation/templates/participation/team_detail.html:181 #: apps/participation/templates/participation/team_detail.html:181
#: apps/participation/views.py:431 #: apps/participation/views.py:435
msgid "Leave team" msgid "Leave team"
msgstr "Quitter l'équipe" msgstr "Quitter l'équipe"
@ -1078,12 +1082,12 @@ msgstr "Vous êtes déjà dans une équipe."
msgid "Join team" msgid "Join team"
msgstr "Rejoindre une équipe" msgstr "Rejoindre une équipe"
#: apps/participation/views.py:151 apps/participation/views.py:437 #: apps/participation/views.py:151 apps/participation/views.py:441
#: apps/participation/views.py:471 #: apps/participation/views.py:475
msgid "You are not in a team." msgid "You are not in a team."
msgstr "Vous n'êtes pas dans une équipe." msgstr "Vous n'êtes pas dans une équipe."
#: apps/participation/views.py:152 apps/participation/views.py:472 #: apps/participation/views.py:152 apps/participation/views.py:476
msgid "You don't participate, so you don't have any team." msgid "You don't participate, so you don't have any team."
msgstr "Vous ne participez pas, vous n'avez donc pas d'équipe." msgstr "Vous ne participez pas, vous n'avez donc pas d'équipe."
@ -1123,62 +1127,62 @@ msgstr "L'équipe n'a pas de validation en attente."
msgid "You must specify if you validate the registration or not." msgid "You must specify if you validate the registration or not."
msgstr "Vous devez spécifier si vous validez l'inscription ou non." msgstr "Vous devez spécifier si vous validez l'inscription ou non."
#: apps/participation/views.py:308 #: apps/participation/views.py:310
#, python-brace-format #, python-brace-format
msgid "Update team {trigram}" msgid "Update team {trigram}"
msgstr "Mise à jour de l'équipe {trigram}" msgstr "Mise à jour de l'équipe {trigram}"
#: apps/participation/views.py:367 apps/participation/views.py:417 #: apps/participation/views.py:371 apps/participation/views.py:421
#, python-brace-format #, python-brace-format
msgid "Motivation letter of {team}.{ext}" msgid "Motivation letter of {team}.{ext}"
msgstr "Lettre de motivation de {team}.{ext}" msgstr "Lettre de motivation de {team}.{ext}"
#: apps/participation/views.py:398 #: apps/participation/views.py:402
#, python-brace-format #, python-brace-format
msgid "Photo authorization of {participant}.{ext}" msgid "Photo authorization of {participant}.{ext}"
msgstr "Autorisation de droit à l'image de {participant}.{ext}" msgstr "Autorisation de droit à l'image de {participant}.{ext}"
#: apps/participation/views.py:404 #: apps/participation/views.py:408
#, python-brace-format #, python-brace-format
msgid "Parental authorization of {participant}.{ext}" msgid "Parental authorization of {participant}.{ext}"
msgstr "Autorisation parentale de {participant}.{ext}" msgstr "Autorisation parentale de {participant}.{ext}"
#: apps/participation/views.py:411 #: apps/participation/views.py:415
#, python-brace-format #, python-brace-format
msgid "Health sheet of {participant}.{ext}" msgid "Health sheet of {participant}.{ext}"
msgstr "Fiche sanitaire de {participant}.{ext}" msgstr "Fiche sanitaire de {participant}.{ext}"
#: apps/participation/views.py:421 #: apps/participation/views.py:425
#, python-brace-format #, python-brace-format
msgid "Photo authorizations of team {trigram}.zip" msgid "Photo authorizations of team {trigram}.zip"
msgstr "Autorisations de droit à l'image de l'équipe {trigram}.zip" msgstr "Autorisations de droit à l'image de l'équipe {trigram}.zip"
#: apps/participation/views.py:439 #: apps/participation/views.py:443
msgid "The team is already validated or the validation is pending." msgid "The team is already validated or the validation is pending."
msgstr "La validation de l'équipe est déjà faite ou en cours." msgstr "La validation de l'équipe est déjà faite ou en cours."
#: apps/participation/views.py:486 #: apps/participation/views.py:490
msgid "The team is not validated yet." msgid "The team is not validated yet."
msgstr "L'équipe n'est pas encore validée." msgstr "L'équipe n'est pas encore validée."
#: apps/participation/views.py:500 #: apps/participation/views.py:504
#, python-brace-format #, python-brace-format
msgid "Participation of team {trigram}" msgid "Participation of team {trigram}"
msgstr "Participation de l'équipe {trigram}" msgstr "Participation de l'équipe {trigram}"
#: apps/participation/views.py:626 #: apps/participation/views.py:630
msgid "You can't upload a solution after the deadline." msgid "You can't upload a solution after the deadline."
msgstr "Vous ne pouvez pas envoyer de solution après la date limite." msgstr "Vous ne pouvez pas envoyer de solution après la date limite."
#: apps/participation/views.py:729 #: apps/participation/views.py:733
msgid "The following user is not registered as a jury:" msgid "The following user is not registered as a jury:"
msgstr "L'utilisateur⋅rice suivant n'est pas inscrit⋅e en tant que juré⋅e :" msgstr "L'utilisateur⋅rice suivant n'est pas inscrit⋅e en tant que juré⋅e :"
#: apps/participation/views.py:737 #: apps/participation/views.py:741
msgid "Notes were successfully uploaded." msgid "Notes were successfully uploaded."
msgstr "Les notes ont bien été envoyées." msgstr "Les notes ont bien été envoyées."
#: apps/participation/views.py:849 #: apps/participation/views.py:853
msgid "You can't upload a synthesis after the deadline." msgid "You can't upload a synthesis after the deadline."
msgstr "Vous ne pouvez pas envoyer de note de synthèse après la date limite." msgstr "Vous ne pouvez pas envoyer de note de synthèse après la date limite."
@ -1206,11 +1210,11 @@ msgstr "bénévole"
msgid "admin" msgid "admin"
msgstr "admin" msgstr "admin"
#: apps/registration/forms.py:209 #: apps/registration/forms.py:213
msgid "Pending" msgid "Pending"
msgstr "En attente" msgstr "En attente"
#: apps/registration/forms.py:225 #: apps/registration/forms.py:229
msgid "You must upload your scholarship attestation." msgid "You must upload your scholarship attestation."
msgstr "Vous devez envoyer votre attestation de bourse." msgstr "Vous devez envoyer votre attestation de bourse."
@ -1843,11 +1847,11 @@ msgstr "Autorisation parentale de {student}.{ext}"
msgid "Scholarship attestation of {user}.{ext}" msgid "Scholarship attestation of {user}.{ext}"
msgstr "Notification de bourse de {user}.{ext}" msgstr "Notification de bourse de {user}.{ext}"
#: tfjm/settings.py:162 #: tfjm/settings.py:161
msgid "English" msgid "English"
msgstr "Anglais" msgstr "Anglais"
#: tfjm/settings.py:163 #: tfjm/settings.py:162
msgid "French" msgid "French"
msgstr "Français" msgstr "Français"

View File

@ -224,11 +224,6 @@ else:
} }
} }
if os.getenv("TFJM_STAGE", "dev") == "prod": # pragma: no cover
from .settings_prod import * # noqa: F401,F403
else:
from .settings_dev import * # noqa: F401,F403
# Custom phone number format # Custom phone number format
PHONENUMBER_DB_FORMAT = 'NATIONAL' PHONENUMBER_DB_FORMAT = 'NATIONAL'
PHONENUMBER_DEFAULT_REGION = 'FR' PHONENUMBER_DEFAULT_REGION = 'FR'
@ -240,3 +235,25 @@ JQUERY_URL = False
# Custom parameters # Custom parameters
PROBLEM_COUNT = 8 PROBLEM_COUNT = 8
FORBIDDEN_TRIGRAMS = [
"BIT",
"CNO",
"CRO",
"CUL",
"FTG",
"FCK",
"FUC",
"FUK",
"FYS",
"HIV",
"IST",
"MST",
"KKK",
"KYS",
"SEX",
]
if os.getenv("TFJM_STAGE", "dev") == "prod": # pragma: no cover
from .settings_prod import * # noqa: F401,F403
else:
from .settings_dev import * # noqa: F401,F403