Add debug feature for problem draw, useful for final tournament

Signed-off-by: Emmy D'Anello <emmy.danello@animath.fr>
This commit is contained in:
Emmy D'Anello 2024-04-22 23:36:52 +02:00
parent 943276ef71
commit 0bc5ef0a7f
Signed by: ynerant
GPG Key ID: 3A75C55819C8CF85
6 changed files with 253 additions and 134 deletions

View File

@ -637,6 +637,7 @@ class DrawConsumer(AsyncJsonWebsocketConsumer):
and isinstance(kwargs['problem'], int) and (1 <= kwargs['problem'] <= len(settings.PROBLEMS)):
# Admins can force the draw
problem = int(kwargs['problem'])
break
# Check that the user didn't already accept this problem for the first round
# if this is the second round

View File

@ -292,7 +292,7 @@ class Pool(models.Model):
"""
Returns a query set ordered by passage index of all team draws in this pool.
"""
return self.teamdraw_set.order_by('passage_index').all()
return self.teamdraw_set.all()
@property
def trigrams(self) -> list[str]:
@ -545,4 +545,5 @@ class TeamDraw(models.Model):
class Meta:
verbose_name = _('team draw')
verbose_name_plural = _('team draws')
ordering = ('round__draw__tournament__name', 'round__number', 'pool__letter', 'passage_index',)
ordering = ('round__draw__tournament__name', 'round__number', 'pool__letter', 'passage_index',
'choice_dice', 'passage_dice',)

View File

@ -40,6 +40,20 @@ function drawDice(tid, trigram = null, result = null) {
socket.send(JSON.stringify({'tid': tid, 'type': 'dice', 'trigram': trigram, 'result': result}))
}
/**
* Fetch the requested dice from the buttons and request to draw it.
* Only available for debug purposes and for admins.
* @param tid The tournament id
*/
function drawDebugDice(tid) {
let dice_10 = parseInt(document.querySelector(`input[name="debug-dice-${tid}-10"]:checked`).value)
let dice_1 = parseInt(document.querySelector(`input[name="debug-dice-${tid}-1"]:checked`).value)
let result = (dice_10 + dice_1) || 100
let team_div = document.querySelector(`div[id="dices-${tid}"] > div > div[class*="text-bg-warning"]`)
let team = team_div.getAttribute("data-team")
drawDice(tid, team, result)
}
/**
* Request to draw a new problem.
* @param tid The tournament id
@ -203,6 +217,14 @@ document.addEventListener('DOMContentLoaded', () => {
elem.classList.add('text-bg-success')
elem.innerText = `${trigram} 🎲 ${result}`
}
let nextTeam = document.querySelector(` div[id="dices-${tid}"] > div > div[class*="text-bg-warning"]`).getAttribute("data-team")
if (nextTeam) {
// If there is one team that does not have launched its dice, then we update the debug section
let debugSpan = document.getElementById(`debug-dice-${tid}-team`)
if (debugSpan)
debugSpan.innerText = nextTeam
}
}
/**
@ -212,10 +234,15 @@ document.addEventListener('DOMContentLoaded', () => {
*/
function updateDiceVisibility(tid, visible) {
let div = document.getElementById(`launch-dice-${tid}`)
if (visible)
let div_debug = document.getElementById(`debug-dice-form-${tid}`)
if (visible) {
div.classList.remove('d-none')
else
div_debug.classList.remove('d-none')
}
else {
div.classList.add('d-none')
div_debug.classList.add('d-none')
}
}
/**
@ -225,10 +252,15 @@ document.addEventListener('DOMContentLoaded', () => {
*/
function updateBoxVisibility(tid, visible) {
let div = document.getElementById(`draw-problem-${tid}`)
if (visible)
let div_debug = document.getElementById(`debug-problem-form-${tid}`)
if (visible) {
div.classList.remove('d-none')
else
div_debug.classList.remove('d-none')
}
else {
div.classList.add('d-none')
div_debug.classList.add('d-none')
}
}
/**
@ -582,6 +614,11 @@ document.addEventListener('DOMContentLoaded', () => {
let teamLi = document.getElementById(`recap-${tid}-round-${round}-team-${team}`)
if (teamLi !== null)
teamLi.classList.add('list-group-item-info')
let debugSpan = document.getElementById(`debug-problem-${tid}-team`)
if (debugSpan && team) {
debugSpan.innerText = team
}
}
/**

View File

@ -37,6 +37,7 @@
{% for td in tournament.draw.current_round.team_draws %}
<div class="col-md-1" style="order: {{ forloop.counter }};">
<div id="dice-{{ tournament.id }}-{{ td.participation.team.trigram }}"
data-team="{{ td.participation.team.trigram }}"
class="badge rounded-pill text-bg-{% if td.last_dice %}success{% else %}warning{% endif %}"
{% if request.user.registration.is_volunteer %}
{# Volunteers can click on dices to launch the dice of a team #}
@ -186,6 +187,66 @@
{% endif %}
{% endif %}
</div>
{% if user.registration.is_admin %}
<div class="card my-3">
<div class="card-header">
<div style="cursor: pointer;" data-bs-toggle="collapse" data-bs-target="#debug-draw-{{ tournament.id }}-body"
aria-controls="debug-draw-{{ tournament.id }}-body" aria-expanded="false">
<h4>{% trans "Debug draw" %}</h4>
</div>
</div>
<div class="card-body collapse" id="debug-draw-{{ tournament.id }}-body">
<div id="debug-dice-form-{{ tournament.id }}" {% if tournament.draw.get_state != 'DICE_SELECT_POULES' and tournament.draw.get_state != 'DICE_ORDER_POULE' %}class="d-none"{% endif %}>
<h5>
{% trans "Draw dice for" %}
<span id="debug-dice-{{ tournament.id }}-team">
{% regroup tournament.draw.current_round.team_draws by last_dice as td_dices %}
{% for group in td_dices %}
{% if group.grouper is None %}
{{ group }}
{% with group.list|first as td %}
{{ td.participation.team.trigram }}
{% endwith %}
{% endif %}
{% endfor %}
</span>
</h5>
<div class="btn-group w-100" role="group">
{% for i in range_100 %}
<input type="radio" class="btn-check" name="debug-dice-{{ tournament.id }}-10" id="debug-dice-{{ tournament.id }}-{{ i|stringformat:"02d" }}" value="{{ i }}" {% if i == 0 %}checked{% endif %}>
<label class="btn btn-outline-warning" for="debug-dice-{{ tournament.id }}-{{ i|stringformat:"02d" }}">{{ i|stringformat:"02d" }}</label>
{% endfor %}
</div>
<div class="btn-group w-100" role="group">
{% for i in range_10 %}
<input type="radio" class="btn-check" name="debug-dice-{{ tournament.id }}-1" id="debug-dice-{{ tournament.id }}-{{ i }}" value="{{ i }}" {% if i == 0 %}checked{% endif %}>
<label class="btn btn-outline-warning" for="debug-dice-{{ tournament.id }}-{{ i }}">{{ i }}</label>
{% endfor %}
</div>
<div class="my-2 text-center">
<button class="btn btn-success" onclick="drawDebugDice({{ tournament.id }})">
{% trans "Draw dice" %} 🎲
</button>
</div>
</div>
<div id="debug-problem-form-{{ tournament.id }}" {% if tournament.draw.get_state != 'WAITING_DRAW_PROBLEM' %}class="d-none"{% endif %}>
<h5>
{% trans "Draw problem for" %}
<span id="debug-problem-{{ tournament.id }}-team">{{ tournament.draw.current_round.current_pool.current_team.participation.team.trigram }}</span>
</h5>
<div class="btn-group w-100" role="group">
{% for problem in problems %}
<button class="btn btn-outline-info" id="debug-problem-{{ tournament.id }}-{{ forloop.counter }}" onclick="drawProblem({{ tournament.id }}, {{ forloop.counter }})">
{% trans "Pb." %} {{ forloop.counter }}
</button>
{% endfor %}
</div>
</div>
</div>
</div>
{% endif %}
</div>
</div>

View File

@ -40,4 +40,7 @@ class DisplayView(LoginRequiredMixin, TemplateView):
context['tournaments_simplified'] = [{'id': t.id, 'name': t.name} for t in tournaments]
context['problems'] = settings.PROBLEMS
context['range_100'] = range(0, 100, 10)
context['range_10'] = range(0, 10, 1)
return context

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: TFJM\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-04-18 15:04+0200\n"
"POT-Creation-Date: 2024-04-22 23:36+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Emmy D'Anello <emmy.danello@animath.fr>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -30,14 +30,14 @@ msgstr "équipes"
#: draw/admin.py:53 draw/admin.py:71 draw/admin.py:88 draw/models.py:26
#: participation/admin.py:79 participation/admin.py:140
#: participation/admin.py:171 participation/models.py:693
#: participation/models.py:717 participation/models.py:937
#: participation/models.py:717 participation/models.py:935
#: registration/models.py:756
#: registration/templates/registration/payment_form.html:53
msgid "tournament"
msgstr "tournoi"
#: draw/admin.py:92 draw/models.py:234 draw/models.py:448
#: participation/models.py:941
#: participation/models.py:939
msgid "round"
msgstr "tour"
@ -76,9 +76,9 @@ msgstr "Le tirage a commencé !"
msgid "The draw for the tournament {tournament} will start."
msgstr "Le tirage au sort du tournoi {tournament} va commencer."
#: draw/consumers.py:251 draw/consumers.py:277 draw/consumers.py:685
#: draw/consumers.py:902 draw/consumers.py:991 draw/consumers.py:1013
#: draw/consumers.py:1103 draw/templates/draw/tournament_content.html:5
#: draw/consumers.py:251 draw/consumers.py:277 draw/consumers.py:687
#: draw/consumers.py:904 draw/consumers.py:993 draw/consumers.py:1015
#: draw/consumers.py:1106 draw/templates/draw/tournament_content.html:5
msgid "The draw has not started yet."
msgstr "Le tirage au sort n'a pas encore commencé."
@ -87,8 +87,8 @@ msgstr "Le tirage au sort n'a pas encore commencé."
msgid "The draw for the tournament {tournament} is aborted."
msgstr "Le tirage au sort du tournoi {tournament} est annulé."
#: draw/consumers.py:304 draw/consumers.py:325 draw/consumers.py:620
#: draw/consumers.py:690 draw/consumers.py:907
#: draw/consumers.py:304 draw/consumers.py:325 draw/consumers.py:621
#: draw/consumers.py:692 draw/consumers.py:909
msgid "This is not the time for this."
msgstr "Ce n'est pas le moment pour cela."
@ -106,7 +106,7 @@ msgid "Dices from teams {teams} are identical. Please relaunch your dices."
msgstr ""
"Les dés des équipes {teams} sont identiques. Merci de relancer vos dés."
#: draw/consumers.py:1016
#: draw/consumers.py:1018
msgid "This is only available for the final tournament."
msgstr "Cela n'est possible que pour la finale."
@ -175,7 +175,7 @@ msgstr "La poule en cours, où les équipes choisissent leurs problèmes"
msgid "rounds"
msgstr "tours"
#: draw/models.py:257 participation/models.py:949
#: draw/models.py:257 participation/models.py:947
msgid "letter"
msgstr "lettre"
@ -214,17 +214,17 @@ msgid "Pool {letter}{number}"
msgstr "Poule {letter}{number}"
#: draw/models.py:429 draw/models.py:456 participation/admin.py:136
#: participation/admin.py:155 participation/models.py:1429
#: participation/models.py:1438 participation/tables.py:84
#: participation/admin.py:155 participation/models.py:1434
#: participation/models.py:1443 participation/tables.py:84
msgid "pool"
msgstr "poule"
#: draw/models.py:430 participation/models.py:1430
#: draw/models.py:430 participation/models.py:1435
msgid "pools"
msgstr "poules"
#: draw/models.py:442 participation/models.py:927 participation/models.py:1579
#: participation/models.py:1609 participation/models.py:1651
#: draw/models.py:442 participation/models.py:925 participation/models.py:1584
#: participation/models.py:1614 participation/models.py:1656
msgid "participation"
msgstr "participation"
@ -248,8 +248,8 @@ msgid ""
msgstr ""
"L'ordre de choix dans la poule, entre 0 et la taille de la poule moins 1."
#: draw/models.py:479 draw/models.py:502 participation/models.py:1452
#: participation/models.py:1616
#: draw/models.py:479 draw/models.py:502 participation/models.py:1457
#: participation/models.py:1621
#, python-brace-format
msgid "Problem #{problem}"
msgstr "Problème n°{problem}"
@ -303,35 +303,56 @@ msgstr "Démarrer !"
msgid "Last dices"
msgstr "Derniers jets de dés"
#: draw/templates/draw/tournament_content.html:61
#: draw/templates/draw/tournament_content.html:62
msgid "Cancel last step"
msgstr "Annuler la dernière étape"
#: draw/templates/draw/tournament_content.html:136
#: draw/templates/draw/tournament_content.html:137
msgid "Launch dice"
msgstr "Lancer le dé"
#: draw/templates/draw/tournament_content.html:150
#: draw/templates/draw/tournament_content.html:151
msgid "Draw a problem"
msgstr "Tirer un problème"
#: draw/templates/draw/tournament_content.html:161
#: draw/templates/draw/tournament_content.html:162
msgid "Accept"
msgstr "Accepter"
#: draw/templates/draw/tournament_content.html:164
#: draw/templates/draw/tournament_content.html:165
msgid "Decline"
msgstr "Refuser"
#: draw/templates/draw/tournament_content.html:175
#: draw/templates/draw/tournament_content.html:176
msgid "Export"
msgstr "Exporter"
#: draw/templates/draw/tournament_content.html:183
#: draw/templates/draw/tournament_content.html:184
msgid "Continue draw"
msgstr "Continuer le tirage"
#: draw/templates/draw/tournament_content.html:216 participation/admin.py:167
#: draw/templates/draw/tournament_content.html:196
msgid "Debug draw"
msgstr "Débugguer le tirage"
#: draw/templates/draw/tournament_content.html:202
msgid "Draw dice for"
msgstr "Tirer un dé pour"
#: draw/templates/draw/tournament_content.html:230
msgid "Draw dice"
msgstr "Tirer le dé"
#: draw/templates/draw/tournament_content.html:236
msgid "Draw problem for"
msgstr "Tirer un problème pour"
#: draw/templates/draw/tournament_content.html:242
#: participation/templates/participation/note_form.html:9
msgid "Pb."
msgstr "Pb."
#: draw/templates/draw/tournament_content.html:277 participation/admin.py:167
#: participation/models.py:252 participation/models.py:708
#: participation/templates/participation/tournament_harmonize.html:15
#: registration/models.py:157 registration/models.py:747
@ -340,36 +361,36 @@ msgstr "Continuer le tirage"
msgid "team"
msgstr "équipe"
#: draw/templates/draw/tournament_content.html:226
#: draw/templates/draw/tournament_content.html:227
#: draw/templates/draw/tournament_content.html:228
#: draw/templates/draw/tournament_content.html:229
#: draw/templates/draw/tournament_content.html:230
#: draw/templates/draw/tournament_content.html:287
#: draw/templates/draw/tournament_content.html:288
#: draw/templates/draw/tournament_content.html:289
#: draw/templates/draw/tournament_content.html:290
#: draw/templates/draw/tournament_content.html:291
msgid "Room"
msgstr "Salle"
#: draw/templates/draw/tournament_content.html:334
#: draw/templates/draw/tournament_content.html:353
#: draw/templates/draw/tournament_content.html:395
#: draw/templates/draw/tournament_content.html:414
msgid "Abort"
msgstr "Annuler"
#: draw/templates/draw/tournament_content.html:344
#: draw/templates/draw/tournament_content.html:405
msgid "Are you sure?"
msgstr "Êtes-vous sûr⋅e ?"
#: draw/templates/draw/tournament_content.html:348
#: draw/templates/draw/tournament_content.html:409
msgid "This will reset the draw from the beginning."
msgstr "Cela va réinitialiser le tirage au sort depuis le début."
#: draw/templates/draw/tournament_content.html:349
#: draw/templates/draw/tournament_content.html:410
msgid "This operation is irreversible."
msgstr "Cette opération est irréversible."
#: draw/templates/draw/tournament_content.html:350
#: draw/templates/draw/tournament_content.html:411
msgid "Are you sure you want to abort this draw?"
msgstr "Êtes-vous sûr·e de vouloir annuler le tirage au sort ?"
#: draw/templates/draw/tournament_content.html:354
#: draw/templates/draw/tournament_content.html:415
#: tfjm/templates/base_modal.html:17
msgid "Close"
msgstr "Fermer"
@ -453,21 +474,21 @@ msgid "selected for final"
msgstr "sélectionnée pour la finale"
#: participation/admin.py:124 participation/admin.py:183
#: participation/models.py:1459 participation/tables.py:112
#: participation/models.py:1464 participation/tables.py:112
msgid "defender"
msgstr "défenseur⋅se"
#: participation/admin.py:128 participation/models.py:1466
#: participation/models.py:1663
#: participation/admin.py:128 participation/models.py:1471
#: participation/models.py:1668
msgid "opponent"
msgstr "opposant⋅e"
#: participation/admin.py:132 participation/models.py:1473
#: participation/models.py:1664
#: participation/admin.py:132 participation/models.py:1478
#: participation/models.py:1669
msgid "reporter"
msgstr "rapporteur⋅rice"
#: participation/admin.py:187 participation/models.py:1614
#: participation/admin.py:187 participation/models.py:1619
msgid "problem"
msgstr "numéro de problème"
@ -547,17 +568,11 @@ 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: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:310
#: participation/forms.py:308
msgid "The following note is higher of the maximum expected value:"
msgstr "La note suivante est supérieure au maximum attendu :"
#: participation/forms.py:316
#: participation/forms.py:314
msgid "The following user was not found:"
msgstr "L'utilisateur⋅rice suivant n'a pas été trouvé :"
@ -887,7 +902,7 @@ msgstr ""
msgid "Draw of solutions"
msgstr "Tirage au sort des solutions"
#: participation/models.py:830
#: participation/models.py:829
#, python-brace-format
msgid ""
"<p>The solutions draw is ended. You can check the result on <a "
@ -899,7 +914,7 @@ msgstr ""
"tour, vous défendrez <a href='{solution_url}'>votre solution du problème "
"{problem}</a>.</p>"
#: participation/models.py:839 participation/models.py:882
#: participation/models.py:838 participation/models.py:880
#, python-brace-format
msgid ""
"<p>You will oppose the solution of the team {opponent} on the <a "
@ -910,7 +925,7 @@ msgstr ""
"href='{solution_url}'>problème {problem}</a>. Vous pouvez envoyer votre note "
"de synthèse sur <a href='{passage_url}'>cette page</a>.</p>"
#: participation/models.py:848 participation/models.py:891
#: participation/models.py:847 participation/models.py:889
#, python-brace-format
msgid ""
"<p>You will report the solution of the team {reporter} on the <a "
@ -921,11 +936,11 @@ msgstr ""
"href='{solution_url}'>problème {problem}</a>. Vous pouvez envoyer votre note "
"de synthèse sur <a href='{passage_url}'>cette page</a>.</p>"
#: participation/models.py:864 registration/models.py:622
#: participation/models.py:863 registration/models.py:622
msgid "First round"
msgstr "Premier tour"
#: participation/models.py:875
#: participation/models.py:873
#, python-brace-format
msgid ""
"<p>For the second round, you will defend <a href='{solution_url}'>your "
@ -934,11 +949,11 @@ msgstr ""
"<p>Pour le second tour, vous défendrez <a href='{solution_url}'>votre "
"solution du problème {problem}</a>.</p>"
#: participation/models.py:907 registration/models.py:633
#: participation/models.py:905 registration/models.py:633
msgid "Second round"
msgstr "Second tour"
#: participation/models.py:913
#: participation/models.py:911
#, python-brace-format
msgid ""
"<p>The tournament {tournament} is ended. You can check the results on the <a "
@ -947,56 +962,56 @@ msgstr ""
"<p>Le tournoi {tournament} est terminé. Vous pouvez consulter les résultats "
"sur la <a href='{url}'>page du tournoi</a>.</p>"
#: participation/models.py:918
#: participation/models.py:916
msgid "Tournament ended"
msgstr "Tournoi terminé"
#: participation/models.py:928 participation/models.py:971
#: participation/models.py:926 participation/models.py:969
msgid "participations"
msgstr "participations"
#: participation/models.py:943 participation/models.py:944
#: participation/models.py:941 participation/models.py:942
#, python-brace-format
msgid "Round {round}"
msgstr "Tour {round}"
#: participation/models.py:959
#: participation/models.py:957
msgid "room"
msgstr "salle"
#: participation/models.py:961
#: participation/models.py:959
msgid "Room 1"
msgstr "Salle 1"
#: participation/models.py:962
#: participation/models.py:960
msgid "Room 2"
msgstr "Salle 2"
#: participation/models.py:965
#: participation/models.py:963
msgid "For 5-teams pools only"
msgstr "Pour les poules de 5 équipe uniquement"
#: participation/models.py:977
#: participation/models.py:975
msgid "juries"
msgstr "jurys"
#: participation/models.py:986
#: participation/models.py:984
msgid "president of the jury"
msgstr "président⋅e du jury"
#: participation/models.py:993
#: participation/models.py:991
msgid "BigBlueButton URL"
msgstr "Lien BigBlueButton"
#: participation/models.py:994
#: participation/models.py:992
msgid "The link of the BBB visio for this pool."
msgstr "Le lien du salon BBB pour cette poule."
#: participation/models.py:999
#: participation/models.py:997
msgid "results available"
msgstr "résultats disponibles"
#: participation/models.py:1000
#: participation/models.py:998
msgid ""
"Check this case when results become accessible to teams. They stay "
"accessible to you. Only averages are given."
@ -1005,33 +1020,33 @@ msgstr ""
"Ils restent toujours accessibles pour vous. Seules les moyennes sont "
"communiquées."
#: participation/models.py:1028
#: participation/models.py:1026
msgid "The president of the jury must be part of the jury."
msgstr "Læ président⋅e du jury doit faire partie du jury."
#: participation/models.py:1410
#: participation/models.py:1415
#, python-brace-format
msgid "The jury {jury} is not part of the jury for this pool."
msgstr "{jury} ne fait pas partie du jury pour cette poule."
#: participation/models.py:1423
#: participation/models.py:1428
#, python-brace-format
msgid "Pool {code} for tournament {tournament} with teams {teams}"
msgstr "Poule {code} du tournoi {tournament} avec les équipes {teams}"
#: participation/models.py:1443
#: participation/models.py:1448
msgid "position"
msgstr "position"
#: participation/models.py:1450
#: participation/models.py:1455
msgid "defended solution"
msgstr "solution défendue"
#: participation/models.py:1478
#: participation/models.py:1483
msgid "penalties"
msgstr "pénalités"
#: participation/models.py:1480
#: participation/models.py:1485
msgid ""
"Number of penalties for the defender. The defender will loose a 0.5 "
"coefficient per penalty."
@ -1039,120 +1054,120 @@ msgstr ""
"Nombre de pénalités pour l'équipe défenseuse. Elle perd un coefficient 0.5 "
"sur sa présentation orale par pénalité."
#: participation/models.py:1549 participation/models.py:1552
#: participation/models.py:1555
#: participation/models.py:1554 participation/models.py:1557
#: participation/models.py:1560
#, python-brace-format
msgid "Team {trigram} is not registered in the pool."
msgstr "L'équipe {trigram} n'est pas inscrite dans la poule."
#: participation/models.py:1560
#: participation/models.py:1565
#, python-brace-format
msgid "Passage of {defender} for problem {problem}"
msgstr "Passage de {defender} pour le problème {problem}"
#: participation/models.py:1564 participation/models.py:1573
#: participation/models.py:1658 participation/models.py:1700
#: participation/models.py:1569 participation/models.py:1578
#: participation/models.py:1663 participation/models.py:1705
msgid "passage"
msgstr "passage"
#: participation/models.py:1565
#: participation/models.py:1570
msgid "passages"
msgstr "passages"
#: participation/models.py:1584
#: participation/models.py:1589
msgid "difference"
msgstr "différence"
#: participation/models.py:1585
#: participation/models.py:1590
msgid "Score to add/remove on the final score"
msgstr "Score à ajouter/retrancher au score final"
#: participation/models.py:1592
#: participation/models.py:1597
msgid "tweak"
msgstr "harmonisation"
#: participation/models.py:1593
#: participation/models.py:1598
msgid "tweaks"
msgstr "harmonisations"
#: participation/models.py:1621
#: participation/models.py:1626
msgid "solution for the final tournament"
msgstr "solution pour la finale"
#: participation/models.py:1626 participation/models.py:1669
#: participation/models.py:1631 participation/models.py:1674
msgid "file"
msgstr "fichier"
#: participation/models.py:1636
#: participation/models.py:1641
#, python-brace-format
msgid "Solution of team {team} for problem {problem}"
msgstr "Solution de l'équipe {team} pour le problème {problem}"
#: participation/models.py:1638
#: participation/models.py:1643
msgid "for final"
msgstr "pour la finale"
#: participation/models.py:1641
#: participation/models.py:1646
msgid "solution"
msgstr "solution"
#: participation/models.py:1642
#: participation/models.py:1647
msgid "solutions"
msgstr "solutions"
#: participation/models.py:1675
#: participation/models.py:1680
#, python-brace-format
msgid "Synthesis of {team} as {type} for problem {problem} of {defender}"
msgstr ""
"Note de synthèse de l'équipe {team} en tant que {type} pour le problème "
"{problem} de {defender}"
#: participation/models.py:1683
#: participation/models.py:1688
msgid "synthesis"
msgstr "note de synthèse"
#: participation/models.py:1684
#: participation/models.py:1689
msgid "syntheses"
msgstr "notes de synthèse"
#: participation/models.py:1693
#: participation/models.py:1698
msgid "jury"
msgstr "jury"
#: participation/models.py:1705
#: participation/models.py:1710
msgid "defender writing note"
msgstr "note d'écrit défenseur⋅se"
#: participation/models.py:1711
#: participation/models.py:1716
msgid "defender oral note"
msgstr "note d'oral défenseur⋅se"
#: participation/models.py:1717
#: participation/models.py:1722
msgid "opponent writing note"
msgstr "note d'écrit opposant⋅e"
#: participation/models.py:1723
#: participation/models.py:1728
msgid "opponent oral note"
msgstr "note d'oral opposant⋅e"
#: participation/models.py:1729
#: participation/models.py:1734
msgid "reporter writing note"
msgstr "note d'écrit rapporteur⋅rice"
#: participation/models.py:1735
#: participation/models.py:1740
msgid "reporter oral note"
msgstr "note d'oral du rapporteur⋅rice"
#: participation/models.py:1793
#: participation/models.py:1800
#, python-brace-format
msgid "Notes of {jury} for {passage}"
msgstr "Notes de {jury} pour le {passage}"
#: participation/models.py:1796
#: participation/models.py:1803
msgid "note"
msgstr "note"
#: participation/models.py:1797
#: participation/models.py:1804
msgid "notes"
msgstr "notes"
@ -1233,10 +1248,6 @@ msgstr "Notes de"
msgid "Defense of"
msgstr "Défense de"
#: participation/templates/participation/note_form.html:9
msgid "Pb."
msgstr "Pb."
#: participation/templates/participation/participation_detail.html:6
#: participation/templates/participation/participation_detail.html:21
#: participation/templates/participation/passage_detail.html:6
@ -2018,84 +2029,84 @@ msgstr "Harmoniser les notes de {tournament} - Jour {round}"
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:1011
#: participation/views.py:1014
#, python-brace-format
msgid "Solutions of team {trigram}.zip"
msgstr "Solutions de l'équipe {trigram}.zip"
#: participation/views.py:1011
#: participation/views.py:1014
#, python-brace-format
msgid "Syntheses of team {trigram}.zip"
msgstr "Notes de synthèse de l'équipe {trigram}.zip"
#: participation/views.py:1028 participation/views.py:1043
#: participation/views.py:1031 participation/views.py:1046
#, python-brace-format
msgid "Solutions of {tournament}.zip"
msgstr "Solutions de {tournament}.zip"
#: participation/views.py:1028 participation/views.py:1043
#: participation/views.py:1031 participation/views.py:1046
#, python-brace-format
msgid "Syntheses of {tournament}.zip"
msgstr "Notes de synthèse de {tournament}.zip"
#: participation/views.py:1052
#: participation/views.py:1055
#, 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:1053
#: participation/views.py:1056
#, 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:1095
#: participation/views.py:1098
#, python-brace-format
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:1111
#: participation/views.py:1114
#, python-brace-format
msgid "The jury {name} is already in the pool!"
msgstr "{name} est déjà dans la poule !"
#: participation/views.py:1131
#: participation/views.py:1134
msgid "New TFJM² jury account"
msgstr "Nouveau compte de juré⋅e pour le TFJM²"
#: participation/views.py:1152
#: participation/views.py:1155
#, 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:1188
#: participation/views.py:1191
#, 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:1214
#: participation/views.py:1217
#, python-brace-format
msgid "The jury {name} has been successfully promoted president!"
msgstr "{name} a été nommé⋅e président⋅e du jury !"
#: participation/views.py:1242
#: participation/views.py:1245
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:1258
#: participation/views.py:1261
msgid "Notes were successfully uploaded."
msgstr "Les notes ont bien été envoyées."
#: participation/views.py:1825
#: participation/views.py:1839
#, python-brace-format
msgid "Notation sheets of pool {pool} of {tournament}.zip"
msgstr "Feuilles de notations pour la poule {pool} du tournoi {tournament}.zip"
#: participation/views.py:1830
#: participation/views.py:1844
#, python-brace-format
msgid "Notation sheets of {tournament}.zip"
msgstr "Feuilles de notation de {tournament}.zip"
#: participation/views.py:1995
#: participation/views.py:2009
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."
@ -3634,3 +3645,8 @@ msgstr "Aucun résultat."
#: tfjm/templates/sidebar.html:10 tfjm/templates/sidebar.html:21
msgid "Informations"
msgstr "Informations"
#~ 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 ?"