mirror of
				https://gitlab.com/animath/si/plateforme.git
				synced 2025-11-04 16:02:26 +01:00 
			
		
		
		
	Restructure add juree page
Signed-off-by: Emmy D'Anello <emmy.danello@animath.fr>
This commit is contained in:
		@@ -7,7 +7,7 @@ msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: TFJM\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: \n"
 | 
			
		||||
"POT-Creation-Date: 2024-03-03 15:15+0100\n"
 | 
			
		||||
"POT-Creation-Date: 2024-03-23 11:22+0100\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"
 | 
			
		||||
@@ -377,8 +377,8 @@ msgstr "Êtes-vous sûr·e de vouloir annuler le tirage au sort ?"
 | 
			
		||||
msgid "Close"
 | 
			
		||||
msgstr "Fermer"
 | 
			
		||||
 | 
			
		||||
#: draw/views.py:31 participation/views.py:154 participation/views.py:440
 | 
			
		||||
#: participation/views.py:471
 | 
			
		||||
#: draw/views.py:31 participation/views.py:155 participation/views.py:441
 | 
			
		||||
#: participation/views.py:472
 | 
			
		||||
msgid "You are not in a team."
 | 
			
		||||
msgstr "Vous n'êtes pas dans une équipe."
 | 
			
		||||
 | 
			
		||||
@@ -474,76 +474,67 @@ msgstr "rapporteur⋅e"
 | 
			
		||||
msgid "problem"
 | 
			
		||||
msgstr "numéro de problème"
 | 
			
		||||
 | 
			
		||||
#: participation/forms.py:32
 | 
			
		||||
#: participation/forms.py:31
 | 
			
		||||
msgid "This name is already used."
 | 
			
		||||
msgstr "Ce nom est déjà utilisé."
 | 
			
		||||
 | 
			
		||||
#: participation/forms.py:39 participation/models.py:39
 | 
			
		||||
#: participation/forms.py:38 participation/models.py:39
 | 
			
		||||
msgid "The trigram must be composed of three uppercase letters."
 | 
			
		||||
msgstr "Le trigramme doit être composé de trois lettres majuscules."
 | 
			
		||||
 | 
			
		||||
#: participation/forms.py:42
 | 
			
		||||
#: participation/forms.py:41
 | 
			
		||||
msgid "This trigram is already used."
 | 
			
		||||
msgstr "Ce trigramme est déjà utilisé."
 | 
			
		||||
 | 
			
		||||
#: participation/forms.py:57
 | 
			
		||||
#: participation/forms.py:56
 | 
			
		||||
msgid "No team was found with this access code."
 | 
			
		||||
msgstr "Aucune équipe n'a été trouvée avec ce code d'accès."
 | 
			
		||||
 | 
			
		||||
#: participation/forms.py:86 participation/forms.py:351
 | 
			
		||||
#: participation/forms.py:85 participation/forms.py:352
 | 
			
		||||
#: registration/forms.py:122 registration/forms.py:144
 | 
			
		||||
#: registration/forms.py:166 registration/forms.py:188
 | 
			
		||||
#: registration/forms.py:237 registration/forms.py:270
 | 
			
		||||
msgid "The uploaded file size must be under 2 Mo."
 | 
			
		||||
msgstr "Le fichier envoyé doit peser moins de 2 Mo."
 | 
			
		||||
 | 
			
		||||
#: participation/forms.py:88 registration/forms.py:124
 | 
			
		||||
#: participation/forms.py:87 registration/forms.py:124
 | 
			
		||||
#: registration/forms.py:146 registration/forms.py:168
 | 
			
		||||
#: registration/forms.py:190 registration/forms.py:239
 | 
			
		||||
#: registration/forms.py:272
 | 
			
		||||
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:106
 | 
			
		||||
#: participation/forms.py:105
 | 
			
		||||
msgid "I engage myself to participate to the whole TFJM²."
 | 
			
		||||
msgstr "Je m'engage à participer à l'intégralité du TFJM²."
 | 
			
		||||
 | 
			
		||||
#: participation/forms.py:121
 | 
			
		||||
#: participation/forms.py:120
 | 
			
		||||
msgid "Message to address to the team:"
 | 
			
		||||
msgstr "Message à adresser à l'équipe :"
 | 
			
		||||
 | 
			
		||||
#: participation/forms.py:156
 | 
			
		||||
#: participation/forms.py:155
 | 
			
		||||
msgid "The uploaded file size must be under 5 Mo."
 | 
			
		||||
msgstr "Le fichier envoyé doit peser moins de 5 Mo."
 | 
			
		||||
 | 
			
		||||
#: participation/forms.py:158 participation/forms.py:353
 | 
			
		||||
#: participation/forms.py:157 participation/forms.py:354
 | 
			
		||||
msgid "The uploaded file must be a PDF file."
 | 
			
		||||
msgstr "Le fichier envoyé doit être au format PDF."
 | 
			
		||||
 | 
			
		||||
#: participation/forms.py:162
 | 
			
		||||
#: participation/forms.py:161
 | 
			
		||||
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:212
 | 
			
		||||
msgid "Add new jury"
 | 
			
		||||
msgstr "Ajouter un⋅e nouvelleau juré⋅e"
 | 
			
		||||
 | 
			
		||||
#: participation/forms.py:227
 | 
			
		||||
#: participation/forms.py:228
 | 
			
		||||
#: participation/templates/participation/pool_detail.html:123
 | 
			
		||||
#: participation/templates/participation/tournament_detail.html:119
 | 
			
		||||
msgid "Add"
 | 
			
		||||
msgstr "Ajouter"
 | 
			
		||||
 | 
			
		||||
#: participation/forms.py:240 registration/forms.py:35 registration/forms.py:60
 | 
			
		||||
#: registration/forms.py:91
 | 
			
		||||
msgid "This email address is already used."
 | 
			
		||||
msgstr "Cette adresse e-mail est déjà utilisée."
 | 
			
		||||
 | 
			
		||||
#: participation/forms.py:250
 | 
			
		||||
#: participation/forms.py:251
 | 
			
		||||
msgid "CSV file:"
 | 
			
		||||
msgstr "Tableur au format CSV :"
 | 
			
		||||
 | 
			
		||||
#: participation/forms.py:274
 | 
			
		||||
#: participation/forms.py:275
 | 
			
		||||
msgid ""
 | 
			
		||||
"This file contains non-UTF-8 and non-ISO-8859-1 content. Please send your "
 | 
			
		||||
"sheet as a CSV file."
 | 
			
		||||
@@ -551,30 +542,30 @@ 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:289
 | 
			
		||||
#: participation/forms.py:290
 | 
			
		||||
msgid "Can't determine the pool size. Are you sure your file is correct?"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Impossible de déterminer la taille de la poule. Êtes-vous sûr⋅e que le "
 | 
			
		||||
"fichier est correct ?"
 | 
			
		||||
 | 
			
		||||
#: participation/forms.py:309
 | 
			
		||||
#: participation/forms.py:310
 | 
			
		||||
msgid "The following note is higher of the maximum expected value:"
 | 
			
		||||
msgstr "La note suivante est supérieure au maximum attendu :"
 | 
			
		||||
 | 
			
		||||
#: participation/forms.py:317
 | 
			
		||||
#: participation/forms.py:318
 | 
			
		||||
msgid "The following user was not found:"
 | 
			
		||||
msgstr "L'utilisateur⋅rice suivant n'a pas été trouvé :"
 | 
			
		||||
 | 
			
		||||
#: participation/forms.py:334
 | 
			
		||||
#: participation/forms.py:335
 | 
			
		||||
msgid "The defender, the opponent and the reporter must be different."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Les équipes défenseuse, opposante et rapportrice doivent être différent⋅es."
 | 
			
		||||
 | 
			
		||||
#: participation/forms.py:338
 | 
			
		||||
#: participation/forms.py:339
 | 
			
		||||
msgid "This defender did not work on this problem."
 | 
			
		||||
msgstr "Ce⋅tte défenseur⋅se ne travaille pas sur ce problème."
 | 
			
		||||
 | 
			
		||||
#: participation/forms.py:357
 | 
			
		||||
#: participation/forms.py:358
 | 
			
		||||
msgid "The PDF file must not have more than 2 pages."
 | 
			
		||||
msgstr "Le fichier PDF ne doit pas avoir plus de 2 pages."
 | 
			
		||||
 | 
			
		||||
@@ -1091,7 +1082,6 @@ msgstr "Rejoindre"
 | 
			
		||||
#: participation/templates/participation/passage_detail.html:54
 | 
			
		||||
#: participation/templates/participation/passage_detail.html:120
 | 
			
		||||
#: participation/templates/participation/passage_detail.html:126
 | 
			
		||||
#: participation/templates/participation/pool_add_jurys.html:35
 | 
			
		||||
#: participation/templates/participation/pool_detail.html:110
 | 
			
		||||
#: participation/templates/participation/pool_detail.html:128
 | 
			
		||||
#: participation/templates/participation/pool_detail.html:133
 | 
			
		||||
@@ -1281,37 +1271,6 @@ msgstr "Points de l'équipe observatrice :"
 | 
			
		||||
msgid "Update passage"
 | 
			
		||||
msgstr "Modifier le passage"
 | 
			
		||||
 | 
			
		||||
#: participation/templates/participation/pool_add_jurys.html:9
 | 
			
		||||
msgid "You can here register juries for the pool."
 | 
			
		||||
msgstr "Vous pouvez inscrire ici les juré⋅es de la poule."
 | 
			
		||||
 | 
			
		||||
#: participation/templates/participation/pool_add_jurys.html:10
 | 
			
		||||
msgid ""
 | 
			
		||||
"Be careful: this form register new users. To add existing users into the "
 | 
			
		||||
"jury, please use this form:"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Attention : ce formulaire inscrit des nouvelleaux utilisateur⋅rices. Pour "
 | 
			
		||||
"ajouter des utilisateur⋅rices au jury, utilisez ce formulaire :"
 | 
			
		||||
 | 
			
		||||
#: participation/templates/participation/pool_add_jurys.html:11
 | 
			
		||||
#: participation/templates/participation/pool_add_jurys.html:34
 | 
			
		||||
#: participation/templates/participation/pool_detail.html:127
 | 
			
		||||
#: participation/templates/participation/pool_form.html:11
 | 
			
		||||
msgid "Update pool"
 | 
			
		||||
msgstr "Modifier la poule"
 | 
			
		||||
 | 
			
		||||
#: participation/templates/participation/pool_add_jurys.html:14
 | 
			
		||||
msgid "For now, the registered juries for the tournament are:"
 | 
			
		||||
msgstr "Pour l'instant, les juré⋅es inscrit⋅es au tournoi sont :"
 | 
			
		||||
 | 
			
		||||
#: participation/templates/participation/pool_add_jurys.html:19
 | 
			
		||||
msgid "There is no jury yet."
 | 
			
		||||
msgstr "Il n'y a pas de juré⋅e pour le moment."
 | 
			
		||||
 | 
			
		||||
#: participation/templates/participation/pool_add_jurys.html:30
 | 
			
		||||
msgid "Back to pool detail"
 | 
			
		||||
msgstr "Retour aux détails de la poule"
 | 
			
		||||
 | 
			
		||||
#: participation/templates/participation/pool_detail.html:15
 | 
			
		||||
msgid "Round:"
 | 
			
		||||
msgstr "Tour :"
 | 
			
		||||
@@ -1376,10 +1335,19 @@ msgstr "Modifier les équipes"
 | 
			
		||||
msgid "Passages"
 | 
			
		||||
msgstr "Passages"
 | 
			
		||||
 | 
			
		||||
#: participation/templates/participation/pool_detail.html:127
 | 
			
		||||
#: participation/templates/participation/pool_form.html:11
 | 
			
		||||
msgid "Update pool"
 | 
			
		||||
msgstr "Modifier la poule"
 | 
			
		||||
 | 
			
		||||
#: participation/templates/participation/pool_detail.html:137
 | 
			
		||||
msgid "Upload notes"
 | 
			
		||||
msgstr "Envoyer les notes"
 | 
			
		||||
 | 
			
		||||
#: participation/templates/participation/pool_jury.html:35
 | 
			
		||||
msgid "Back to pool detail"
 | 
			
		||||
msgstr "Retour aux détails de la poule"
 | 
			
		||||
 | 
			
		||||
#: participation/templates/participation/team_detail.html:13
 | 
			
		||||
msgid "Name:"
 | 
			
		||||
msgstr "Nom :"
 | 
			
		||||
@@ -1468,7 +1436,7 @@ msgstr "groupé"
 | 
			
		||||
 | 
			
		||||
#: participation/templates/participation/team_detail.html:140
 | 
			
		||||
#: registration/templates/registration/user_detail.html:163
 | 
			
		||||
#: registration/views.py:460
 | 
			
		||||
#: registration/views.py:464
 | 
			
		||||
msgid "Update payment"
 | 
			
		||||
msgstr "Mettre à jour le paiement"
 | 
			
		||||
 | 
			
		||||
@@ -1527,7 +1495,7 @@ msgid "Invalidate"
 | 
			
		||||
msgstr "Invalider"
 | 
			
		||||
 | 
			
		||||
#: participation/templates/participation/team_detail.html:209
 | 
			
		||||
#: participation/views.py:325
 | 
			
		||||
#: participation/views.py:326
 | 
			
		||||
msgid "Upload motivation letter"
 | 
			
		||||
msgstr "Envoyer la lettre de motivation"
 | 
			
		||||
 | 
			
		||||
@@ -1536,7 +1504,7 @@ msgid "Update team"
 | 
			
		||||
msgstr "Modifier l'équipe"
 | 
			
		||||
 | 
			
		||||
#: participation/templates/participation/team_detail.html:219
 | 
			
		||||
#: participation/views.py:434
 | 
			
		||||
#: participation/views.py:435
 | 
			
		||||
msgid "Leave team"
 | 
			
		||||
msgstr "Quitter l'équipe"
 | 
			
		||||
 | 
			
		||||
@@ -1663,44 +1631,44 @@ msgstr "Modèles :"
 | 
			
		||||
msgid "Warning: non-free format"
 | 
			
		||||
msgstr "Attention : format non libre"
 | 
			
		||||
 | 
			
		||||
#: participation/views.py:54 tfjm/templates/base.html:79
 | 
			
		||||
#: participation/views.py:55 tfjm/templates/base.html:79
 | 
			
		||||
#: tfjm/templates/navbar.html:35
 | 
			
		||||
msgid "Create team"
 | 
			
		||||
msgstr "Créer une équipe"
 | 
			
		||||
 | 
			
		||||
#: participation/views.py:63 participation/views.py:104
 | 
			
		||||
#: participation/views.py:64 participation/views.py:105
 | 
			
		||||
msgid "You don't participate, so you can't create a team."
 | 
			
		||||
msgstr "Vous ne participez pas, vous ne pouvez pas créer d'équipe."
 | 
			
		||||
 | 
			
		||||
#: participation/views.py:65 participation/views.py:106
 | 
			
		||||
#: participation/views.py:66 participation/views.py:107
 | 
			
		||||
msgid "You are already in a team."
 | 
			
		||||
msgstr "Vous êtes déjà dans une équipe."
 | 
			
		||||
 | 
			
		||||
#: participation/views.py:95 tfjm/templates/base.html:74
 | 
			
		||||
#: participation/views.py:96 tfjm/templates/base.html:74
 | 
			
		||||
#: tfjm/templates/navbar.html:40
 | 
			
		||||
msgid "Join team"
 | 
			
		||||
msgstr "Rejoindre une équipe"
 | 
			
		||||
 | 
			
		||||
#: participation/views.py:155 participation/views.py:472
 | 
			
		||||
#: participation/views.py:156 participation/views.py:473
 | 
			
		||||
msgid "You don't participate, so you don't have any team."
 | 
			
		||||
msgstr "Vous ne participez pas, vous n'avez donc pas d'équipe."
 | 
			
		||||
 | 
			
		||||
#: participation/views.py:181
 | 
			
		||||
#: participation/views.py:182
 | 
			
		||||
#, python-brace-format
 | 
			
		||||
msgid "Detail of team {trigram}"
 | 
			
		||||
msgstr "Détails de l'équipe {trigram}"
 | 
			
		||||
 | 
			
		||||
#: participation/views.py:210
 | 
			
		||||
#: participation/views.py:211
 | 
			
		||||
msgid "You don't participate, so you can't request the validation of the team."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Vous ne participez pas, vous ne pouvez pas demander la validation de "
 | 
			
		||||
"l'équipe."
 | 
			
		||||
 | 
			
		||||
#: participation/views.py:213
 | 
			
		||||
#: participation/views.py:214
 | 
			
		||||
msgid "The validation of the team is already done or pending."
 | 
			
		||||
msgstr "La validation de l'équipe est déjà faite ou en cours."
 | 
			
		||||
 | 
			
		||||
#: participation/views.py:216
 | 
			
		||||
#: participation/views.py:217
 | 
			
		||||
msgid ""
 | 
			
		||||
"The team can't be validated: missing email address confirmations, "
 | 
			
		||||
"authorizations, people, motivation letter or the tournament is not set."
 | 
			
		||||
@@ -1709,108 +1677,117 @@ 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:238
 | 
			
		||||
#: participation/views.py:239
 | 
			
		||||
msgid "You are not an organizer of the tournament."
 | 
			
		||||
msgstr "Vous n'êtes pas un⋅e organisateur⋅rice du tournoi."
 | 
			
		||||
 | 
			
		||||
#: participation/views.py:241
 | 
			
		||||
#: participation/views.py:242
 | 
			
		||||
msgid "This team has no pending validation."
 | 
			
		||||
msgstr "L'équipe n'a pas de validation en attente."
 | 
			
		||||
 | 
			
		||||
#: participation/views.py:268
 | 
			
		||||
#: participation/views.py:269
 | 
			
		||||
msgid "You must specify if you validate the registration or not."
 | 
			
		||||
msgstr "Vous devez spécifier si vous validez l'inscription ou non."
 | 
			
		||||
 | 
			
		||||
#: participation/views.py:303
 | 
			
		||||
#: participation/views.py:304
 | 
			
		||||
#, python-brace-format
 | 
			
		||||
msgid "Update team {trigram}"
 | 
			
		||||
msgstr "Mise à jour de l'équipe {trigram}"
 | 
			
		||||
 | 
			
		||||
#: participation/views.py:364 participation/views.py:420
 | 
			
		||||
#: participation/views.py:365 participation/views.py:421
 | 
			
		||||
#, python-brace-format
 | 
			
		||||
msgid "Motivation letter of {team}.{ext}"
 | 
			
		||||
msgstr "Lettre de motivation de {team}.{ext}"
 | 
			
		||||
 | 
			
		||||
#: participation/views.py:395
 | 
			
		||||
#: participation/views.py:396
 | 
			
		||||
#, python-brace-format
 | 
			
		||||
msgid "Photo authorization of {participant}.{ext}"
 | 
			
		||||
msgstr "Autorisation de droit à l'image de {participant}.{ext}"
 | 
			
		||||
 | 
			
		||||
#: participation/views.py:401
 | 
			
		||||
#: participation/views.py:402
 | 
			
		||||
#, python-brace-format
 | 
			
		||||
msgid "Parental authorization of {participant}.{ext}"
 | 
			
		||||
msgstr "Autorisation parentale de {participant}.{ext}"
 | 
			
		||||
 | 
			
		||||
#: participation/views.py:408
 | 
			
		||||
#: participation/views.py:409
 | 
			
		||||
#, python-brace-format
 | 
			
		||||
msgid "Health sheet of {participant}.{ext}"
 | 
			
		||||
msgstr "Fiche sanitaire de {participant}.{ext}"
 | 
			
		||||
 | 
			
		||||
#: participation/views.py:414
 | 
			
		||||
#: participation/views.py:415
 | 
			
		||||
#, python-brace-format
 | 
			
		||||
msgid "Vaccine sheet of {participant}.{ext}"
 | 
			
		||||
msgstr "Carnet de vaccination de {participant}.{ext}"
 | 
			
		||||
 | 
			
		||||
#: participation/views.py:424
 | 
			
		||||
#: participation/views.py:425
 | 
			
		||||
#, python-brace-format
 | 
			
		||||
msgid "Photo authorizations of team {trigram}.zip"
 | 
			
		||||
msgstr "Autorisations de droit à l'image de l'équipe {trigram}.zip"
 | 
			
		||||
 | 
			
		||||
#: participation/views.py:442
 | 
			
		||||
#: participation/views.py:443
 | 
			
		||||
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/views.py:486
 | 
			
		||||
#: participation/views.py:487
 | 
			
		||||
msgid "The team is not validated yet."
 | 
			
		||||
msgstr "L'équipe n'est pas encore validée."
 | 
			
		||||
 | 
			
		||||
#: participation/views.py:500
 | 
			
		||||
#: participation/views.py:501
 | 
			
		||||
#, python-brace-format
 | 
			
		||||
msgid "Participation of team {trigram}"
 | 
			
		||||
msgstr "Participation de l'équipe {trigram}"
 | 
			
		||||
 | 
			
		||||
#: participation/views.py:581
 | 
			
		||||
#: participation/views.py:582
 | 
			
		||||
#, python-brace-format
 | 
			
		||||
msgid "Payments of {tournament}"
 | 
			
		||||
msgstr "Paiements de {tournament}"
 | 
			
		||||
 | 
			
		||||
#: participation/views.py:661
 | 
			
		||||
#: participation/views.py:663
 | 
			
		||||
msgid "You can't upload a solution after the deadline."
 | 
			
		||||
msgstr "Vous ne pouvez pas envoyer de solution après la date limite."
 | 
			
		||||
 | 
			
		||||
#: participation/views.py:769
 | 
			
		||||
#: participation/views.py:771
 | 
			
		||||
#, python-brace-format
 | 
			
		||||
msgid "Solutions for pool {pool} of tournament {tournament}.zip"
 | 
			
		||||
msgstr "Solutions pour la poule {pool} du tournoi {tournament}.zip"
 | 
			
		||||
 | 
			
		||||
#: participation/views.py:770
 | 
			
		||||
#: participation/views.py:772
 | 
			
		||||
#, python-brace-format
 | 
			
		||||
msgid "Syntheses for pool {pool} of tournament {tournament}.zip"
 | 
			
		||||
msgstr "Notes de synthèses pour la poule {pool} du tournoi {tournament}.zip"
 | 
			
		||||
 | 
			
		||||
#: participation/views.py:788
 | 
			
		||||
#: participation/views.py:798
 | 
			
		||||
#, python-brace-format
 | 
			
		||||
msgid "Jurys of {pool}"
 | 
			
		||||
msgstr "Juré⋅es de la {pool}"
 | 
			
		||||
msgid "Jury of pool {pool} for {tournament} with teams {teams}"
 | 
			
		||||
msgstr "Jury de la poule {pool} pour {tournament} avec les équipes {teams}"
 | 
			
		||||
 | 
			
		||||
#: participation/views.py:815
 | 
			
		||||
#: participation/views.py:814
 | 
			
		||||
msgid "This user already exists, but is a participant."
 | 
			
		||||
msgstr "Cet⋅te utilisateur⋅rice existe déjà, mais en tant que participant⋅e."
 | 
			
		||||
 | 
			
		||||
#: participation/views.py:833
 | 
			
		||||
msgid "New TFJM² jury account"
 | 
			
		||||
msgstr "Nouveau compte de juré⋅e pour le TFJM²"
 | 
			
		||||
 | 
			
		||||
#: participation/views.py:828
 | 
			
		||||
#: participation/views.py:850
 | 
			
		||||
#, python-brace-format
 | 
			
		||||
msgid "The jury {name} has been successfully added!"
 | 
			
		||||
msgstr "{name} a été ajouté⋅e avec succès en tant que juré⋅e !"
 | 
			
		||||
 | 
			
		||||
#: participation/views.py:865
 | 
			
		||||
#: participation/views.py:882
 | 
			
		||||
#, python-brace-format
 | 
			
		||||
msgid "The jury {name} has been successfully removed!"
 | 
			
		||||
msgstr "{name} a été retiré⋅e avec succès du jury !"
 | 
			
		||||
 | 
			
		||||
#: participation/views.py:910
 | 
			
		||||
msgid "The following user is not registered as a jury:"
 | 
			
		||||
msgstr "L'utilisateur⋅rice suivant n'est pas inscrit⋅e en tant que juré⋅e :"
 | 
			
		||||
 | 
			
		||||
#: participation/views.py:879
 | 
			
		||||
#: participation/views.py:924
 | 
			
		||||
msgid "Notes were successfully uploaded."
 | 
			
		||||
msgstr "Les notes ont bien été envoyées."
 | 
			
		||||
 | 
			
		||||
#: participation/views.py:1543
 | 
			
		||||
#: participation/views.py:1588
 | 
			
		||||
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."
 | 
			
		||||
 | 
			
		||||
@@ -1853,6 +1830,10 @@ msgstr "participant⋅e"
 | 
			
		||||
msgid "coach"
 | 
			
		||||
msgstr "encadrant⋅e"
 | 
			
		||||
 | 
			
		||||
#: registration/forms.py:35 registration/forms.py:60 registration/forms.py:91
 | 
			
		||||
msgid "This email address is already used."
 | 
			
		||||
msgstr "Cette adresse e-mail est déjà utilisée."
 | 
			
		||||
 | 
			
		||||
#: registration/forms.py:228
 | 
			
		||||
msgid "Pending"
 | 
			
		||||
msgstr "En attente"
 | 
			
		||||
@@ -2610,8 +2591,9 @@ msgid ""
 | 
			
		||||
"You must pay %(amount)s € for your participation in the team %(team)s for "
 | 
			
		||||
"the tournament %(tournament)s. This includes the housing and the meals."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Vous devez payer %(amount)s € pour votre participation dans l'équipe %(team)s "
 | 
			
		||||
"pour le tournoi %(tournament)s. Cela comprend l'hébergement et les repas."
 | 
			
		||||
"Vous devez payer %(amount)s € pour votre participation dans l'équipe "
 | 
			
		||||
"%(team)s pour le tournoi %(tournament)s. Cela comprend l'hébergement et les "
 | 
			
		||||
"repas."
 | 
			
		||||
 | 
			
		||||
#: registration/templates/registration/payment_form.html:18
 | 
			
		||||
msgid ""
 | 
			
		||||
@@ -3032,11 +3014,11 @@ msgstr "Détails de l'utilisateur⋅rice {user}"
 | 
			
		||||
msgid "Update user {user}"
 | 
			
		||||
msgstr "Mise à jour de l'utilisateur⋅rice {user}"
 | 
			
		||||
 | 
			
		||||
#: registration/views.py:482 registration/views.py:516
 | 
			
		||||
#: registration/views.py:486 registration/views.py:520
 | 
			
		||||
msgid "This payment is already valid or pending validation."
 | 
			
		||||
msgstr "Le paiement est déjà validé ou en attente de validation."
 | 
			
		||||
 | 
			
		||||
#: registration/views.py:508
 | 
			
		||||
#: registration/views.py:512
 | 
			
		||||
msgid ""
 | 
			
		||||
"Since one payment is already validated, or pending validation, grouping is "
 | 
			
		||||
"not possible."
 | 
			
		||||
@@ -3044,34 +3026,34 @@ msgstr ""
 | 
			
		||||
"Puisque un paiement est déjà validé, ou en attente de validation, le "
 | 
			
		||||
"regroupement n'est pas possible."
 | 
			
		||||
 | 
			
		||||
#: registration/views.py:583
 | 
			
		||||
#: registration/views.py:587
 | 
			
		||||
msgid "The payment is already valid or pending validation."
 | 
			
		||||
msgstr "Le paiement est déjà validé ou en attente de validation."
 | 
			
		||||
 | 
			
		||||
#: registration/views.py:597
 | 
			
		||||
#: registration/views.py:601
 | 
			
		||||
msgid "The payment is not found or is already validated."
 | 
			
		||||
msgstr "Le paiement n'est pas trouvé ou déjà validé."
 | 
			
		||||
 | 
			
		||||
#: registration/views.py:616
 | 
			
		||||
#: registration/views.py:620
 | 
			
		||||
#, python-brace-format
 | 
			
		||||
msgid "An error occurred during the payment: {error}"
 | 
			
		||||
msgstr "Une erreur est survenue lors du paiement : {error}"
 | 
			
		||||
 | 
			
		||||
#: registration/views.py:622
 | 
			
		||||
#: registration/views.py:626
 | 
			
		||||
msgid "The payment has been refused."
 | 
			
		||||
msgstr "Le paiement a été refusé."
 | 
			
		||||
 | 
			
		||||
#: registration/views.py:625
 | 
			
		||||
#: registration/views.py:629
 | 
			
		||||
#, python-brace-format
 | 
			
		||||
msgid "The return code is unknown: {code}"
 | 
			
		||||
msgstr "Le code de retour est inconnu : {code}"
 | 
			
		||||
 | 
			
		||||
#: registration/views.py:628
 | 
			
		||||
#: registration/views.py:632
 | 
			
		||||
#, python-brace-format
 | 
			
		||||
msgid "The return type is unknown: {type}"
 | 
			
		||||
msgstr "Le type de retour est inconnu : {type}"
 | 
			
		||||
 | 
			
		||||
#: registration/views.py:637
 | 
			
		||||
#: registration/views.py:641
 | 
			
		||||
msgid ""
 | 
			
		||||
"The payment has been successfully validated! Your registration is now "
 | 
			
		||||
"complete."
 | 
			
		||||
@@ -3079,7 +3061,7 @@ msgstr ""
 | 
			
		||||
"Le paiement a été validé avec succès ! Votre inscription est désormais "
 | 
			
		||||
"complète."
 | 
			
		||||
 | 
			
		||||
#: registration/views.py:644
 | 
			
		||||
#: registration/views.py:648
 | 
			
		||||
msgid ""
 | 
			
		||||
"Your payment is done! The validation of your payment may takes a few "
 | 
			
		||||
"minutes, and will be automatically done. If it is not the case, please "
 | 
			
		||||
@@ -3089,27 +3071,27 @@ msgstr ""
 | 
			
		||||
"quelques minutes, et sera faite automatiquement. Si ce n'est pas le cas, "
 | 
			
		||||
"merci de nous contacter."
 | 
			
		||||
 | 
			
		||||
#: registration/views.py:675
 | 
			
		||||
#: registration/views.py:679
 | 
			
		||||
#, python-brace-format
 | 
			
		||||
msgid "Photo authorization of {student}.{ext}"
 | 
			
		||||
msgstr "Autorisation de droit à l'image de {student}.{ext}"
 | 
			
		||||
 | 
			
		||||
#: registration/views.py:699
 | 
			
		||||
#: registration/views.py:703
 | 
			
		||||
#, python-brace-format
 | 
			
		||||
msgid "Health sheet of {student}.{ext}"
 | 
			
		||||
msgstr "Fiche sanitaire de {student}.{ext}"
 | 
			
		||||
 | 
			
		||||
#: registration/views.py:723
 | 
			
		||||
#: registration/views.py:727
 | 
			
		||||
#, python-brace-format
 | 
			
		||||
msgid "Vaccine sheet of {student}.{ext}"
 | 
			
		||||
msgstr "Carnet de vaccination de {student}.{ext}"
 | 
			
		||||
 | 
			
		||||
#: registration/views.py:747
 | 
			
		||||
#: registration/views.py:751
 | 
			
		||||
#, python-brace-format
 | 
			
		||||
msgid "Parental authorization of {student}.{ext}"
 | 
			
		||||
msgstr "Autorisation parentale de {student}.{ext}"
 | 
			
		||||
 | 
			
		||||
#: registration/views.py:771
 | 
			
		||||
#: registration/views.py:775
 | 
			
		||||
#, python-brace-format
 | 
			
		||||
msgid "Payment receipt of {registrations}.{ext}"
 | 
			
		||||
msgstr "Justificatif de paiement de {registrations}.{ext}"
 | 
			
		||||
@@ -3275,11 +3257,3 @@ msgstr "Aucun résultat."
 | 
			
		||||
#: tfjm/templates/sidebar.html:10 tfjm/templates/sidebar.html:21
 | 
			
		||||
msgid "Informations"
 | 
			
		||||
msgstr "Informations"
 | 
			
		||||
 | 
			
		||||
#, python-format
 | 
			
		||||
#~ msgid ""
 | 
			
		||||
#~ "We successfully received the payment of %(amount)s € for the TFJM² "
 | 
			
		||||
#~ "registration in the team %(team)s!"
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "Nous avons bien reçu le paiement de %(amount)s € pour l'inscription au "
 | 
			
		||||
#~ "TFJM² dans l'équipe %(team)s !"
 | 
			
		||||
 
 | 
			
		||||
@@ -6,9 +6,8 @@ from io import StringIO
 | 
			
		||||
import re
 | 
			
		||||
from typing import Iterable
 | 
			
		||||
 | 
			
		||||
from crispy_forms.bootstrap import InlineField
 | 
			
		||||
from crispy_forms.helper import FormHelper
 | 
			
		||||
from crispy_forms.layout import Div, Fieldset, Submit
 | 
			
		||||
from crispy_forms.layout import Div, Submit, Field
 | 
			
		||||
from django import forms
 | 
			
		||||
from django.contrib.auth.models import User
 | 
			
		||||
from django.core.exceptions import ValidationError
 | 
			
		||||
@@ -206,25 +205,28 @@ class PoolTeamsForm(forms.ModelForm):
 | 
			
		||||
class AddJuryForm(forms.ModelForm):
 | 
			
		||||
    def __init__(self, *args, **kwargs):
 | 
			
		||||
        super().__init__(*args, **kwargs)
 | 
			
		||||
        self.fields['first_name'].required = True
 | 
			
		||||
        self.fields['last_name'].required = True
 | 
			
		||||
        self.fields['email'].required = True
 | 
			
		||||
        self.helper = FormHelper()
 | 
			
		||||
        self.helper.form_class = 'form-inline'
 | 
			
		||||
        self.helper.layout = Div(
 | 
			
		||||
            Div(
 | 
			
		||||
                Div(
 | 
			
		||||
                    InlineField('first_name', autofocus="autofocus"),
 | 
			
		||||
                    Field('first_name', autofocus="autofocus"),
 | 
			
		||||
                    css_class='col-md-3',
 | 
			
		||||
                ),
 | 
			
		||||
                Div(
 | 
			
		||||
                    InlineField('last_name'),
 | 
			
		||||
                    Field('last_name'),
 | 
			
		||||
                    css_class='col-md-3',
 | 
			
		||||
                ),
 | 
			
		||||
                Div(
 | 
			
		||||
                    InlineField('email'),
 | 
			
		||||
                    Field('email'),
 | 
			
		||||
                    css_class='col-md-5',
 | 
			
		||||
                ),
 | 
			
		||||
                Div(
 | 
			
		||||
                    Submit('submit', _("Add")),
 | 
			
		||||
                    css_class='col-md-1',
 | 
			
		||||
                    css_class='col-md-1 py-md-4',
 | 
			
		||||
                ),
 | 
			
		||||
                css_class='row',
 | 
			
		||||
            )
 | 
			
		||||
@@ -236,7 +238,7 @@ class AddJuryForm(forms.ModelForm):
 | 
			
		||||
        """
 | 
			
		||||
        email = self.data["email"]
 | 
			
		||||
        if User.objects.filter(email=email).exists():
 | 
			
		||||
            self.add_error("email", _("This email address is already used."))
 | 
			
		||||
            self.instance = User.objects.get(email=email)
 | 
			
		||||
        return email
 | 
			
		||||
 | 
			
		||||
    class Meta:
 | 
			
		||||
 
 | 
			
		||||
@@ -1,47 +0,0 @@
 | 
			
		||||
{% extends "base.html" %}
 | 
			
		||||
 | 
			
		||||
{% load crispy_forms_tags %}
 | 
			
		||||
{% load i18n %}
 | 
			
		||||
 | 
			
		||||
{% block content %}
 | 
			
		||||
    <div class="alert alert-info">
 | 
			
		||||
        <p>
 | 
			
		||||
            {% trans "You can here register juries for the pool." %}
 | 
			
		||||
            {% trans "Be careful: this form register new users. To add existing users into the jury, please use this form:" %}
 | 
			
		||||
            <button class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#updatePoolModal">{% trans "Update pool" %}</button>
 | 
			
		||||
        </p>
 | 
			
		||||
        <p>
 | 
			
		||||
            {% trans "For now, the registered juries for the tournament are:" %}
 | 
			
		||||
            <ul>
 | 
			
		||||
                {% for jury in pool.juries.all %}
 | 
			
		||||
                    <li>{{ jury.user.first_name }} {{ jury.user.last_name }} (<a class="alert-link" href="mailto:{{ jury.user.email }}">{{ jury.user.email }}</a>)</li>
 | 
			
		||||
                {% empty %}
 | 
			
		||||
                    <li><i>{% trans "There is no jury yet." %}</i></li>
 | 
			
		||||
                {% endfor %}
 | 
			
		||||
            </ul>
 | 
			
		||||
        </p>
 | 
			
		||||
    </div>
 | 
			
		||||
    {% crispy form %}
 | 
			
		||||
 | 
			
		||||
    <hr>
 | 
			
		||||
 | 
			
		||||
    <div class="row text-center">
 | 
			
		||||
    <a href="{% url 'participation:pool_detail' pk=pool.pk %}" class="btn btn-secondary">
 | 
			
		||||
        <i class="fas fa-arrow-left"></i> {% trans "Back to pool detail" %}
 | 
			
		||||
    </a>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    {% trans "Update pool" as modal_title %}
 | 
			
		||||
    {% trans "Update" as modal_button %}
 | 
			
		||||
    {% url "participation:pool_update" pk=pool.pk as modal_action %}
 | 
			
		||||
    {% include "base_modal.html" with modal_id="updatePool" %}
 | 
			
		||||
{% endblock %}
 | 
			
		||||
 | 
			
		||||
{% block extrajavascript %}
 | 
			
		||||
    <script>
 | 
			
		||||
        document.addEventListener('DOMContentLoaded', () => {
 | 
			
		||||
            initModal("updatePool", "{% url "participation:pool_update" pk=pool.pk %}")
 | 
			
		||||
        })
 | 
			
		||||
    </script>
 | 
			
		||||
{% endblock %}
 | 
			
		||||
 | 
			
		||||
@@ -28,7 +28,7 @@
 | 
			
		||||
                <dt class="col-sm-3">{% trans "Juries:" %}</dt>
 | 
			
		||||
                <dd class="col-sm-9">
 | 
			
		||||
                    {{ pool.juries.all|join:", " }}
 | 
			
		||||
                    <a class="badge rounded-pill text-bg-info" href="{% url 'participation:pool_add_jurys' pk=pool.pk %}">
 | 
			
		||||
                    <a class="badge rounded-pill text-bg-info" href="{% url 'participation:pool_jury' pk=pool.pk %}">
 | 
			
		||||
                        <i class="fas fa-plus"></i> {% trans "Add jurys" %}
 | 
			
		||||
                    </a>
 | 
			
		||||
                </dd>
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										47
									
								
								participation/templates/participation/pool_jury.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								participation/templates/participation/pool_jury.html
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,47 @@
 | 
			
		||||
{% extends "base.html" %}
 | 
			
		||||
 | 
			
		||||
{% load crispy_forms_tags crispy_forms_filters %}
 | 
			
		||||
{% load i18n %}
 | 
			
		||||
 | 
			
		||||
{% block content %}
 | 
			
		||||
    <hr>
 | 
			
		||||
 | 
			
		||||
    {% for jury in pool.juries.all %}
 | 
			
		||||
        <div class="row my-3">
 | 
			
		||||
            <div class="col-md-3">
 | 
			
		||||
                <input type="text" class="form-control" value="{{ jury.user.first_name }}" disabled>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="col-md-3">
 | 
			
		||||
                <input type="text" class="form-control" value="{{ jury.user.last_name }}" disabled>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="col-md-5">
 | 
			
		||||
                <input type="email" class="form-control" value="{{ jury.user.email }}" disabled>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="col-md-1">
 | 
			
		||||
                <a href="{% url 'participation:pool_remove_jury' pk=pool.pk  jury_id=jury.id %}" class="btn btn-danger">
 | 
			
		||||
                    Retirer
 | 
			
		||||
                </a>
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
    {% endfor %}
 | 
			
		||||
 | 
			
		||||
    {{ form|as_crispy_errors }}
 | 
			
		||||
    {% crispy form %}
 | 
			
		||||
 | 
			
		||||
    <hr>
 | 
			
		||||
 | 
			
		||||
    <div class="row text-center">
 | 
			
		||||
        <a href="{% url 'participation:pool_detail' pk=pool.pk %}" class="btn btn-secondary">
 | 
			
		||||
            <i class="fas fa-arrow-left"></i> {% trans "Back to pool detail" %}
 | 
			
		||||
        </a>
 | 
			
		||||
    </div>
 | 
			
		||||
{% endblock %}
 | 
			
		||||
 | 
			
		||||
{% block extrajavascript %}
 | 
			
		||||
    <script>
 | 
			
		||||
        document.addEventListener('DOMContentLoaded', () => {
 | 
			
		||||
            initModal("updatePool", "{% url "participation:pool_update" pk=pool.pk %}")
 | 
			
		||||
        })
 | 
			
		||||
    </script>
 | 
			
		||||
{% endblock %}
 | 
			
		||||
 | 
			
		||||
@@ -6,11 +6,11 @@ from django.views.generic import TemplateView
 | 
			
		||||
 | 
			
		||||
from .views import CreateTeamView, FinalNotationSheetTemplateView, JoinTeamView, MyParticipationDetailView, \
 | 
			
		||||
    MyTeamDetailView, NoteUpdateView, ParticipationDetailView, PassageCreateView, PassageDetailView, \
 | 
			
		||||
    PassageUpdateView, PoolAddJurysView, PoolCreateView, PoolDetailView, PoolDownloadView, PoolNotesTemplateView, \
 | 
			
		||||
    PoolUpdateTeamsView, PoolUpdateView, PoolUploadNotesView, ScaleNotationSheetTemplateView, SolutionUploadView, \
 | 
			
		||||
    SynthesisUploadView, TeamAuthorizationsView, TeamDetailView, TeamLeaveView, TeamListView, TeamUpdateView, \
 | 
			
		||||
    TeamUploadMotivationLetterView, TournamentCreateView, TournamentDetailView, TournamentExportCSVView, \
 | 
			
		||||
    TournamentListView, TournamentPaymentsView, TournamentUpdateView
 | 
			
		||||
    PassageUpdateView, PoolCreateView, PoolDetailView, PoolDownloadView, PoolJuryView, PoolNotesTemplateView, \
 | 
			
		||||
    PoolRemoveJuryView, PoolUpdateTeamsView, PoolUpdateView, PoolUploadNotesView, ScaleNotationSheetTemplateView, \
 | 
			
		||||
    SolutionUploadView, SynthesisUploadView, TeamAuthorizationsView, TeamDetailView, TeamLeaveView, TeamListView, \
 | 
			
		||||
    TeamUpdateView, TeamUploadMotivationLetterView, TournamentCreateView, TournamentDetailView, \
 | 
			
		||||
    TournamentExportCSVView, TournamentListView, TournamentPaymentsView, TournamentUpdateView
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
app_name = "participation"
 | 
			
		||||
@@ -43,7 +43,8 @@ urlpatterns = [
 | 
			
		||||
    path("pools/<int:pk>/notation/scale/", ScaleNotationSheetTemplateView.as_view(), name="pool_scale_note_sheet"),
 | 
			
		||||
    path("pools/<int:pk>/notation/final/", FinalNotationSheetTemplateView.as_view(), name="pool_final_note_sheet"),
 | 
			
		||||
    path("pools/<int:pk>/update-teams/", PoolUpdateTeamsView.as_view(), name="pool_update_teams"),
 | 
			
		||||
    path("pools/<int:pk>/add-jurys/", PoolAddJurysView.as_view(), name="pool_add_jurys"),
 | 
			
		||||
    path("pools/<int:pk>/jury/", PoolJuryView.as_view(), name="pool_jury"),
 | 
			
		||||
    path("pools/<int:pk>/jury/remove/<int:jury_id>/", PoolRemoveJuryView.as_view(), name="pool_remove_jury"),
 | 
			
		||||
    path("pools/<int:pk>/upload-notes/", PoolUploadNotesView.as_view(), name="pool_upload_notes"),
 | 
			
		||||
    path("pools/<int:pk>/upload-notes/template/", PoolNotesTemplateView.as_view(), name="pool_notes_template"),
 | 
			
		||||
    path("pools/passages/add/<int:pk>/", PassageCreateView.as_view(), name="passage_create"),
 | 
			
		||||
 
 | 
			
		||||
@@ -12,6 +12,7 @@ from zipfile import ZipFile
 | 
			
		||||
from django.conf import settings
 | 
			
		||||
from django.contrib import messages
 | 
			
		||||
from django.contrib.auth.mixins import LoginRequiredMixin
 | 
			
		||||
from django.contrib.auth.models import User
 | 
			
		||||
from django.contrib.sites.models import Site
 | 
			
		||||
from django.core.exceptions import PermissionDenied
 | 
			
		||||
from django.core.mail import send_mail
 | 
			
		||||
@@ -776,34 +777,50 @@ class PoolDownloadView(VolunteerMixin, DetailView):
 | 
			
		||||
        return response
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class PoolAddJurysView(VolunteerMixin, FormView, DetailView):
 | 
			
		||||
class PoolJuryView(VolunteerMixin, FormView, DetailView):
 | 
			
		||||
    """
 | 
			
		||||
    This view lets organizers set jurys for a pool, without multiplying clicks.
 | 
			
		||||
    """
 | 
			
		||||
    model = Pool
 | 
			
		||||
    form_class = AddJuryForm
 | 
			
		||||
    template_name = 'participation/pool_add_jurys.html'
 | 
			
		||||
    template_name = 'participation/pool_jury.html'
 | 
			
		||||
 | 
			
		||||
    def dispatch(self, request, *args, **kwargs):
 | 
			
		||||
        if not request.user.is_authenticated:
 | 
			
		||||
            return self.handle_no_permission()
 | 
			
		||||
        if request.user.registration.is_admin or request.user.registration.is_volunteer \
 | 
			
		||||
                and self.get_object().tournament in request.user.registration.organized_tournaments.all():
 | 
			
		||||
            return super().dispatch(request, *args, **kwargs)
 | 
			
		||||
        return self.handle_no_permission()
 | 
			
		||||
 | 
			
		||||
    def get_context_data(self, **kwargs):
 | 
			
		||||
        context = super().get_context_data(**kwargs)
 | 
			
		||||
        context['title'] = _("Jurys of {pool}").format(pool=self.object)
 | 
			
		||||
        context['title'] = _("Jury of pool {pool} for {tournament} with teams {teams}") \
 | 
			
		||||
            .format(pool=f"{self.object.get_letter_display()}{self.object.round}",
 | 
			
		||||
                    tournament=self.object.tournament.name,
 | 
			
		||||
                    teams=", ".join(participation.team.trigram for participation in self.object.participations.all()))
 | 
			
		||||
        return context
 | 
			
		||||
 | 
			
		||||
    @transaction.atomic
 | 
			
		||||
    def form_valid(self, form):
 | 
			
		||||
        self.object = self.get_object()
 | 
			
		||||
 | 
			
		||||
        user = form.instance
 | 
			
		||||
        if user.id:
 | 
			
		||||
            # The user already exists, so we don't recreate it
 | 
			
		||||
            user.refresh_from_db()
 | 
			
		||||
            reg = user.registration
 | 
			
		||||
            if reg.participates:
 | 
			
		||||
                form.add_error(None, _("This user already exists, but is a participant."))
 | 
			
		||||
                return self.form_invalid(form)
 | 
			
		||||
        else:
 | 
			
		||||
            # Save the user object first
 | 
			
		||||
            form.save()
 | 
			
		||||
        user = form.instance
 | 
			
		||||
            # Create associated registration object to the new user
 | 
			
		||||
            reg = VolunteerRegistration.objects.create(
 | 
			
		||||
                user=user,
 | 
			
		||||
                professional_activity="Juré⋅e du tournoi " + self.object.tournament.name,
 | 
			
		||||
            )
 | 
			
		||||
        # Add the user in the jury
 | 
			
		||||
        self.object.juries.add(reg)
 | 
			
		||||
        self.object.save()
 | 
			
		||||
 | 
			
		||||
            reg.send_email_validation_link()
 | 
			
		||||
 | 
			
		||||
@@ -825,6 +842,10 @@ class PoolAddJurysView(VolunteerMixin, FormView, DetailView):
 | 
			
		||||
                                                                                  domain=site.domain))
 | 
			
		||||
            user.email_user(subject, message, html_message=html)
 | 
			
		||||
 | 
			
		||||
        # Add the user in the jury
 | 
			
		||||
        self.object.juries.add(reg)
 | 
			
		||||
        self.object.save()
 | 
			
		||||
 | 
			
		||||
        # Add notification
 | 
			
		||||
        messages.success(self.request, _("The jury {name} has been successfully added!")
 | 
			
		||||
                         .format(name=f"{user.first_name} {user.last_name}"))
 | 
			
		||||
@@ -837,7 +858,30 @@ class PoolAddJurysView(VolunteerMixin, FormView, DetailView):
 | 
			
		||||
        return super().form_invalid(form)
 | 
			
		||||
 | 
			
		||||
    def get_success_url(self):
 | 
			
		||||
        return reverse_lazy('participation:pool_add_jurys', args=(self.kwargs['pk'],))
 | 
			
		||||
        return reverse_lazy('participation:pool_jury', args=(self.kwargs['pk'],))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class PoolRemoveJuryView(VolunteerMixin, DetailView):
 | 
			
		||||
    model = Pool
 | 
			
		||||
 | 
			
		||||
    def dispatch(self, request, *args, **kwargs):
 | 
			
		||||
        if not request.user.is_authenticated:
 | 
			
		||||
            return self.handle_no_permission()
 | 
			
		||||
        if request.user.registration.is_admin or request.user.registration.is_volunteer \
 | 
			
		||||
                and self.get_object().tournament in request.user.registration.organized_tournaments.all():
 | 
			
		||||
            return super().dispatch(request, *args, **kwargs)
 | 
			
		||||
        return self.handle_no_permission()
 | 
			
		||||
 | 
			
		||||
    def get(self, request, *args, **kwargs):
 | 
			
		||||
        pool = self.get_object()
 | 
			
		||||
        if not pool.juries.filter(pk=kwargs['jury_id']).exists():
 | 
			
		||||
            raise Http404
 | 
			
		||||
        jury = pool.juries.get(pk=kwargs['jury_id'])
 | 
			
		||||
        pool.juries.remove(jury)
 | 
			
		||||
        pool.save()
 | 
			
		||||
        messages.success(request, _("The jury {name} has been successfully removed!")
 | 
			
		||||
                         .format(name=f"{jury.user.first_name} {jury.user.last_name}"))
 | 
			
		||||
        return redirect(reverse_lazy('participation:pool_jury', args=(pool.pk,)))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class PoolUploadNotesView(VolunteerMixin, FormView, DetailView):
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user