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)): and isinstance(kwargs['problem'], int) and (1 <= kwargs['problem'] <= len(settings.PROBLEMS)):
# Admins can force the draw # Admins can force the draw
problem = int(kwargs['problem']) problem = int(kwargs['problem'])
break
# Check that the user didn't already accept this problem for the first round # Check that the user didn't already accept this problem for the first round
# if this is the second 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. 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 @property
def trigrams(self) -> list[str]: def trigrams(self) -> list[str]:
@ -545,4 +545,5 @@ class TeamDraw(models.Model):
class Meta: class Meta:
verbose_name = _('team draw') verbose_name = _('team draw')
verbose_name_plural = _('team draws') 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})) 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. * Request to draw a new problem.
* @param tid The tournament id * @param tid The tournament id
@ -203,6 +217,14 @@ document.addEventListener('DOMContentLoaded', () => {
elem.classList.add('text-bg-success') elem.classList.add('text-bg-success')
elem.innerText = `${trigram} 🎲 ${result}` 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) { function updateDiceVisibility(tid, visible) {
let div = document.getElementById(`launch-dice-${tid}`) 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') div.classList.remove('d-none')
else div_debug.classList.remove('d-none')
}
else {
div.classList.add('d-none') div.classList.add('d-none')
div_debug.classList.add('d-none')
}
} }
/** /**
@ -225,10 +252,15 @@ document.addEventListener('DOMContentLoaded', () => {
*/ */
function updateBoxVisibility(tid, visible) { function updateBoxVisibility(tid, visible) {
let div = document.getElementById(`draw-problem-${tid}`) 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') div.classList.remove('d-none')
else div_debug.classList.remove('d-none')
}
else {
div.classList.add('d-none') 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}`) let teamLi = document.getElementById(`recap-${tid}-round-${round}-team-${team}`)
if (teamLi !== null) if (teamLi !== null)
teamLi.classList.add('list-group-item-info') 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 %} {% for td in tournament.draw.current_round.team_draws %}
<div class="col-md-1" style="order: {{ forloop.counter }};"> <div class="col-md-1" style="order: {{ forloop.counter }};">
<div id="dice-{{ tournament.id }}-{{ td.participation.team.trigram }}" <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 %}" class="badge rounded-pill text-bg-{% if td.last_dice %}success{% else %}warning{% endif %}"
{% if request.user.registration.is_volunteer %} {% if request.user.registration.is_volunteer %}
{# Volunteers can click on dices to launch the dice of a team #} {# Volunteers can click on dices to launch the dice of a team #}
@ -186,6 +187,66 @@
{% endif %} {% endif %}
{% endif %} {% endif %}
</div> </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>
</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['tournaments_simplified'] = [{'id': t.id, 'name': t.name} for t in tournaments]
context['problems'] = settings.PROBLEMS context['problems'] = settings.PROBLEMS
context['range_100'] = range(0, 100, 10)
context['range_10'] = range(0, 10, 1)
return context return context

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-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" "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"
@ -30,14 +30,14 @@ msgstr "équipes"
#: draw/admin.py:53 draw/admin.py:71 draw/admin.py:88 draw/models.py:26 #: 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:79 participation/admin.py:140
#: participation/admin.py:171 participation/models.py:693 #: 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/models.py:756
#: registration/templates/registration/payment_form.html:53 #: registration/templates/registration/payment_form.html:53
msgid "tournament" msgid "tournament"
msgstr "tournoi" msgstr "tournoi"
#: 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:941 #: participation/models.py:939
msgid "round" msgid "round"
msgstr "tour" msgstr "tour"
@ -76,9 +76,9 @@ msgstr "Le tirage a commencé !"
msgid "The draw for the tournament {tournament} will start." msgid "The draw for the tournament {tournament} will start."
msgstr "Le tirage au sort du tournoi {tournament} va commencer." 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:251 draw/consumers.py:277 draw/consumers.py:687
#: draw/consumers.py:902 draw/consumers.py:991 draw/consumers.py:1013 #: draw/consumers.py:904 draw/consumers.py:993 draw/consumers.py:1015
#: draw/consumers.py:1103 draw/templates/draw/tournament_content.html:5 #: draw/consumers.py:1106 draw/templates/draw/tournament_content.html:5
msgid "The draw has not started yet." msgid "The draw has not started yet."
msgstr "Le tirage au sort n'a pas encore commencé." 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." msgid "The draw for the tournament {tournament} is aborted."
msgstr "Le tirage au sort du tournoi {tournament} est annulé." 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:304 draw/consumers.py:325 draw/consumers.py:621
#: draw/consumers.py:690 draw/consumers.py:907 #: draw/consumers.py:692 draw/consumers.py:909
msgid "This is not the time for this." msgid "This is not the time for this."
msgstr "Ce n'est pas le moment pour cela." 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 "" msgstr ""
"Les dés des équipes {teams} sont identiques. Merci de relancer vos dés." "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." msgid "This is only available for the final tournament."
msgstr "Cela n'est possible que pour la finale." 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" msgid "rounds"
msgstr "tours" msgstr "tours"
#: draw/models.py:257 participation/models.py:949 #: draw/models.py:257 participation/models.py:947
msgid "letter" msgid "letter"
msgstr "lettre" msgstr "lettre"
@ -214,17 +214,17 @@ msgid "Pool {letter}{number}"
msgstr "Poule {letter}{number}" msgstr "Poule {letter}{number}"
#: draw/models.py:429 draw/models.py:456 participation/admin.py:136 #: draw/models.py:429 draw/models.py:456 participation/admin.py:136
#: participation/admin.py:155 participation/models.py:1429 #: participation/admin.py:155 participation/models.py:1434
#: participation/models.py:1438 participation/tables.py:84 #: participation/models.py:1443 participation/tables.py:84
msgid "pool" msgid "pool"
msgstr "poule" msgstr "poule"
#: draw/models.py:430 participation/models.py:1430 #: draw/models.py:430 participation/models.py:1435
msgid "pools" msgid "pools"
msgstr "poules" msgstr "poules"
#: draw/models.py:442 participation/models.py:927 participation/models.py:1579 #: draw/models.py:442 participation/models.py:925 participation/models.py:1584
#: participation/models.py:1609 participation/models.py:1651 #: participation/models.py:1614 participation/models.py:1656
msgid "participation" msgid "participation"
msgstr "participation" msgstr "participation"
@ -248,8 +248,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:1452 #: draw/models.py:479 draw/models.py:502 participation/models.py:1457
#: participation/models.py:1616 #: participation/models.py:1621
#, python-brace-format #, python-brace-format
msgid "Problem #{problem}" msgid "Problem #{problem}"
msgstr "Problème n°{problem}" msgstr "Problème n°{problem}"
@ -303,35 +303,56 @@ msgstr "Démarrer !"
msgid "Last dices" msgid "Last dices"
msgstr "Derniers jets de dés" msgstr "Derniers jets de dés"
#: draw/templates/draw/tournament_content.html:61 #: draw/templates/draw/tournament_content.html:62
msgid "Cancel last step" msgid "Cancel last step"
msgstr "Annuler la dernière étape" msgstr "Annuler la dernière étape"
#: draw/templates/draw/tournament_content.html:136 #: draw/templates/draw/tournament_content.html:137
msgid "Launch dice" msgid "Launch dice"
msgstr "Lancer le dé" msgstr "Lancer le dé"
#: draw/templates/draw/tournament_content.html:150 #: draw/templates/draw/tournament_content.html:151
msgid "Draw a problem" msgid "Draw a problem"
msgstr "Tirer un problème" msgstr "Tirer un problème"
#: draw/templates/draw/tournament_content.html:161 #: draw/templates/draw/tournament_content.html:162
msgid "Accept" msgid "Accept"
msgstr "Accepter" msgstr "Accepter"
#: draw/templates/draw/tournament_content.html:164 #: draw/templates/draw/tournament_content.html:165
msgid "Decline" msgid "Decline"
msgstr "Refuser" msgstr "Refuser"
#: draw/templates/draw/tournament_content.html:175 #: draw/templates/draw/tournament_content.html:176
msgid "Export" msgid "Export"
msgstr "Exporter" msgstr "Exporter"
#: draw/templates/draw/tournament_content.html:183 #: draw/templates/draw/tournament_content.html:184
msgid "Continue draw" msgid "Continue draw"
msgstr "Continuer le tirage" 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/models.py:252 participation/models.py:708
#: 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
@ -340,36 +361,36 @@ msgstr "Continuer le tirage"
msgid "team" msgid "team"
msgstr "équipe" msgstr "équipe"
#: draw/templates/draw/tournament_content.html:226 #: draw/templates/draw/tournament_content.html:287
#: draw/templates/draw/tournament_content.html:227 #: draw/templates/draw/tournament_content.html:288
#: draw/templates/draw/tournament_content.html:228 #: draw/templates/draw/tournament_content.html:289
#: draw/templates/draw/tournament_content.html:229 #: draw/templates/draw/tournament_content.html:290
#: draw/templates/draw/tournament_content.html:230 #: draw/templates/draw/tournament_content.html:291
msgid "Room" msgid "Room"
msgstr "Salle" msgstr "Salle"
#: draw/templates/draw/tournament_content.html:334 #: draw/templates/draw/tournament_content.html:395
#: draw/templates/draw/tournament_content.html:353 #: draw/templates/draw/tournament_content.html:414
msgid "Abort" msgid "Abort"
msgstr "Annuler" msgstr "Annuler"
#: draw/templates/draw/tournament_content.html:344 #: draw/templates/draw/tournament_content.html:405
msgid "Are you sure?" msgid "Are you sure?"
msgstr "Êtes-vous sûr⋅e ?" 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." msgid "This will reset the draw from the beginning."
msgstr "Cela va réinitialiser le tirage au sort depuis le début." 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." msgid "This operation is irreversible."
msgstr "Cette opération est irréversible." 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?" msgid "Are you sure you want to abort this draw?"
msgstr "Êtes-vous sûr·e de vouloir annuler le tirage au sort ?" 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 #: tfjm/templates/base_modal.html:17
msgid "Close" msgid "Close"
msgstr "Fermer" msgstr "Fermer"
@ -453,21 +474,21 @@ 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:1459 participation/tables.py:112 #: participation/models.py:1464 participation/tables.py:112
msgid "defender" msgid "defender"
msgstr "défenseur⋅se" msgstr "défenseur⋅se"
#: participation/admin.py:128 participation/models.py:1466 #: participation/admin.py:128 participation/models.py:1471
#: participation/models.py:1663 #: participation/models.py:1668
msgid "opponent" msgid "opponent"
msgstr "opposant⋅e" msgstr "opposant⋅e"
#: participation/admin.py:132 participation/models.py:1473 #: participation/admin.py:132 participation/models.py:1478
#: participation/models.py:1664 #: participation/models.py:1669
msgid "reporter" msgid "reporter"
msgstr "rapporteur⋅rice" msgstr "rapporteur⋅rice"
#: participation/admin.py:187 participation/models.py:1614 #: participation/admin.py:187 participation/models.py:1619
msgid "problem" msgid "problem"
msgstr "numéro de problème" 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 " "Ce fichier contient des éléments non-UTF-8 et non-ISO-8859-1. Merci "
"d'envoyer votre tableur au format CSV." "d'envoyer votre tableur au format CSV."
#: participation/forms.py:290 #: participation/forms.py:308
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
msgid "The following note is higher of the maximum expected value:" msgid "The following note is higher of the maximum expected value:"
msgstr "La note suivante est supérieure au maximum attendu :" msgstr "La note suivante est supérieure au maximum attendu :"
#: participation/forms.py:316 #: participation/forms.py:314
msgid "The following user was not found:" msgid "The following user was not found:"
msgstr "L'utilisateur⋅rice suivant n'a pas été trouvé :" msgstr "L'utilisateur⋅rice suivant n'a pas été trouvé :"
@ -887,7 +902,7 @@ msgstr ""
msgid "Draw of solutions" msgid "Draw of solutions"
msgstr "Tirage au sort des solutions" msgstr "Tirage au sort des solutions"
#: participation/models.py:830 #: participation/models.py:829
#, 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 "
@ -899,7 +914,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:839 participation/models.py:882 #: participation/models.py:838 participation/models.py:880
#, 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 "
@ -910,7 +925,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:848 participation/models.py:891 #: participation/models.py:847 participation/models.py:889
#, 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 "
@ -921,11 +936,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:864 registration/models.py:622 #: participation/models.py:863 registration/models.py:622
msgid "First round" msgid "First round"
msgstr "Premier tour" msgstr "Premier tour"
#: participation/models.py:875 #: participation/models.py:873
#, 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 "
@ -934,11 +949,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:907 registration/models.py:633 #: participation/models.py:905 registration/models.py:633
msgid "Second round" msgid "Second round"
msgstr "Second tour" msgstr "Second tour"
#: participation/models.py:913 #: participation/models.py:911
#, 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 "
@ -947,56 +962,56 @@ 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:918 #: participation/models.py:916
msgid "Tournament ended" msgid "Tournament ended"
msgstr "Tournoi terminé" msgstr "Tournoi terminé"
#: participation/models.py:928 participation/models.py:971 #: participation/models.py:926 participation/models.py:969
msgid "participations" msgid "participations"
msgstr "participations" msgstr "participations"
#: participation/models.py:943 participation/models.py:944 #: participation/models.py:941 participation/models.py:942
#, python-brace-format #, python-brace-format
msgid "Round {round}" msgid "Round {round}"
msgstr "Tour {round}" msgstr "Tour {round}"
#: participation/models.py:959 #: participation/models.py:957
msgid "room" msgid "room"
msgstr "salle" msgstr "salle"
#: participation/models.py:961 #: participation/models.py:959
msgid "Room 1" msgid "Room 1"
msgstr "Salle 1" msgstr "Salle 1"
#: participation/models.py:962 #: participation/models.py:960
msgid "Room 2" msgid "Room 2"
msgstr "Salle 2" msgstr "Salle 2"
#: participation/models.py:965 #: participation/models.py:963
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:977 #: participation/models.py:975
msgid "juries" msgid "juries"
msgstr "jurys" msgstr "jurys"
#: participation/models.py:986 #: participation/models.py:984
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:993 #: participation/models.py:991
msgid "BigBlueButton URL" msgid "BigBlueButton URL"
msgstr "Lien BigBlueButton" msgstr "Lien BigBlueButton"
#: participation/models.py:994 #: participation/models.py:992
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:999 #: participation/models.py:997
msgid "results available" msgid "results available"
msgstr "résultats disponibles" msgstr "résultats disponibles"
#: participation/models.py:1000 #: participation/models.py:998
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."
@ -1005,33 +1020,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:1028 #: participation/models.py:1026
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:1410 #: participation/models.py:1415
#, 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:1423 #: participation/models.py:1428
#, 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:1443 #: participation/models.py:1448
msgid "position" msgid "position"
msgstr "position" msgstr "position"
#: participation/models.py:1450 #: participation/models.py:1455
msgid "defended solution" msgid "defended solution"
msgstr "solution défendue" msgstr "solution défendue"
#: participation/models.py:1478 #: participation/models.py:1483
msgid "penalties" msgid "penalties"
msgstr "pénalités" msgstr "pénalités"
#: participation/models.py:1480 #: participation/models.py:1485
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."
@ -1039,120 +1054,120 @@ 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:1549 participation/models.py:1552 #: participation/models.py:1554 participation/models.py:1557
#: participation/models.py:1555 #: participation/models.py:1560
#, 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:1560 #: participation/models.py:1565
#, 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:1564 participation/models.py:1573 #: participation/models.py:1569 participation/models.py:1578
#: participation/models.py:1658 participation/models.py:1700 #: participation/models.py:1663 participation/models.py:1705
msgid "passage" msgid "passage"
msgstr "passage" msgstr "passage"
#: participation/models.py:1565 #: participation/models.py:1570
msgid "passages" msgid "passages"
msgstr "passages" msgstr "passages"
#: participation/models.py:1584 #: participation/models.py:1589
msgid "difference" msgid "difference"
msgstr "différence" msgstr "différence"
#: participation/models.py:1585 #: participation/models.py:1590
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:1592 #: participation/models.py:1597
msgid "tweak" msgid "tweak"
msgstr "harmonisation" msgstr "harmonisation"
#: participation/models.py:1593 #: participation/models.py:1598
msgid "tweaks" msgid "tweaks"
msgstr "harmonisations" msgstr "harmonisations"
#: participation/models.py:1621 #: participation/models.py:1626
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:1626 participation/models.py:1669 #: participation/models.py:1631 participation/models.py:1674
msgid "file" msgid "file"
msgstr "fichier" msgstr "fichier"
#: participation/models.py:1636 #: participation/models.py:1641
#, 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:1638 #: participation/models.py:1643
msgid "for final" msgid "for final"
msgstr "pour la finale" msgstr "pour la finale"
#: participation/models.py:1641 #: participation/models.py:1646
msgid "solution" msgid "solution"
msgstr "solution" msgstr "solution"
#: participation/models.py:1642 #: participation/models.py:1647
msgid "solutions" msgid "solutions"
msgstr "solutions" msgstr "solutions"
#: participation/models.py:1675 #: participation/models.py:1680
#, 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:1683 #: participation/models.py:1688
msgid "synthesis" msgid "synthesis"
msgstr "note de synthèse" msgstr "note de synthèse"
#: participation/models.py:1684 #: participation/models.py:1689
msgid "syntheses" msgid "syntheses"
msgstr "notes de synthèse" msgstr "notes de synthèse"
#: participation/models.py:1693 #: participation/models.py:1698
msgid "jury" msgid "jury"
msgstr "jury" msgstr "jury"
#: participation/models.py:1705 #: participation/models.py:1710
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:1711 #: participation/models.py:1716
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:1717 #: participation/models.py:1722
msgid "opponent writing note" msgid "opponent writing note"
msgstr "note d'écrit opposant⋅e" msgstr "note d'écrit opposant⋅e"
#: participation/models.py:1723 #: participation/models.py:1728
msgid "opponent oral note" msgid "opponent oral note"
msgstr "note d'oral opposant⋅e" msgstr "note d'oral opposant⋅e"
#: participation/models.py:1729 #: participation/models.py:1734
msgid "reporter writing note" msgid "reporter writing note"
msgstr "note d'écrit rapporteur⋅rice" msgstr "note d'écrit rapporteur⋅rice"
#: participation/models.py:1735 #: participation/models.py:1740
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:1793 #: participation/models.py:1800
#, 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:1796 #: participation/models.py:1803
msgid "note" msgid "note"
msgstr "note" msgstr "note"
#: participation/models.py:1797 #: participation/models.py:1804
msgid "notes" msgid "notes"
msgstr "notes" msgstr "notes"
@ -1233,10 +1248,6 @@ msgstr "Notes de"
msgid "Defense of" msgid "Defense of"
msgstr "Défense de" 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:6
#: participation/templates/participation/participation_detail.html:21 #: participation/templates/participation/participation_detail.html:21
#: participation/templates/participation/passage_detail.html:6 #: 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." msgid "You can't upload a solution after the deadline."
msgstr "Vous ne pouvez pas envoyer de solution après la date limite." msgstr "Vous ne pouvez pas envoyer de solution après la date limite."
#: participation/views.py:1011 #: participation/views.py:1014
#, python-brace-format #, python-brace-format
msgid "Solutions of team {trigram}.zip" msgid "Solutions of team {trigram}.zip"
msgstr "Solutions de l'équipe {trigram}.zip" msgstr "Solutions de l'équipe {trigram}.zip"
#: participation/views.py:1011 #: participation/views.py:1014
#, python-brace-format #, python-brace-format
msgid "Syntheses of team {trigram}.zip" msgid "Syntheses of team {trigram}.zip"
msgstr "Notes de synthèse de l'équipe {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 #, python-brace-format
msgid "Solutions of {tournament}.zip" msgid "Solutions of {tournament}.zip"
msgstr "Solutions de {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 #, python-brace-format
msgid "Syntheses of {tournament}.zip" msgid "Syntheses of {tournament}.zip"
msgstr "Notes de synthèse de {tournament}.zip" msgstr "Notes de synthèse de {tournament}.zip"
#: participation/views.py:1052 #: participation/views.py:1055
#, python-brace-format #, python-brace-format
msgid "Solutions for pool {pool} of tournament {tournament}.zip" msgid "Solutions for pool {pool} of tournament {tournament}.zip"
msgstr "Solutions pour la poule {pool} du tournoi {tournament}.zip" msgstr "Solutions pour la poule {pool} du tournoi {tournament}.zip"
#: participation/views.py:1053 #: participation/views.py:1056
#, python-brace-format #, python-brace-format
msgid "Syntheses for pool {pool} of tournament {tournament}.zip" msgid "Syntheses for pool {pool} of tournament {tournament}.zip"
msgstr "Notes de synthèses pour la poule {pool} du tournoi {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 #, python-brace-format
msgid "Jury of pool {pool} for {tournament} with teams {teams}" msgid "Jury of pool {pool} for {tournament} with teams {teams}"
msgstr "Jury de la poule {pool} pour {tournament} avec les équipes {teams}" msgstr "Jury de la poule {pool} pour {tournament} avec les équipes {teams}"
#: participation/views.py:1111 #: participation/views.py:1114
#, python-brace-format #, python-brace-format
msgid "The jury {name} is already in the pool!" msgid "The jury {name} is already in the pool!"
msgstr "{name} est déjà dans la poule !" msgstr "{name} est déjà dans la poule !"
#: participation/views.py:1131 #: participation/views.py:1134
msgid "New TFJM² jury account" msgid "New TFJM² jury account"
msgstr "Nouveau compte de juré⋅e pour le TFJM²" msgstr "Nouveau compte de juré⋅e pour le TFJM²"
#: participation/views.py:1152 #: participation/views.py:1155
#, python-brace-format #, python-brace-format
msgid "The jury {name} has been successfully added!" msgid "The jury {name} has been successfully added!"
msgstr "{name} a été ajouté⋅e avec succès en tant que juré⋅e !" 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 #, python-brace-format
msgid "The jury {name} has been successfully removed!" msgid "The jury {name} has been successfully removed!"
msgstr "{name} a été retiré⋅e avec succès du jury !" msgstr "{name} a été retiré⋅e avec succès du jury !"
#: participation/views.py:1214 #: participation/views.py:1217
#, python-brace-format #, python-brace-format
msgid "The jury {name} has been successfully promoted president!" msgid "The jury {name} has been successfully promoted president!"
msgstr "{name} a été nommé⋅e président⋅e du jury !" 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:" msgid "The following user is not registered as a jury:"
msgstr "L'utilisateur⋅rice suivant n'est pas inscrit⋅e en tant que juré⋅e :" msgstr "L'utilisateur⋅rice suivant n'est pas inscrit⋅e en tant que juré⋅e :"
#: participation/views.py:1258 #: participation/views.py:1261
msgid "Notes were successfully uploaded." msgid "Notes were successfully uploaded."
msgstr "Les notes ont bien été envoyées." msgstr "Les notes ont bien été envoyées."
#: participation/views.py:1825 #: participation/views.py:1839
#, python-brace-format #, python-brace-format
msgid "Notation sheets of pool {pool} of {tournament}.zip" msgid "Notation sheets of pool {pool} of {tournament}.zip"
msgstr "Feuilles de notations pour la poule {pool} du tournoi {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 #, python-brace-format
msgid "Notation sheets of {tournament}.zip" msgid "Notation sheets of {tournament}.zip"
msgstr "Feuilles de notation de {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." msgid "You can't upload a synthesis after the deadline."
msgstr "Vous ne pouvez pas envoyer de note de synthèse après la date limite." msgstr "Vous ne pouvez pas envoyer de note de synthèse après la date limite."
@ -3634,3 +3645,8 @@ 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"
#~ 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 ?"