First ETEAM adjustments

Signed-off-by: Emmy D'Anello <emmy.danello@animath.fr>
This commit is contained in:
Emmy D'Anello 2024-06-07 14:18:25 +02:00
parent 872009894d
commit 08ad4f3888
Signed by: ynerant
GPG Key ID: 3A75C55819C8CF85
6 changed files with 216 additions and 172 deletions

View File

@ -929,7 +929,7 @@ class DrawConsumer(AsyncJsonWebsocketConsumer):
td.purposed = None td.purposed = None
await td.asave() await td.asave()
remaining = len(settings.PROBLEMS) - 5 - len(td.rejected) remaining = len(settings.PROBLEMS) - settings.RECOMMENDED_SOLUTIONS_COUNT - len(td.rejected)
# Update messages # Update messages
trigram = td.participation.team.trigram trigram = td.participation.team.trigram

View File

@ -147,10 +147,10 @@ class Draw(models.Model):
else: else:
# The problem can be rejected # The problem can be rejected
s += "Elle peut décider d'accepter ou de refuser ce problème. " s += "Elle peut décider d'accepter ou de refuser ce problème. "
if len(td.rejected) >= len(settings.PROBLEMS) - 5: if len(td.rejected) >= len(settings.PROBLEMS) - settings.RECOMMENDED_SOLUTIONS_COUNT:
s += "Refuser ce problème ajoutera une nouvelle pénalité de 25 % sur le coefficient de l'oral de la défense." s += "Refuser ce problème ajoutera une nouvelle pénalité de 25 % sur le coefficient de l'oral de la défense."
else: else:
s += f"Il reste {len(settings.PROBLEMS) - 5 - len(td.rejected)} refus sans pénalité." s += f"Il reste {len(settings.PROBLEMS) - settings.RECOMMENDED_SOLUTIONS_COUNT - len(td.rejected)} refus sans pénalité."
case 'WAITING_FINAL': case 'WAITING_FINAL':
# We are between the two rounds of the final tournament # We are between the two rounds of the final tournament
s += "Le tirage au sort pour le tour 2 aura lieu à la fin du premier tour. Bon courage !" s += "Le tirage au sort pour le tour 2 aura lieu à la fin du premier tour. Bon courage !"
@ -193,10 +193,10 @@ class Round(models.Model):
choices=[ choices=[
(1, _('Round 1')), (1, _('Round 1')),
(2, _('Round 2')), (2, _('Round 2')),
], ] + ([] if settings.NB_ROUNDS == 2 else [(3, _('Round 3'))]),
verbose_name=_('number'), verbose_name=_('number'),
help_text=_("The number of the round, 1 or 2"), help_text=_("The number of the round, 1 or 2 (or 3 for ETEAM)"),
validators=[MinValueValidator(1), MaxValueValidator(2)], validators=[MinValueValidator(1), MaxValueValidator(settings.NB_ROUNDS)],
) )
current_pool = models.ForeignKey( current_pool = models.ForeignKey(
@ -524,10 +524,10 @@ class TeamDraw(models.Model):
@property @property
def penalty_int(self): def penalty_int(self):
""" """
The number of penalties, which is the number of rejected problems after the P - 5 free rejects, The number of penalties, which is the number of rejected problems after the P - 5 free rejects
where P is the number of problems. (P - 6 for ETEAM), where P is the number of problems.
""" """
return max(0, len(self.rejected) - (len(settings.PROBLEMS) - 5)) return max(0, len(self.rejected) - (len(settings.PROBLEMS) - settings.RECOMMENDED_SOLUTIONS_COUNT))
@property @property
def penalty(self): def penalty(self):

View File

@ -4,6 +4,9 @@
await Notification.requestPermission() await Notification.requestPermission()
})() })()
// TODO ETEAM Mieux paramétriser (5 pour le TFJM², 6 pour l'ETEAM)
const RECOMMENDED_SOLUTIONS_COUNT = 6
const problems_count = JSON.parse(document.getElementById('problems_count').textContent) const problems_count = JSON.parse(document.getElementById('problems_count').textContent)
const tournaments = JSON.parse(document.getElementById('tournaments_list').textContent) const tournaments = JSON.parse(document.getElementById('tournaments_list').textContent)
@ -658,15 +661,16 @@ document.addEventListener('DOMContentLoaded', () => {
recapDiv.textContent = `🗑️ ${rejected.join(', ')}` recapDiv.textContent = `🗑️ ${rejected.join(', ')}`
let penaltyDiv = document.getElementById(`recap-${tid}-round-${round}-team-${team}-penalty`) let penaltyDiv = document.getElementById(`recap-${tid}-round-${round}-team-${team}-penalty`)
if (rejected.length > problems_count - 5) { if (rejected.length > problems_count - RECOMMENDED_SOLUTIONS_COUNT) {
// If more than P - 5 problems were rejected, add a penalty of 25% of the coefficient of the oral defender // If more than P - 5 problems were rejected, add a penalty of 25% of the coefficient of the oral defender
// This is P - 6 for the ETEAM
if (penaltyDiv === null) { if (penaltyDiv === null) {
penaltyDiv = document.createElement('div') penaltyDiv = document.createElement('div')
penaltyDiv.id = `recap-${tid}-round-${round}-team-${team}-penalty` penaltyDiv.id = `recap-${tid}-round-${round}-team-${team}-penalty`
penaltyDiv.classList.add('badge', 'rounded-pill', 'text-bg-info') penaltyDiv.classList.add('badge', 'rounded-pill', 'text-bg-info')
recapDiv.parentNode.append(penaltyDiv) recapDiv.parentNode.append(penaltyDiv)
} }
penaltyDiv.textContent = `${25 * (rejected.length - (problems_count - 5))} %` penaltyDiv.textContent = `${25 * (rejected.length - (problems_count - RECOMMENDED_SOLUTIONS_COUNT))} %`
} else { } else {
// Eventually remove this div // Eventually remove this div
if (penaltyDiv !== null) if (penaltyDiv !== null)

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: 2024-06-07 13:50+0200\n" "POT-Creation-Date: 2024-06-07 14:13+0200\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"
@ -37,7 +37,7 @@ msgstr "Canaux d'équipes"
msgid "Private channels" msgid "Private channels"
msgstr "Messages privés" msgstr "Messages privés"
#: chat/models.py:29 participation/models.py:35 participation/models.py:263 #: chat/models.py:29 participation/models.py:35 participation/models.py:264
#: participation/tables.py:18 participation/tables.py:34 #: participation/tables.py:18 participation/tables.py:34
msgid "name" msgid "name"
msgstr "nom" 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 #: 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 #: draw/models.py:26 participation/admin.py:79 participation/admin.py:140
#: participation/admin.py:171 participation/models.py:693 #: participation/admin.py:171 participation/models.py:694
#: participation/models.py:717 participation/models.py:935 #: participation/models.py:718 participation/models.py:936
#: registration/models.py:756 #: registration/models.py:756
#: registration/templates/registration/payment_form.html:53 #: registration/templates/registration/payment_form.html:53
msgid "tournament" msgid "tournament"
@ -95,7 +95,7 @@ msgstr ""
#: chat/models.py:73 draw/models.py:429 draw/models.py:456 #: chat/models.py:73 draw/models.py:429 draw/models.py:456
#: participation/admin.py:136 participation/admin.py:155 #: participation/admin.py:136 participation/admin.py:155
#: participation/models.py:1434 participation/models.py:1443 #: participation/models.py:1435 participation/models.py:1444
#: participation/tables.py:84 #: participation/tables.py:84
msgid "pool" msgid "pool"
msgstr "poule" msgstr "poule"
@ -108,8 +108,8 @@ msgstr ""
"concernée." "concernée."
#: chat/models.py:84 draw/templates/draw/tournament_content.html:277 #: chat/models.py:84 draw/templates/draw/tournament_content.html:277
#: participation/admin.py:167 participation/models.py:252 #: participation/admin.py:167 participation/models.py:253
#: participation/models.py:708 #: participation/models.py:709
#: participation/templates/participation/tournament_harmonize.html:15 #: participation/templates/participation/tournament_harmonize.html:15
#: registration/models.py:157 registration/models.py:747 #: registration/models.py:157 registration/models.py:747
#: registration/tables.py:39 #: registration/tables.py:39
@ -254,13 +254,13 @@ msgid "Chat"
msgstr "Chat" msgstr "Chat"
#: draw/admin.py:39 draw/admin.py:57 draw/admin.py:75 #: draw/admin.py:39 draw/admin.py:57 draw/admin.py:75
#: participation/admin.py:109 participation/models.py:253 #: participation/admin.py:109 participation/models.py:254
#: participation/tables.py:88 #: participation/tables.py:88
msgid "teams" msgid "teams"
msgstr "équipes" msgstr "équipes"
#: draw/admin.py:92 draw/models.py:234 draw/models.py:448 #: draw/admin.py:92 draw/models.py:234 draw/models.py:448
#: participation/models.py:939 #: participation/models.py:940
msgid "round" msgid "round"
msgstr "tour" msgstr "tour"
@ -378,13 +378,17 @@ msgstr "Tour 1"
msgid "Round 2" msgid "Round 2"
msgstr "Tour 2" msgstr "Tour 2"
#: draw/models.py:196
msgid "Round 3"
msgstr "Tour 3"
#: draw/models.py:197 #: draw/models.py:197
msgid "number" msgid "number"
msgstr "numéro" msgstr "numéro"
#: draw/models.py:198 #: draw/models.py:198
msgid "The number of the round, 1 or 2" msgid "The number of the round, 1 or 2 (or 3 for ETEAM)"
msgstr "Le numéro du tour, 1 ou 2" msgstr "Le numéro du tour, 1 ou 2 (ou 3 pour ETEAM)"
#: draw/models.py:208 #: draw/models.py:208
msgid "current pool" msgid "current pool"
@ -398,7 +402,7 @@ msgstr "La poule en cours, où les équipes choisissent leurs problèmes"
msgid "rounds" msgid "rounds"
msgstr "tours" msgstr "tours"
#: draw/models.py:257 participation/models.py:947 #: draw/models.py:257 participation/models.py:948
msgid "letter" msgid "letter"
msgstr "lettre" msgstr "lettre"
@ -436,12 +440,12 @@ msgstr "L'instance complète de la poule."
msgid "Pool {letter}{number}" msgid "Pool {letter}{number}"
msgstr "Poule {letter}{number}" msgstr "Poule {letter}{number}"
#: draw/models.py:430 participation/models.py:1435 #: draw/models.py:430 participation/models.py:1436
msgid "pools" msgid "pools"
msgstr "poules" msgstr "poules"
#: draw/models.py:442 participation/models.py:925 participation/models.py:1584 #: draw/models.py:442 participation/models.py:926 participation/models.py:1585
#: participation/models.py:1614 participation/models.py:1656 #: participation/models.py:1615 participation/models.py:1657
msgid "participation" msgid "participation"
msgstr "participation" msgstr "participation"
@ -465,8 +469,8 @@ msgid ""
msgstr "" msgstr ""
"L'ordre de choix dans la poule, entre 0 et la taille de la poule moins 1." "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:1457 #: draw/models.py:479 draw/models.py:502 participation/models.py:1458
#: participation/models.py:1621 #: participation/models.py:1622
#, python-brace-format #, python-brace-format
msgid "Problem #{problem}" msgid "Problem #{problem}"
msgstr "Problème n°{problem}" msgstr "Problème n°{problem}"
@ -677,26 +681,26 @@ msgstr "Changelog de type \"{action}\" pour le modèle {model} le {timestamp}"
msgid "valid" msgid "valid"
msgstr "valide" msgstr "valide"
#: participation/admin.py:87 participation/models.py:729 #: participation/admin.py:87 participation/models.py:730
msgid "selected for final" msgid "selected for final"
msgstr "sélectionnée pour la finale" msgstr "sélectionnée pour la finale"
#: participation/admin.py:124 participation/admin.py:183 #: participation/admin.py:124 participation/admin.py:183
#: participation/models.py:1464 participation/tables.py:112 #: participation/models.py:1465 participation/tables.py:112
msgid "defender" msgid "defender"
msgstr "défenseur⋅se" msgstr "défenseur⋅se"
#: participation/admin.py:128 participation/models.py:1471 #: participation/admin.py:128 participation/models.py:1472
#: participation/models.py:1668 #: participation/models.py:1669
msgid "opponent" msgid "opponent"
msgstr "opposant⋅e" msgstr "opposant⋅e"
#: participation/admin.py:132 participation/models.py:1478 #: participation/admin.py:132 participation/models.py:1479
#: participation/models.py:1669 #: participation/models.py:1670
msgid "reporter" msgid "reporter"
msgstr "rapporteur⋅rice" msgstr "rapporteur⋅rice"
#: participation/admin.py:187 participation/models.py:1619 #: participation/admin.py:187 participation/models.py:1620
msgid "problem" msgid "problem"
msgstr "numéro de problème" msgstr "numéro de problème"
@ -704,7 +708,7 @@ msgstr "numéro de problème"
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é."
#: participation/forms.py:36 participation/models.py:42 #: participation/forms.py:36
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."
@ -797,27 +801,32 @@ msgstr "Ce⋅tte défenseur⋅se ne travaille pas sur ce problème."
msgid "The PDF file must not have more than 2 pages." msgid "The PDF file must not have more than 2 pages."
msgstr "Le fichier PDF ne doit pas avoir plus de 2 pages." msgstr "Le fichier PDF ne doit pas avoir plus de 2 pages."
#: participation/models.py:41 participation/tables.py:39 #: participation/models.py:41
msgid "trigram" msgid "code"
msgstr "trigramme" msgstr "code"
#: participation/models.py:47 #: participation/models.py:42
#, python-brace-format
msgid "The code must be composed of {nb_letters} uppercase letters."
msgstr "Le code doit être composé de {nb_letters} lettres majuscules."
#: participation/models.py:48
msgid "This trigram is forbidden." msgid "This trigram is forbidden."
msgstr "Ce trigramme est interdit." msgstr "Ce trigramme est interdit."
#: participation/models.py:53 #: participation/models.py:54
msgid "access code" msgid "access code"
msgstr "code d'accès" msgstr "code d'accès"
#: participation/models.py:54 #: participation/models.py:55
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."
#: participation/models.py:58 #: participation/models.py:59
msgid "motivation letter" msgid "motivation letter"
msgstr "lettre de motivation" msgstr "lettre de motivation"
#: participation/models.py:99 #: participation/models.py:100
#, python-brace-format #, python-brace-format
msgid "" msgid ""
"The team {trigram} is not registered to any tournament. You can register the " "The team {trigram} is not registered to any tournament. You can register the "
@ -826,11 +835,11 @@ msgstr ""
"L'équipe {trigram} n'est inscrite à aucun tournoi. Vous pouvez inscrire " "L'équipe {trigram} n'est inscrite à aucun tournoi. Vous pouvez inscrire "
"l'équipe à un tournoi en cliquant sur <a href='{url}'>ce lien</a>." "l'équipe à un tournoi en cliquant sur <a href='{url}'>ce lien</a>."
#: participation/models.py:104 #: participation/models.py:105
msgid "No tournament" msgid "No tournament"
msgstr "Pas de tournoi" msgstr "Pas de tournoi"
#: participation/models.py:110 #: participation/models.py:111
msgid "" msgid ""
"Registrations for the tournament of {tournament} are ending on the {date:%Y-" "Registrations for the tournament of {tournament} are ending on the {date:%Y-"
"%m-%d %H:%M}." "%m-%d %H:%M}."
@ -838,11 +847,11 @@ msgstr ""
"Les inscriptions pour le tournoi de {tournament} se terminent le {date:%d/%m/" "Les inscriptions pour le tournoi de {tournament} se terminent le {date:%d/%m/"
"%Y %H:%M}." "%Y %H:%M}."
#: participation/models.py:115 #: participation/models.py:116
msgid "Registrations closure" msgid "Registrations closure"
msgstr "Clôture des inscriptions" msgstr "Clôture des inscriptions"
#: participation/models.py:122 #: participation/models.py:123
#, python-brace-format #, python-brace-format
msgid "" msgid ""
"The team {trigram} has not uploaded a motivation letter. You can upload your " "The team {trigram} has not uploaded a motivation letter. You can upload your "
@ -852,11 +861,11 @@ msgstr ""
"envoyer votre lettre de motivation en cliquant sur <a href='{url}'>ce lien</" "envoyer votre lettre de motivation en cliquant sur <a href='{url}'>ce lien</"
"a>." "a>."
#: participation/models.py:127 #: participation/models.py:128
msgid "No motivation letter" msgid "No motivation letter"
msgstr "Pas de lettre de motivation" msgstr "Pas de lettre de motivation"
#: participation/models.py:136 #: participation/models.py:137
#, python-brace-format #, python-brace-format
msgid "" msgid ""
"The team {trigram} has less than 4 students ({nb_students}). You can invite " "The team {trigram} has less than 4 students ({nb_students}). You can invite "
@ -866,11 +875,11 @@ msgstr ""
"plus d'élèves à rejoindre l'équipe en utilisant le code d'invitation " "plus d'élèves à rejoindre l'équipe en utilisant le code d'invitation "
"<strong>{code}</strong>." "<strong>{code}</strong>."
#: participation/models.py:141 #: participation/models.py:142
msgid "Not enough students" msgid "Not enough students"
msgstr "Pas assez d'élèves" msgstr "Pas assez d'élèves"
#: participation/models.py:148 #: participation/models.py:149
#, python-brace-format #, python-brace-format
msgid "" msgid ""
"The team {trigram} has no coach. You can invite a coach to join the team " "The team {trigram} has no coach. You can invite a coach to join the team "
@ -880,11 +889,11 @@ msgstr ""
"encadrant⋅e à rejoindre l'équipe en utilisant le code d'invitation " "encadrant⋅e à rejoindre l'équipe en utilisant le code d'invitation "
"<strong>{code}</strong>." "<strong>{code}</strong>."
#: participation/models.py:152 #: participation/models.py:153
msgid "No coach" msgid "No coach"
msgstr "Pas d'encadrant⋅e" msgstr "Pas d'encadrant⋅e"
#: participation/models.py:159 #: participation/models.py:160
#, python-brace-format #, python-brace-format
msgid "" msgid ""
"The team {trigram} has more than 6 students ({nb_students}) or more than 2 " "The team {trigram} has more than 6 students ({nb_students}) or more than 2 "
@ -895,11 +904,11 @@ msgstr ""
"encadrant⋅es ({nb_coaches}). Vous devez restreindre le nombre d'élèves et " "encadrant⋅es ({nb_coaches}). Vous devez restreindre le nombre d'élèves et "
"d'encadrant⋅es à 6 et 2, respectivement." "d'encadrant⋅es à 6 et 2, respectivement."
#: participation/models.py:164 #: participation/models.py:165
msgid "Too many members" msgid "Too many members"
msgstr "Trop de membres" msgstr "Trop de membres"
#: participation/models.py:171 #: participation/models.py:172
#, python-brace-format #, python-brace-format
msgid "" msgid ""
"The team {trigram} is ready to be validated. You can request validation on " "The team {trigram} is ready to be validated. You can request validation on "
@ -908,11 +917,11 @@ msgstr ""
"L'équipe {trigram} est prête à être validée. Vous pouvez demander la " "L'équipe {trigram} est prête à être validée. Vous pouvez demander la "
"validation sur <a href='{url}'>la page de votre équipe</a>." "validation sur <a href='{url}'>la page de votre équipe</a>."
#: participation/models.py:176 participation/models.py:187 #: participation/models.py:177 participation/models.py:188
msgid "Validate team" msgid "Validate team"
msgstr "Valider l'équipe" msgstr "Valider l'équipe"
#: participation/models.py:182 #: participation/models.py:183
#, python-brace-format #, python-brace-format
msgid "" msgid ""
"The team {trigram} has enough participants, but is not ready to be " "The team {trigram} has enough participants, but is not ready to be "
@ -925,7 +934,7 @@ msgstr ""
"documents requis. Pour inviter plus de participant⋅es, utilisez le code " "documents requis. Pour inviter plus de participant⋅es, utilisez le code "
"d'invitation <strong>{code}</strong>." "d'invitation <strong>{code}</strong>."
#: participation/models.py:193 #: participation/models.py:194
#, python-brace-format #, python-brace-format
msgid "" msgid ""
"The team {trigram} has not been validated by the organizers yet. Please be " "The team {trigram} has not been validated by the organizers yet. Please be "
@ -934,115 +943,115 @@ msgstr ""
"L'équipe {trigram} n'a pas encore été validée par les organisateurices. " "L'équipe {trigram} n'a pas encore été validée par les organisateurices. "
"Merci de patienter." "Merci de patienter."
#: participation/models.py:196 registration/models.py:575 #: participation/models.py:197 registration/models.py:575
msgid "Pending validation" msgid "Pending validation"
msgstr "Validation en attente" msgstr "Validation en attente"
#: participation/models.py:249 #: participation/models.py:250
#, python-brace-format #, python-brace-format
msgid "Team {name} ({trigram})" msgid "Team {name} ({trigram})"
msgstr "Équipe {name} ({trigram})" msgstr "Équipe {name} ({trigram})"
#: participation/models.py:268 #: participation/models.py:269
msgid "start" msgid "start"
msgstr "début" msgstr "début"
#: participation/models.py:273 #: participation/models.py:274
msgid "end" msgid "end"
msgstr "fin" msgstr "fin"
#: participation/models.py:279 #: participation/models.py:280
#: participation/templates/participation/tournament_detail.html:18 #: participation/templates/participation/tournament_detail.html:18
msgid "place" msgid "place"
msgstr "lieu" msgstr "lieu"
#: participation/models.py:283 #: participation/models.py:284
msgid "max team count" msgid "max team count"
msgstr "nombre maximal d'équipes" msgstr "nombre maximal d'équipes"
#: participation/models.py:288 #: participation/models.py:289
#: participation/templates/participation/tournament_detail.html:21 #: participation/templates/participation/tournament_detail.html:21
msgid "price" msgid "price"
msgstr "prix" msgstr "prix"
#: participation/models.py:293 #: participation/models.py:294
#: participation/templates/participation/tournament_detail.html:24 #: participation/templates/participation/tournament_detail.html:24
msgid "remote" msgid "remote"
msgstr "à distance" msgstr "à distance"
#: participation/models.py:298 #: participation/models.py:299
msgid "limit date for registrations" msgid "limit date for registrations"
msgstr "date limite d'inscription" msgstr "date limite d'inscription"
#: participation/models.py:303 #: participation/models.py:304
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"
#: participation/models.py:308 #: participation/models.py:309
msgid "random draw for solutions" msgid "random draw for solutions"
msgstr "tirage au sort des solutions" msgstr "tirage au sort des solutions"
#: participation/models.py:313 #: participation/models.py:314
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"
#: participation/models.py:318 #: participation/models.py:319
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"
#: participation/models.py:323 #: participation/models.py:324
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"
#: participation/models.py:328 #: participation/models.py:329
#: participation/templates/participation/tournament_detail.html:48 #: participation/templates/participation/tournament_detail.html:48
msgid "description" msgid "description"
msgstr "description" msgstr "description"
#: participation/models.py:334 #: participation/models.py:335
#: participation/templates/participation/tournament_detail.html:12 #: participation/templates/participation/tournament_detail.html:12
msgid "organizers" msgid "organizers"
msgstr "organisateur⋅rices" msgstr "organisateur⋅rices"
#: participation/models.py:339 #: participation/models.py:340
#: participation/templates/participation/team_detail.html:161 #: participation/templates/participation/team_detail.html:161
msgid "final" msgid "final"
msgstr "finale" msgstr "finale"
#: participation/models.py:347 #: participation/models.py:348
msgid "Google Sheet ID" msgid "Google Sheet ID"
msgstr "ID de la feuille Google Sheets" msgstr "ID de la feuille Google Sheets"
#: participation/models.py:694 registration/admin.py:125 #: participation/models.py:695 registration/admin.py:125
msgid "tournaments" msgid "tournaments"
msgstr "tournois" msgstr "tournois"
#: participation/models.py:723 #: participation/models.py:724
msgid "valid team" msgid "valid team"
msgstr "équipe valide" msgstr "équipe valide"
#: participation/models.py:724 #: participation/models.py:725
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."
#: participation/models.py:730 #: participation/models.py:731
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."
#: participation/models.py:734 #: participation/models.py:735
msgid "mention" msgid "mention"
msgstr "mention" msgstr "mention"
#: participation/models.py:741 #: participation/models.py:742
msgid "mention (final)" msgid "mention (final)"
msgstr "Mention (pour la finale) :" msgstr "Mention (pour la finale) :"
#: participation/models.py:751 #: participation/models.py:752
#, 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})"
#: participation/models.py:758 #: participation/models.py:759
#, python-brace-format #, python-brace-format
msgid "" msgid ""
"<p>The team {trigram} has {nb_missing_payments} missing payments. Each " "<p>The team {trigram} has {nb_missing_payments} missing payments. Each "
@ -1055,11 +1064,11 @@ msgstr ""
"notification de bourse) pour participer au tournoi.</p><p>Les participant⋅es " "notification de bourse) pour participer au tournoi.</p><p>Les participant⋅es "
"qui n'ont pas encore payé sont : {participants}.</p>" "qui n'ont pas encore payé sont : {participants}.</p>"
#: participation/models.py:766 #: participation/models.py:767
msgid "Missing payments" msgid "Missing payments"
msgstr "Paiements manquants" msgstr "Paiements manquants"
#: participation/models.py:783 #: participation/models.py:784
msgid "" msgid ""
"<p>The solutions for the tournament of {tournament} are due on the {date:%Y-" "<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> " "%m-%d %H:%M}.</p><p>You have currently sent <strong>{nb_solutions}</strong> "
@ -1074,11 +1083,11 @@ msgstr ""
"pouvez envoyer vos solutions sur <a href='{url}'>votre page de " "pouvez envoyer vos solutions sur <a href='{url}'>votre page de "
"participation</a>.</p>" "participation</a>.</p>"
#: participation/models.py:793 participation/models.py:807 #: participation/models.py:794 participation/models.py:808
msgid "Solutions due" msgid "Solutions due"
msgstr "Rendu des solutions" msgstr "Rendu des solutions"
#: participation/models.py:799 #: participation/models.py:800
msgid "" msgid ""
"<p>The solutions for the tournament of {tournament} are due on the {date:%Y-" "<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 " "%m-%d %H:%M}.</p><p>Remember that you can only fix minor changes to your "
@ -1091,7 +1100,7 @@ msgstr ""
"parties.</p><p>Vous pouvez envoyer vos solutions sur <a href='{url}'>votre " "parties.</p><p>Vous pouvez envoyer vos solutions sur <a href='{url}'>votre "
"page de participation</a>.</p>" "page de participation</a>.</p>"
#: participation/models.py:813 registration/models.py:600 #: participation/models.py:814 registration/models.py:600
msgid "" msgid ""
"<p>The draw of the solutions for the tournament {tournament} is planned on " "<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>." "the {date:%Y-%m-%d %H:%M}. You can join it on <a href='{url}'>this link</a>."
@ -1101,11 +1110,11 @@ msgstr ""
"{date:%d/%m/%Y %H:%M}. Vous pouvez y participer sur <a href='{url}'>ce lien</" "{date:%d/%m/%Y %H:%M}. Vous pouvez y participer sur <a href='{url}'>ce lien</"
"a>.</p>" "a>.</p>"
#: participation/models.py:819 registration/models.py:607 #: participation/models.py:820 registration/models.py:607
msgid "Draw of solutions" msgid "Draw of solutions"
msgstr "Tirage au sort des solutions" msgstr "Tirage au sort des solutions"
#: participation/models.py:829 #: participation/models.py:830
#, python-brace-format #, python-brace-format
msgid "" msgid ""
"<p>The solutions draw is ended. You can check the result on <a " "<p>The solutions draw is ended. You can check the result on <a "
@ -1117,7 +1126,7 @@ msgstr ""
"tour, vous défendrez <a href='{solution_url}'>votre solution du problème " "tour, vous défendrez <a href='{solution_url}'>votre solution du problème "
"{problem}</a>.</p>" "{problem}</a>.</p>"
#: participation/models.py:838 participation/models.py:880 #: participation/models.py:839 participation/models.py:881
#, python-brace-format #, python-brace-format
msgid "" msgid ""
"<p>You will oppose the solution of the team {opponent} on the <a " "<p>You will oppose the solution of the team {opponent} on the <a "
@ -1128,7 +1137,7 @@ msgstr ""
"href='{solution_url}'>problème {problem}</a>. Vous pouvez envoyer votre note " "href='{solution_url}'>problème {problem}</a>. Vous pouvez envoyer votre note "
"de synthèse sur <a href='{passage_url}'>cette page</a>.</p>" "de synthèse sur <a href='{passage_url}'>cette page</a>.</p>"
#: participation/models.py:847 participation/models.py:889 #: participation/models.py:848 participation/models.py:890
#, python-brace-format #, python-brace-format
msgid "" msgid ""
"<p>You will report the solution of the team {reporter} on the <a " "<p>You will report the solution of the team {reporter} on the <a "
@ -1139,11 +1148,11 @@ msgstr ""
"href='{solution_url}'>problème {problem}</a>. Vous pouvez envoyer votre note " "href='{solution_url}'>problème {problem}</a>. Vous pouvez envoyer votre note "
"de synthèse sur <a href='{passage_url}'>cette page</a>.</p>" "de synthèse sur <a href='{passage_url}'>cette page</a>.</p>"
#: participation/models.py:863 registration/models.py:622 #: participation/models.py:864 registration/models.py:622
msgid "First round" msgid "First round"
msgstr "Premier tour" msgstr "Premier tour"
#: participation/models.py:873 #: participation/models.py:874
#, python-brace-format #, python-brace-format
msgid "" msgid ""
"<p>For the second round, you will defend <a href='{solution_url}'>your " "<p>For the second round, you will defend <a href='{solution_url}'>your "
@ -1152,11 +1161,11 @@ msgstr ""
"<p>Pour le second tour, vous défendrez <a href='{solution_url}'>votre " "<p>Pour le second tour, vous défendrez <a href='{solution_url}'>votre "
"solution du problème {problem}</a>.</p>" "solution du problème {problem}</a>.</p>"
#: participation/models.py:905 registration/models.py:633 #: participation/models.py:906 registration/models.py:633
msgid "Second round" msgid "Second round"
msgstr "Second tour" msgstr "Second tour"
#: participation/models.py:911 #: participation/models.py:912
#, python-brace-format #, python-brace-format
msgid "" msgid ""
"<p>The tournament {tournament} is ended. You can check the results on the <a " "<p>The tournament {tournament} is ended. You can check the results on the <a "
@ -1165,56 +1174,57 @@ msgstr ""
"<p>Le tournoi {tournament} est terminé. Vous pouvez consulter les résultats " "<p>Le tournoi {tournament} est terminé. Vous pouvez consulter les résultats "
"sur la <a href='{url}'>page du tournoi</a>.</p>" "sur la <a href='{url}'>page du tournoi</a>.</p>"
#: participation/models.py:916 #: participation/models.py:917
msgid "Tournament ended" msgid "Tournament ended"
msgstr "Tournoi terminé" msgstr "Tournoi terminé"
#: participation/models.py:926 participation/models.py:969 #: participation/models.py:927 participation/models.py:970
msgid "participations" msgid "participations"
msgstr "participations" msgstr "participations"
#: participation/models.py:941 participation/models.py:942 #: participation/models.py:942 participation/models.py:943
#: participation/models.py:944
#, python-brace-format #, python-brace-format
msgid "Round {round}" msgid "Round {round}"
msgstr "Tour {round}" msgstr "Tour {round}"
#: participation/models.py:957 #: participation/models.py:958
msgid "room" msgid "room"
msgstr "salle" msgstr "salle"
#: participation/models.py:959 #: participation/models.py:960
msgid "Room 1" msgid "Room 1"
msgstr "Salle 1" msgstr "Salle 1"
#: participation/models.py:960 #: participation/models.py:961
msgid "Room 2" msgid "Room 2"
msgstr "Salle 2" msgstr "Salle 2"
#: participation/models.py:963 #: participation/models.py:964
msgid "For 5-teams pools only" msgid "For 5-teams pools only"
msgstr "Pour les poules de 5 équipe uniquement" msgstr "Pour les poules de 5 équipe uniquement"
#: participation/models.py:975 #: participation/models.py:976
msgid "juries" msgid "juries"
msgstr "jurys" msgstr "jurys"
#: participation/models.py:984 #: participation/models.py:985
msgid "president of the jury" msgid "president of the jury"
msgstr "président⋅e du jury" msgstr "président⋅e du jury"
#: participation/models.py:991 #: participation/models.py:992
msgid "BigBlueButton URL" msgid "BigBlueButton URL"
msgstr "Lien BigBlueButton" msgstr "Lien BigBlueButton"
#: participation/models.py:992 #: participation/models.py:993
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."
#: participation/models.py:997 #: participation/models.py:998
msgid "results available" msgid "results available"
msgstr "résultats disponibles" msgstr "résultats disponibles"
#: participation/models.py:998 #: participation/models.py:999
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."
@ -1223,33 +1233,33 @@ 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."
#: participation/models.py:1026 #: participation/models.py:1027
msgid "The president of the jury must be part of the jury." msgid "The president of the jury must be part of the jury."
msgstr "Læ président⋅e du jury doit faire partie du jury." msgstr "Læ président⋅e du jury doit faire partie du jury."
#: participation/models.py:1415 #: participation/models.py:1416
#, python-brace-format #, python-brace-format
msgid "The jury {jury} is not part of the jury for this pool." msgid "The jury {jury} is not part of the jury for this pool."
msgstr "{jury} ne fait pas partie du jury pour cette poule." msgstr "{jury} ne fait pas partie du jury pour cette poule."
#: participation/models.py:1428 #: participation/models.py:1429
#, python-brace-format #, python-brace-format
msgid "Pool {code} for tournament {tournament} with teams {teams}" msgid "Pool {code} for tournament {tournament} with teams {teams}"
msgstr "Poule {code} du tournoi {tournament} avec les équipes {teams}" msgstr "Poule {code} du tournoi {tournament} avec les équipes {teams}"
#: participation/models.py:1448 #: participation/models.py:1449
msgid "position" msgid "position"
msgstr "position" msgstr "position"
#: participation/models.py:1455 #: participation/models.py:1456
msgid "defended solution" msgid "defended solution"
msgstr "solution défendue" msgstr "solution défendue"
#: participation/models.py:1483 #: participation/models.py:1484
msgid "penalties" msgid "penalties"
msgstr "pénalités" msgstr "pénalités"
#: participation/models.py:1485 #: participation/models.py:1486
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."
@ -1257,123 +1267,127 @@ msgstr ""
"Nombre de pénalités pour l'équipe défenseuse. Elle perd un coefficient 0.5 " "Nombre de pénalités pour l'équipe défenseuse. Elle perd un coefficient 0.5 "
"sur sa présentation orale par pénalité." "sur sa présentation orale par pénalité."
#: participation/models.py:1554 participation/models.py:1557 #: participation/models.py:1555 participation/models.py:1558
#: participation/models.py:1560 #: participation/models.py:1561
#, 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."
#: participation/models.py:1565 #: participation/models.py:1566
#, 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}"
#: participation/models.py:1569 participation/models.py:1578 #: participation/models.py:1570 participation/models.py:1579
#: participation/models.py:1663 participation/models.py:1705 #: participation/models.py:1664 participation/models.py:1706
msgid "passage" msgid "passage"
msgstr "passage" msgstr "passage"
#: participation/models.py:1570 #: participation/models.py:1571
msgid "passages" msgid "passages"
msgstr "passages" msgstr "passages"
#: participation/models.py:1589 #: participation/models.py:1590
msgid "difference" msgid "difference"
msgstr "différence" msgstr "différence"
#: participation/models.py:1590 #: participation/models.py:1591
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"
#: participation/models.py:1597 #: participation/models.py:1598
msgid "tweak" msgid "tweak"
msgstr "harmonisation" msgstr "harmonisation"
#: participation/models.py:1598 #: participation/models.py:1599
msgid "tweaks" msgid "tweaks"
msgstr "harmonisations" msgstr "harmonisations"
#: participation/models.py:1626 #: participation/models.py:1627
msgid "solution for the final tournament" msgid "solution for the final tournament"
msgstr "solution pour la finale" msgstr "solution pour la finale"
#: participation/models.py:1631 participation/models.py:1674 #: participation/models.py:1632 participation/models.py:1675
msgid "file" msgid "file"
msgstr "fichier" msgstr "fichier"
#: participation/models.py:1641 #: participation/models.py:1642
#, 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}"
#: participation/models.py:1643 #: participation/models.py:1644
msgid "for final" msgid "for final"
msgstr "pour la finale" msgstr "pour la finale"
#: participation/models.py:1646 #: participation/models.py:1647
msgid "solution" msgid "solution"
msgstr "solution" msgstr "solution"
#: participation/models.py:1647 #: participation/models.py:1648
msgid "solutions" msgid "solutions"
msgstr "solutions" msgstr "solutions"
#: participation/models.py:1680 #: participation/models.py:1681
#, 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}"
#: participation/models.py:1688 #: participation/models.py:1689
msgid "synthesis" msgid "synthesis"
msgstr "note de synthèse" msgstr "note de synthèse"
#: participation/models.py:1689 #: participation/models.py:1690
msgid "syntheses" msgid "syntheses"
msgstr "notes de synthèse" msgstr "notes de synthèse"
#: participation/models.py:1698 #: participation/models.py:1699
msgid "jury" msgid "jury"
msgstr "jury" msgstr "jury"
#: participation/models.py:1710 #: participation/models.py:1711
msgid "defender writing note" msgid "defender writing note"
msgstr "note d'écrit défenseur⋅se" msgstr "note d'écrit défenseur⋅se"
#: participation/models.py:1716 #: participation/models.py:1717
msgid "defender oral note" msgid "defender oral note"
msgstr "note d'oral défenseur⋅se" msgstr "note d'oral défenseur⋅se"
#: participation/models.py:1722 #: participation/models.py:1723
msgid "opponent writing note" msgid "opponent writing note"
msgstr "note d'écrit opposant⋅e" msgstr "note d'écrit opposant⋅e"
#: participation/models.py:1728 #: participation/models.py:1729
msgid "opponent oral note" msgid "opponent oral note"
msgstr "note d'oral opposant⋅e" msgstr "note d'oral opposant⋅e"
#: participation/models.py:1734 #: participation/models.py:1735
msgid "reporter writing note" msgid "reporter writing note"
msgstr "note d'écrit rapporteur⋅rice" msgstr "note d'écrit rapporteur⋅rice"
#: participation/models.py:1740 #: participation/models.py:1741
msgid "reporter oral note" msgid "reporter oral note"
msgstr "note d'oral du rapporteur⋅rice" msgstr "note d'oral du rapporteur⋅rice"
#: participation/models.py:1800 #: participation/models.py:1801
#, 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}"
#: participation/models.py:1803 #: participation/models.py:1804
msgid "note" msgid "note"
msgstr "note" msgstr "note"
#: participation/models.py:1804 #: participation/models.py:1805
msgid "notes" msgid "notes"
msgstr "notes" msgstr "notes"
#: participation/tables.py:39
msgid "trigram"
msgstr "trigramme"
#: participation/tables.py:50 #: participation/tables.py:50
msgid "Validated" msgid "Validated"
msgstr "Validée" msgstr "Validée"
@ -3868,9 +3882,9 @@ msgid ""
msgstr "" msgstr ""
"N'hésitez pas à consulter la <a href=\"/doc/\" " "N'hésitez pas à consulter la <a href=\"/doc/\" "
"target=\"_blank\">documentation</a> du site, pour vérifier si la réponse n'y " "target=\"_blank\">documentation</a> du site, pour vérifier si la réponse n'y "
"est pas déjà. Référez-vous également bien sûr au <a href=\"https://eteam.tfjm.org/" "est pas déjà. Référez-vous également bien sûr au <a href=\"https://eteam."
"rules/\" target=\"_blank\">règlement de l'ETEAM</a>. Pour toute autre " "tfjm.org/rules/\" target=\"_blank\">règlement de l'ETEAM</a>. Pour toute "
"question, n'hésitez pas à nous contacter par mail à l'adresse <a " "autre question, n'hésitez pas à nous contacter par mail à l'adresse <a "
"href=\"mailto:eteam_moc@proton.me\"> eteam_moc@proton.me </a>." "href=\"mailto:eteam_moc@proton.me\"> eteam_moc@proton.me </a>."
#: tfjm/templates/index_tfjm.html:18 #: tfjm/templates/index_tfjm.html:18
@ -4040,7 +4054,3 @@ msgstr "Aucun résultat."
#: tfjm/templates/sidebar.html:10 tfjm/templates/sidebar.html:21 #: tfjm/templates/sidebar.html:10 tfjm/templates/sidebar.html:21
msgid "Informations" msgid "Informations"
msgstr "Informations" msgstr "Informations"
#~ msgctxt "TFJM"
#~ msgid "TFJM² Platform"
#~ msgstr "Plateforme du TFJM²"

View File

@ -1,6 +1,6 @@
# Copyright (C) 2020 by Animath # Copyright (C) 2020 by Animath
# SPDX-License-Identifier: GPL-3.0-or-later # SPDX-License-Identifier: GPL-3.0-or-later
import math
from datetime import date, timedelta from datetime import date, timedelta
import os import os
@ -37,12 +37,13 @@ class Team(models.Model):
) )
trigram = models.CharField( trigram = models.CharField(
max_length=3, max_length=settings.TEAM_CODE_LENGTH,
verbose_name=_("trigram"), verbose_name=_("code"),
help_text=_("The trigram must be composed of three uppercase letters."), help_text=format_lazy(_("The code must be composed of {nb_letters} uppercase letters."),
nb_letters=settings.TEAM_CODE_LENGTH),
unique=True, unique=True,
validators=[ validators=[
RegexValidator(r"^[A-Z]{3}$"), RegexValidator(fr"^[A-Z]{{f'{settings.TEAM_CODE_LENGTH}'}}$"),
RegexValidator(fr"^(?!{'|'.join(f'{t}$' for t in settings.FORBIDDEN_TRIGRAMS)})", RegexValidator(fr"^(?!{'|'.join(f'{t}$' for t in settings.FORBIDDEN_TRIGRAMS)})",
message=_("This trigram is forbidden.")), message=_("This trigram is forbidden.")),
], ],
@ -940,7 +941,7 @@ class Pool(models.Model):
choices=[ choices=[
(1, format_lazy(_("Round {round}"), round=1)), (1, format_lazy(_("Round {round}"), round=1)),
(2, format_lazy(_("Round {round}"), round=2)), (2, format_lazy(_("Round {round}"), round=2)),
] ] + ([] if settings.NB_ROUNDS == 2 else [(3, format_lazy(_("Round {round}"), round=3))]),
) )
letter = models.PositiveSmallIntegerField( letter = models.PositiveSmallIntegerField(
@ -1010,12 +1011,16 @@ class Pool(models.Model):
def solutions(self): def solutions(self):
return [passage.defended_solution for passage in self.passages.all()] return [passage.defended_solution for passage in self.passages.all()]
@property
def coeff(self):
return 1 if self.round <= 2 else math.pi - 2
def average(self, participation): def average(self, participation):
return sum(passage.average(participation) for passage in self.passages.all()) \ return self.coeff * sum(passage.average(participation) for passage in self.passages.all()) \
+ sum(tweak.diff for tweak in participation.tweaks.filter(pool=self).all()) + sum(tweak.diff for tweak in participation.tweaks.filter(pool=self).all())
async def aaverage(self, participation): async def aaverage(self, participation):
return sum([passage.average(participation) async for passage in self.passages.all()]) \ return self.coeff * sum([passage.average(participation) async for passage in self.passages.all()]) \
+ sum([tweak.diff async for tweak in participation.tweaks.filter(pool=self).all()]) + sum([tweak.diff async for tweak in participation.tweaks.filter(pool=self).all()])
def get_absolute_url(self): def get_absolute_url(self):

View File

@ -340,16 +340,6 @@ GOOGLE_SERVICE_CLIENT = {
NOTES_DRIVE_FOLDER_ID = os.getenv("NOTES_DRIVE_FOLDER_ID", "CHANGE_ME_IN_ENV_SETTINGS") NOTES_DRIVE_FOLDER_ID = os.getenv("NOTES_DRIVE_FOLDER_ID", "CHANGE_ME_IN_ENV_SETTINGS")
# Custom parameters # Custom parameters
PROBLEMS = [
"Triominos",
"Rassemblements mathématiques",
"Tournoi de ping-pong",
"Dépollution de la Seine",
"Électron libre",
"Pièces truquées",
"Drôles de cookies",
"Création d'un jeu",
]
FORBIDDEN_TRIGRAMS = [ FORBIDDEN_TRIGRAMS = [
"BIT", "BIT",
"CNO", "CNO",
@ -379,3 +369,38 @@ try:
from .settings_local import * # noqa: F401,F403 from .settings_local import * # noqa: F401,F403
except ImportError: except ImportError:
pass pass
if TFJM_APP == "TFJM":
TEAM_CODE_LENGTH = 3
RECOMMENDED_SOLUTIONS_COUNT = 5
NB_ROUNDS = 2
PROBLEMS = [
"Triominos",
"Rassemblements mathématiques",
"Tournoi de ping-pong",
"Dépollution de la Seine",
"Électron libre",
"Pièces truquées",
"Drôles de cookies",
"Création d'un jeu",
]
elif TFJM_APP == "ETEAM":
TEAM_CODE_LENGTH = 4
RECOMMENDED_SOLUTIONS_COUNT = 6
NB_ROUNDS = 3
PROBLEMS = [
"Exploring Flatland",
"A Mazing Hive",
"Coin tossing",
"The rainbow bridge",
"Arithmetic and shopping",
"A fence for the goats",
"Generalized Tic-Tac-Toe",
"Polyhedral construction",
"Landing a probe",
"Catching the rabbit",
]
else:
raise ValueError(f"Unknown app: {TFJM_APP}")