Add Abort button

Signed-off-by: Emmy D'Anello <emmy.danello@animath.fr>
This commit is contained in:
Emmy D'Anello 2023-03-24 12:29:24 +01:00
parent c9fcfcf498
commit 6b5c630048
Signed by: ynerant
GPG Key ID: 3A75C55819C8CF85
4 changed files with 172 additions and 146 deletions

View File

@ -67,19 +67,18 @@ class DrawConsumer(AsyncJsonWebsocketConsumer):
match content['type']: match content['type']:
case 'start_draw': case 'start_draw':
await self.start_draw(**content) await self.start_draw(**content)
case 'abort':
await self.abort(**content)
case 'dice': case 'dice':
await self.process_dice(**content) await self.process_dice(**content)
@ensure_orga @ensure_orga
async def start_draw(self, fmt, **kwargs): async def start_draw(self, fmt, **kwargs):
print(fmt, kwargs)
try: try:
fmt = list(map(int, fmt.split('+'))) fmt = list(map(int, fmt.split('+')))
except ValueError as e: except ValueError as e:
return await self.alert(_("Invalid format"), 'danger') return await self.alert(_("Invalid format"), 'danger')
print(fmt, sum(fmt), len(self.participations))
if sum(fmt) != len(self.participations): if sum(fmt) != len(self.participations):
return await self.alert( return await self.alert(
_("The sum must be equal to the number of teams: expected {len}, got {sum}")\ _("The sum must be equal to the number of teams: expected {len}, got {sum}")\
@ -117,6 +116,16 @@ class DrawConsumer(AsyncJsonWebsocketConsumer):
await self.send_json({'type': 'draw_start', 'fmt': content['fmt'], await self.send_json({'type': 'draw_start', 'fmt': content['fmt'],
'trigrams': [p.team.trigram for p in self.participations]}) 'trigrams': [p.team.trigram for p in self.participations]})
@ensure_orga
async def abort(self, **kwargs):
await sync_to_async(self.tournament.draw.delete)()
await self.channel_layer.group_send(f"tournament-{self.tournament.id}", {'type': 'draw_abort'})
async def draw_abort(self, content):
await self.alert(_("The draw for the tournament {tournament} is aborted.")\
.format(tournament=self.tournament.name), 'danger')
await self.send_json({'type': 'abort'})
async def process_dice(self, trigram: str | None = None, **kwargs): async def process_dice(self, trigram: str | None = None, **kwargs):
if self.registration.is_volunteer: if self.registration.is_volunteer:

View File

@ -8,6 +8,10 @@ const sockets = {}
const messages = document.getElementById('messages') const messages = document.getElementById('messages')
function abortDraw(tid) {
sockets[tid].send(JSON.stringify({'type': 'abort'}))
}
function drawDice(tid, trigram = null) { function drawDice(tid, trigram = null) {
sockets[tid].send(JSON.stringify({'type': 'dice', 'trigram': trigram})) sockets[tid].send(JSON.stringify({'type': 'dice', 'trigram': trigram}))
} }
@ -55,9 +59,34 @@ document.addEventListener('DOMContentLoaded', () => {
document.getElementById(`messages-${tournament.id}`).innerHTML = info document.getElementById(`messages-${tournament.id}`).innerHTML = info
} }
function drawStart() { function drawStart(teams) {
document.getElementById(`banner-not-started-${tournament.id}`).classList.add('d-none') document.getElementById(`banner-not-started-${tournament.id}`).classList.add('d-none')
document.getElementById(`draw-content-${tournament.id}`).classList.remove('d-none') document.getElementById(`draw-content-${tournament.id}`).classList.remove('d-none')
let dicesDiv = document.getElementById(`dices-${tournament.id}`)
for (let team of teams) {
let col = document.createElement('div')
col.classList.add('col-md-1')
dicesDiv.append(col)
let diceDiv = document.createElement('div')
diceDiv.id = `dice-${tournament.id}-${team}`
diceDiv.classList.add('badge', 'rounded-pill', 'text-bg-warning')
if (document.getElementById(`abort-${tournament.id}`) !== null) {
// Check if this is a volunteer
diceDiv.onclick = (e) => drawDice(tournament.id, team)
}
diceDiv.textContent = `${team} 🎲 ??`
col.append(diceDiv)
}
}
function drawAbort() {
document.getElementById(`banner-not-started-${tournament.id}`).classList.remove('d-none')
document.getElementById(`draw-content-${tournament.id}`).classList.add('d-none')
document.getElementById(`dices-${tournament.id}`).innerHTML = ""
document.getElementById(`recap-${tournament.id}-round-list`).innerHTML = ""
document.getElementById(`tables-${tournament.id}`).innerHTML = ""
} }
function updateDiceInfo(trigram, result) { function updateDiceInfo(trigram, result) {
@ -186,6 +215,9 @@ document.addEventListener('DOMContentLoaded', () => {
} }
for (let poule of poules) { for (let poule of poules) {
if (poule.teams.length === 0)
continue
let pouleTable = document.getElementById(`table-${tournament.id}-${round}-${poule.letter}`) let pouleTable = document.getElementById(`table-${tournament.id}-${round}-${poule.letter}`)
if (pouleTable === null) { if (pouleTable === null) {
// Create table // Create table
@ -219,7 +251,7 @@ document.addEventListener('DOMContentLoaded', () => {
teamTh.textContent = "Équipe" teamTh.textContent = "Équipe"
phaseTr.append(teamTh) phaseTr.append(teamTh)
for (let i = 1; i <= 3; ++i) { for (let i = 1; i <= (poule.teams.length === 4 ? 4 : 3); ++i) {
let phaseTh = document.createElement('th') let phaseTh = document.createElement('th')
phaseTh.classList.add('text-center') phaseTh.classList.add('text-center')
if (poule.teams.length === 5 && i < 3) if (poule.teams.length === 5 && i < 3)
@ -246,7 +278,7 @@ document.addEventListener('DOMContentLoaded', () => {
for (let team of poule.teams) { for (let team of poule.teams) {
let problemTh = document.createElement('th') let problemTh = document.createElement('th')
problemTh.classList.add('text-center') problemTh.classList.add('text-center')
problemTh.innerHTML = `Problème <span id="table-${tournament.id}-round-${round}-problem-${team}">?</span>` problemTh.innerHTML = `Pb. <span id="table-${tournament.id}-round-${round}-problem-${team}">?</span>`
problemTr.append(problemTh) problemTr.append(problemTh)
} }
@ -266,17 +298,18 @@ document.addEventListener('DOMContentLoaded', () => {
let defenderTd = document.createElement('td') let defenderTd = document.createElement('td')
defenderTd.classList.add('text-center') defenderTd.classList.add('text-center')
defenderTd.innerText = 'Défenseur⋅se' defenderTd.innerText = 'Déf'
let opponentTd = document.createElement('td') let opponentTd = document.createElement('td')
opponentTd.classList.add('text-center') opponentTd.classList.add('text-center')
opponentTd.innerText = 'Opposant⋅e' opponentTd.innerText = 'Opp'
let reporterTd = document.createElement('td') let reporterTd = document.createElement('td')
reporterTd.classList.add('text-center') reporterTd.classList.add('text-center')
reporterTd.innerText = 'Rapporteur⋅e' reporterTd.innerText = 'Rap'
let emptyTd = document.createElement('td') let emptyTd = document.createElement('td')
let emptyTd2 = document.createElement('td')
if (poule.teams.length === 3) { if (poule.teams.length === 3) {
@ -311,19 +344,19 @@ document.addEventListener('DOMContentLoaded', () => {
else if (poule.teams.length === 5) { else if (poule.teams.length === 5) {
switch (i) { switch (i) {
case 0: case 0:
teamTr.append(defenderTd, emptyTd, opponentTd, reporterTd, emptyTd) teamTr.append(defenderTd, emptyTd, opponentTd, reporterTd, emptyTd2)
break break
case 1: case 1:
teamTr.append(emptyTd, defenderTd, reporterTd, emptyTd, opponentTd) teamTr.append(emptyTd, defenderTd, reporterTd, emptyTd2, opponentTd)
break break
case 2: case 2:
teamTr.append(opponentTd, emptyTd, defenderTd, emptyTd, reporterTd) teamTr.append(opponentTd, emptyTd, defenderTd, emptyTd2, reporterTd)
break break
case 3: case 3:
teamTr.append(reporterTd, opponentTd, emptyTd, defenderTd, emptyTd) teamTr.append(reporterTd, opponentTd, emptyTd, defenderTd, emptyTd2)
break break
case 4: case 4:
teamTr.append(emptyTd, reporterTd, emptyTd, opponentTd, defenderTd) teamTr.append(emptyTd, reporterTd, emptyTd2, opponentTd, defenderTd)
break break
} }
} }
@ -369,7 +402,10 @@ document.addEventListener('DOMContentLoaded', () => {
setInfo(data.information) setInfo(data.information)
break break
case 'draw_start': case 'draw_start':
drawStart() drawStart(data.trigrams)
break
case 'abort':
drawAbort()
break break
case 'dice': case 'dice':
updateDiceInfo(data.team, data.result) updateDiceInfo(data.team, data.result)

View File

@ -28,7 +28,7 @@
<h2>{% trans "Last dices" %}</h2> <h2>{% trans "Last dices" %}</h2>
</div> </div>
<div class="card-body"> <div class="card-body">
<div class="row"> <div id="dices-{{ tournament.id }}" class="row">
{% 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 }}"
@ -48,6 +48,11 @@
<div class="card"> <div class="card">
<div class="card-header"> <div class="card-header">
Recap Recap
{% if user.registration.is_volunteer %}
<button id="abort-{{ tournament.id }}" class="badge rounded-pill text-bg-danger" onclick="abortDraw({{ tournament.id }})">
{% trans "Abort" %}
</button>
{% endif %}
</div> </div>
<div class="card-body"> <div class="card-body">
<ul id="recap-{{ tournament.id }}-round-list" class="list-group list-group-flush"> <ul id="recap-{{ tournament.id }}-round-list" class="list-group list-group-flush">
@ -170,7 +175,7 @@
<tr> <tr>
{% for td in pool.team_draws.all %} {% for td in pool.team_draws.all %}
<th class="text-center"> <th class="text-center">
{% trans "Problem"|capfirst %} Pb.
<span id="table-{{ tournament.id }}-round-{{ round.number }}-problem-{{ td.participation.team.trigram }}">{{ td.accepted|default:"?" }}</span> <span id="table-{{ tournament.id }}-round-{{ round.number }}-problem-{{ td.participation.team.trigram }}">{{ td.accepted|default:"?" }}</span>
</th> </th>
{% endfor %} {% endfor %}
@ -182,71 +187,71 @@
<td class="text-center">{{ td.participation.team.trigram }}</td> <td class="text-center">{{ td.participation.team.trigram }}</td>
{% if pool.size == 3 %} {% if pool.size == 3 %}
{% if forloop.counter == 1 %} {% if forloop.counter == 1 %}
<td class="text-center">{% trans "defender"|capfirst %}</td> <td class="text-center">Déf</td>
<td class="text-center">{% trans "reporter"|capfirst %}</td> <td class="text-center">Rap</td>
<td class="text-center">{% trans "opponent"|capfirst %}</td> <td class="text-center">Opp</td>
{% elif forloop.counter == 2 %} {% elif forloop.counter == 2 %}
<td class="text-center">{% trans "opponent"|capfirst %}</td> <td class="text-center">Opp</td>
<td class="text-center">{% trans "defender"|capfirst %}</td> <td class="text-center">Déf</td>
<td class="text-center">{% trans "reporter"|capfirst %}</td> <td class="text-center">Rap</td>
{% elif forloop.counter == 3 %} {% elif forloop.counter == 3 %}
<td class="text-center">{% trans "reporter"|capfirst %}</td> <td class="text-center">Rap</td>
<td class="text-center">{% trans "opponent"|capfirst %}</td> <td class="text-center">Opp</td>
<td class="text-center">{% trans "defender"|capfirst %}</td> <td class="text-center">Déf</td>
{% endif %} {% endif %}
{% elif pool.size == 4 %} {% elif pool.size == 4 %}
{% if forloop.counter == 1 %} {% if forloop.counter == 1 %}
<td class="text-center">{% trans "defender"|capfirst %}</td> <td class="text-center">Déf</td>
<td></td> <td></td>
<td class="text-center">{% trans "reporter"|capfirst %}</td> <td class="text-center">Rap</td>
<td class="text-center">{% trans "opponent"|capfirst %}</td> <td class="text-center">Opp</td>
{% elif forloop.counter == 2 %} {% elif forloop.counter == 2 %}
<td class="text-center">{% trans "opponent"|capfirst %}</td> <td class="text-center">Opp</td>
<td class="text-center">{% trans "defender"|capfirst %}</td> <td class="text-center">Déf</td>
<td></td> <td></td>
<td class="text-center">{% trans "reporter"|capfirst %}</td> <td class="text-center">Rap</td>
{% elif forloop.counter == 3 %} {% elif forloop.counter == 3 %}
<td class="text-center">{% trans "reporter"|capfirst %}</td> <td class="text-center">Rap</td>
<td class="text-center">{% trans "opponent"|capfirst %}</td> <td class="text-center">Opp</td>
<td class="text-center">{% trans "defender"|capfirst %}</td> <td class="text-center">Déf</td>
<td></td> <td></td>
{% elif forloop.counter == 4 %} {% elif forloop.counter == 4 %}
<td></td> <td></td>
<td class="text-center">{% trans "reporter"|capfirst %}</td> <td class="text-center">Rap</td>
<td class="text-center">{% trans "opponent"|capfirst %}</td> <td class="text-center">Opp</td>
<td class="text-center">{% trans "defender"|capfirst %}</td> <td class="text-center">Déf</td>
{% endif %} {% endif %}
{% elif pool.size == 5 %} {% elif pool.size == 5 %}
{% if forloop.counter == 1 %} {% if forloop.counter == 1 %}
<td class="text-center">{% trans "defender"|capfirst %}</td> <td class="text-center">Déf</td>
<td></td> <td></td>
<td class="text-center">{% trans "opponent"|capfirst %}</td> <td class="text-center">Opp</td>
<td class="text-center">{% trans "reporter"|capfirst %}</td> <td class="text-center">Rap</td>
<td></td> <td></td>
{% elif forloop.counter == 2 %} {% elif forloop.counter == 2 %}
<td></td> <td></td>
<td class="text-center">{% trans "defender"|capfirst %}</td> <td class="text-center">Déf</td>
<td class="text-center">{% trans "reporter"|capfirst %}</td> <td class="text-center">Rap</td>
<td></td> <td></td>
<td class="text-center">{% trans "opponent"|capfirst %}</td> <td class="text-center">Opp</td>
{% elif forloop.counter == 3 %} {% elif forloop.counter == 3 %}
<td class="text-center">{% trans "opponent"|capfirst %}</td> <td class="text-center">Opp</td>
<td></td> <td></td>
<td class="text-center">{% trans "defender"|capfirst %}</td> <td class="text-center">Déf</td>
<td></td> <td></td>
<td class="text-center">{% trans "reporter"|capfirst %}</td> <td class="text-center">Rap</td>
{% elif forloop.counter == 4 %} {% elif forloop.counter == 4 %}
<td class="text-center">{% trans "reporter"|capfirst %}</td> <td class="text-center">Rap</td>
<td class="text-center">{% trans "opponent"|capfirst %}</td> <td class="text-center">Opp</td>
<td></td> <td></td>
<td class="text-center">{% trans "defender"|capfirst %}</td> <td class="text-center">Déf</td>
<td></td> <td></td>
{% elif forloop.counter == 4 %} {% elif forloop.counter == 5 %}
<td></td> <td></td>
<td class="text-center">{% trans "reporter"|capfirst %}</td> <td class="text-center">Rap</td>
<td></td> <td></td>
<td class="text-center">{% trans "opponent"|capfirst %}</td> <td class="text-center">Opp</td>
<td class="text-center">{% trans "defender"|capfirst %}</td> <td class="text-center">Déf</td>
<td></td> <td></td>
{% endif %} {% endif %}
{% endif %} {% endif %}

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: TFJM\n" "Project-Id-Version: TFJM\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-03-24 11:14+0100\n" "POT-Creation-Date: 2023-03-24 12:29+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Emmy D'Anello <emmy.danello@animath.fr>\n" "Last-Translator: Emmy D'Anello <emmy.danello@animath.fr>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -29,7 +29,7 @@ msgstr "Tirage au sort"
msgid "You are not an organizer." msgid "You are not an organizer."
msgstr "Vous n'êtes pas un⋅e organisateur⋅rice." msgstr "Vous n'êtes pas un⋅e organisateur⋅rice."
#: draw/consumers.py:79 #: draw/consumers.py:81
msgid "Invalid format" msgid "Invalid format"
msgstr "Format invalide" msgstr "Format invalide"
@ -48,25 +48,30 @@ 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:136 draw/consumers.py:139 #: draw/consumers.py:121
#, python-brace-format
msgid "The draw for the tournament {tournament} is aborted."
msgstr "Le tirage au sort du tournoi {tournament} est annulé."
#: draw/consumers.py:141 draw/consumers.py:144
msgid "You've already launched the dice." msgid "You've already launched the dice."
msgstr "Vous avez déjà lancé le dé." msgstr "Vous avez déjà lancé le dé."
#: draw/consumers.py:142 #: draw/consumers.py:147
msgid "It is not your turn." msgid "It is not your turn."
msgstr "Ce n'est pas votre tour." msgstr "Ce n'est pas votre tour."
#: draw/consumers.py:144 #: draw/consumers.py:149
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."
#: draw/consumers.py:177 draw/consumers.py:266 #: draw/consumers.py:182 draw/consumers.py:279
#, python-brace-format #, python-brace-format
msgid "Dices from teams {teams} are identical. Please relaunch your dices." 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:211 #: draw/consumers.py:216
msgid "Two pools are identical. Please relaunch your dices." msgid "Two pools are identical. Please relaunch your dices."
msgstr "Deux poules sont identiques. Merci de relancer vos dés." msgstr "Deux poules sont identiques. Merci de relancer vos dés."
@ -79,98 +84,102 @@ msgstr "tournoi"
msgid "current round" msgid "current round"
msgstr "tour actuel" msgstr "tour actuel"
#: draw/models.py:76 draw/models.py:84 #: draw/models.py:31
msgid "last message"
msgstr "dernier message"
#: draw/models.py:102 draw/models.py:110
msgid "draw" msgid "draw"
msgstr "tirage au sort" msgstr "tirage au sort"
#: draw/models.py:77 #: draw/models.py:103
msgid "draws" msgid "draws"
msgstr "tirages au sort" msgstr "tirages au sort"
#: draw/models.py:89 #: draw/models.py:115
msgid "Round 1" msgid "Round 1"
msgstr "Tour 1" msgstr "Tour 1"
#: draw/models.py:90 #: draw/models.py:116
msgid "Round 2" msgid "Round 2"
msgstr "Tour 2" msgstr "Tour 2"
#: draw/models.py:92 #: draw/models.py:118
msgid "number" msgid "number"
msgstr "numéro" msgstr "numéro"
#: draw/models.py:101 #: draw/models.py:127
msgid "current pool" msgid "current pool"
msgstr "poule actuelle" msgstr "poule actuelle"
#: draw/models.py:112 draw/models.py:173 participation/models.py:355 #: draw/models.py:138 draw/models.py:199 participation/models.py:355
msgid "round" msgid "round"
msgstr "tour" msgstr "tour"
#: draw/models.py:113 #: draw/models.py:139
msgid "rounds" msgid "rounds"
msgstr "tours" msgstr "tours"
#: draw/models.py:128 #: draw/models.py:154
msgid "letter" msgid "letter"
msgstr "lettre" msgstr "lettre"
#: draw/models.py:132 #: draw/models.py:158
#: participation/templates/participation/tournament_detail.html:15 #: participation/templates/participation/tournament_detail.html:15
msgid "size" msgid "size"
msgstr "taille" msgstr "taille"
#: draw/models.py:141 #: draw/models.py:167
msgid "current team" msgid "current team"
msgstr "équipe actuelle" msgstr "équipe actuelle"
#: draw/models.py:159 draw/models.py:181 #: draw/models.py:185 draw/models.py:207
#: draw/templates/draw/tournament_content.html:65 #: draw/templates/draw/tournament_content.html:70
#: draw/templates/draw/tournament_content.html:146 participation/models.py:407 #: draw/templates/draw/tournament_content.html:151 participation/models.py:407
#: participation/models.py:415 #: participation/models.py:415
msgid "pool" msgid "pool"
msgstr "poule" msgstr "poule"
#: draw/models.py:160 participation/models.py:408 #: draw/models.py:186 participation/models.py:408
msgid "pools" msgid "pools"
msgstr "poules" msgstr "poules"
#: draw/models.py:167 participation/models.py:342 participation/models.py:539 #: draw/models.py:193 participation/models.py:342 participation/models.py:539
#: participation/models.py:569 participation/models.py:607 #: participation/models.py:569 participation/models.py:607
msgid "participation" msgid "participation"
msgstr "participation" msgstr "participation"
#: draw/models.py:188 #: draw/models.py:214
msgid "passage index" msgid "passage index"
msgstr "numéro de passage" msgstr "numéro de passage"
#: draw/models.py:195 #: draw/models.py:221
msgid "choose index" msgid "choose index"
msgstr "numéro de choix" msgstr "numéro de choix"
#: draw/models.py:200 draw/models.py:216 participation/models.py:422 #: draw/models.py:226 draw/models.py:242 participation/models.py:422
#: participation/models.py:576 #: participation/models.py:576
#, python-brace-format #, python-brace-format
msgid "Problem #{problem}" msgid "Problem #{problem}"
msgstr "Problème n°{problem}" msgstr "Problème n°{problem}"
#: draw/models.py:204 draw/models.py:220 #: draw/models.py:230 draw/models.py:246
msgid "accepted problem" msgid "accepted problem"
msgstr "problème accepté" msgstr "problème accepté"
#: draw/models.py:211 #: draw/models.py:237
msgid "last dice" msgid "last dice"
msgstr "dernier dé" msgstr "dernier dé"
#: draw/models.py:225 #: draw/models.py:251
msgid "rejected problems" msgid "rejected problems"
msgstr "problèmes rejetés" msgstr "problèmes rejetés"
#: draw/models.py:232 #: draw/models.py:258
msgid "team draw" msgid "team draw"
msgstr "tirage d'équipe" msgstr "tirage d'équipe"
#: draw/models.py:233 #: draw/models.py:259
msgid "team draws" msgid "team draws"
msgstr "tirages d'équipe" msgstr "tirages d'équipe"
@ -190,83 +199,35 @@ 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:113 #: draw/templates/draw/tournament_content.html:53
msgid "Abort"
msgstr "Annuler"
#: draw/templates/draw/tournament_content.html:118
msgid "Launch dice" msgid "Launch dice"
msgstr "Lancer le dé" msgstr "Lancer le dé"
#: draw/templates/draw/tournament_content.html:120 #: draw/templates/draw/tournament_content.html:125
msgid "Accept" msgid "Accept"
msgstr "Accepter" msgstr "Accepter"
#: draw/templates/draw/tournament_content.html:123 #: draw/templates/draw/tournament_content.html:128
msgid "Decline" msgid "Decline"
msgstr "Refuser" msgstr "Refuser"
#: draw/templates/draw/tournament_content.html:153 participation/models.py:125 #: draw/templates/draw/tournament_content.html:158 participation/models.py:125
#: participation/models.py:310 registration/models.py:127 #: participation/models.py:310 registration/models.py:127
msgid "team" msgid "team"
msgstr "équipe" msgstr "équipe"
#: draw/templates/draw/tournament_content.html:163 #: draw/templates/draw/tournament_content.html:168
#: draw/templates/draw/tournament_content.html:164 #: draw/templates/draw/tournament_content.html:169
#: draw/templates/draw/tournament_content.html:165 #: draw/templates/draw/tournament_content.html:170
#: draw/templates/draw/tournament_content.html:166 #: draw/templates/draw/tournament_content.html:171
#: draw/templates/draw/tournament_content.html:167 #: draw/templates/draw/tournament_content.html:172
msgid "Room" msgid "Room"
msgstr "Salle" msgstr "Salle"
#: draw/templates/draw/tournament_content.html:173
msgid "Problem"
msgstr "Problème"
#: draw/templates/draw/tournament_content.html:185
#: draw/templates/draw/tournament_content.html:190
#: draw/templates/draw/tournament_content.html:195
#: draw/templates/draw/tournament_content.html:199
#: draw/templates/draw/tournament_content.html:205
#: draw/templates/draw/tournament_content.html:211
#: draw/templates/draw/tournament_content.html:217
#: draw/templates/draw/tournament_content.html:221
#: draw/templates/draw/tournament_content.html:228
#: draw/templates/draw/tournament_content.html:235
#: draw/templates/draw/tournament_content.html:242
#: draw/templates/draw/tournament_content.html:249 participation/models.py:429
#: participation/tables.py:102
msgid "defender"
msgstr "défenseur⋅se"
#: draw/templates/draw/tournament_content.html:186
#: draw/templates/draw/tournament_content.html:191
#: draw/templates/draw/tournament_content.html:193
#: draw/templates/draw/tournament_content.html:201
#: draw/templates/draw/tournament_content.html:207
#: draw/templates/draw/tournament_content.html:209
#: draw/templates/draw/tournament_content.html:215
#: draw/templates/draw/tournament_content.html:224
#: draw/templates/draw/tournament_content.html:229
#: draw/templates/draw/tournament_content.html:237
#: draw/templates/draw/tournament_content.html:239
#: draw/templates/draw/tournament_content.html:246 participation/models.py:443
#: participation/models.py:620
msgid "reporter"
msgstr "rapporteur⋅e"
#: draw/templates/draw/tournament_content.html:187
#: draw/templates/draw/tournament_content.html:189
#: draw/templates/draw/tournament_content.html:194
#: draw/templates/draw/tournament_content.html:202
#: draw/templates/draw/tournament_content.html:204
#: draw/templates/draw/tournament_content.html:210
#: draw/templates/draw/tournament_content.html:216
#: draw/templates/draw/tournament_content.html:223
#: draw/templates/draw/tournament_content.html:231
#: draw/templates/draw/tournament_content.html:233
#: draw/templates/draw/tournament_content.html:240
#: draw/templates/draw/tournament_content.html:248 participation/models.py:436
#: participation/models.py:619
msgid "opponent"
msgstr "opposant⋅e"
#: logs/apps.py:11 #: logs/apps.py:11
msgid "Logs" msgid "Logs"
msgstr "Logs" msgstr "Logs"
@ -577,6 +538,18 @@ msgstr "Poule du jour {round} du tournoi {tournament} avec les équipes {teams}"
msgid "defended solution" msgid "defended solution"
msgstr "solution défendue" msgstr "solution défendue"
#: participation/models.py:429 participation/tables.py:102
msgid "defender"
msgstr "défenseur⋅se"
#: participation/models.py:436 participation/models.py:619
msgid "opponent"
msgstr "opposant⋅e"
#: participation/models.py:443 participation/models.py:620
msgid "reporter"
msgstr "rapporteur⋅e"
#: participation/models.py:448 #: participation/models.py:448
msgid "penalties" msgid "penalties"
msgstr "pénalités" msgstr "pénalités"
@ -2234,5 +2207,8 @@ msgstr "Résultats"
msgid "No results found." msgid "No results found."
msgstr "Aucun résultat." msgstr "Aucun résultat."
#~ msgid "Problem"
#~ msgstr "Problème"
#~ msgid "index" #~ msgid "index"
#~ msgstr "position" #~ msgstr "position"