diff --git a/draw/consumers.py b/draw/consumers.py
index 13acf45..18aca04 100644
--- a/draw/consumers.py
+++ b/draw/consumers.py
@@ -1,6 +1,6 @@
# Copyright (C) 2023 by Animath
# SPDX-License-Identifier: GPL-3.0-or-later
-
+from collections import OrderedDict
from random import randint
from asgiref.sync import sync_to_async
@@ -436,6 +436,37 @@ class DrawConsumer(AsyncJsonWebsocketConsumer):
{'type': 'draw.box_visibility', 'visible': True})
else:
# Pool is ended
+ if pool.size == 5:
+ # Maybe reorder teams if the same problem is presented twice
+ problems = OrderedDict()
+ async for td in pool.team_draws:
+ problems.setdefault(td.accepted, [])
+ problems[td.accepted].append(td)
+ p_index = 0
+ for pb, tds in problems.items():
+ if len(tds) == 2:
+ tds[0].passage_index = p_index
+ tds[1].passage_index = p_index + 1
+ p_index += 2
+ await sync_to_async(tds[0].save)()
+ await sync_to_async(tds[1].save)()
+ for pb, tds in problems.items():
+ if len(tds) == 1:
+ tds[0].passage_index = p_index
+ p_index += 1
+ await sync_to_async(tds[0].save)()
+
+ print(p_index)
+
+ await self.channel_layer.group_send(f"tournament-{self.tournament.id}", {
+ 'type': 'draw.reorder_pool',
+ 'round': r.number,
+ 'pool': pool.get_letter_display(),
+ 'teams': [td.participation.team.trigram
+ async for td in pool.team_draws.prefetch_related('participation__team')],
+ 'problems': [td.accepted async for td in pool.team_draws],
+ })
+
msg += f"
Le tirage de la poule {pool.get_letter_display()}{r.number} est terminé. " \
f"Le tableau récapitulatif est en bas."
self.tournament.draw.last_message = msg
@@ -451,7 +482,6 @@ class DrawConsumer(AsyncJsonWebsocketConsumer):
else:
# Round is ended
# TODO: For the final tournament, add some adjustments
- # TODO: Make some adjustments for 5-teams-pools
if r.number == 1:
# Next round
r2 = await self.tournament.draw.round_set.filter(number=2).aget()
@@ -583,3 +613,8 @@ class DrawConsumer(AsyncJsonWebsocketConsumer):
async def draw_reject_problem(self, content):
await self.send_json({'type': 'reject_problem', 'round': content['round'],
'team': content['team'], 'rejected': content['rejected']})
+
+ async def draw_reorder_pool(self, content):
+ await self.send_json({'type': 'reorder_poule', 'round': content['round'],
+ 'poule': content['pool'], 'teams': content['teams'],
+ 'problems': content['problems']})
diff --git a/draw/static/draw.js b/draw/static/draw.js
index 95286c5..e225b94 100644
--- a/draw/static/draw.js
+++ b/draw/static/draw.js
@@ -238,7 +238,7 @@ document.addEventListener('DOMContentLoaded', () => {
tablesRoundDiv = document.createElement('div')
tablesRoundDiv.id = `tables-${tournament.id}-round-${round}`
- tablesRoundDiv.classList.add('card-body')
+ tablesRoundDiv.classList.add('card-body', 'd-flex', 'flex-wrap')
card.append(tablesRoundDiv)
}
@@ -246,148 +246,153 @@ document.addEventListener('DOMContentLoaded', () => {
if (poule.teams.length === 0)
continue
- let pouleTable = document.getElementById(`table-${tournament.id}-${round}-${poule.letter}`)
- if (pouleTable === null) {
- // Create table
- let card = document.createElement('div')
- card.classList.add('card', 'my-3')
- tablesRoundDiv.append(card)
+ updatePouleTable(round, poule)
+ }
+ }
+ }
- let cardHeader = document.createElement('div')
- cardHeader.classList.add('card-header')
- cardHeader.innerHTML = `
Poule ${poule.letter}
`
- card.append(cardHeader)
+ function updatePouleTable(round, poule) {
+ let tablesRoundDiv = document.getElementById(`tables-${tournament.id}-round-${round}`)
+ let pouleTable = document.getElementById(`table-${tournament.id}-${round}-${poule.letter}`)
+ if (pouleTable === null) {
+ // Create table
+ let card = document.createElement('div')
+ card.classList.add('card', 'w-100', 'my-3', `order-${poule.letter.charCodeAt(0) - 64}`)
+ tablesRoundDiv.append(card)
- let cardBody = document.createElement('div')
- cardBody.classList.add('card-body')
- card.append(cardBody)
+ let cardHeader = document.createElement('div')
+ cardHeader.classList.add('card-header')
+ cardHeader.innerHTML = `Poule ${poule.letter}${round}
`
+ card.append(cardHeader)
- pouleTable = document.createElement('table')
- pouleTable.id = `table-${tournament.id}-${round}-${poule.letter}`
- pouleTable.classList.add('table', 'table-stripped')
- cardBody.append(pouleTable)
+ let cardBody = document.createElement('div')
+ cardBody.classList.add('card-body')
+ card.append(cardBody)
- let thead = document.createElement('thead')
- pouleTable.append(thead)
+ pouleTable = document.createElement('table')
+ pouleTable.id = `table-${tournament.id}-${round}-${poule.letter}`
+ pouleTable.classList.add('table', 'table-stripped')
+ cardBody.append(pouleTable)
- let phaseTr = document.createElement('tr')
- thead.append(phaseTr)
+ let thead = document.createElement('thead')
+ pouleTable.append(thead)
- let teamTh = document.createElement('th')
- teamTh.classList.add('text-center')
- teamTh.rowSpan = poule.teams.length === 5 ? 3 : 2
- teamTh.textContent = "Équipe"
- phaseTr.append(teamTh)
+ let phaseTr = document.createElement('tr')
+ thead.append(phaseTr)
- for (let i = 1; i <= (poule.teams.length === 4 ? 4 : 3); ++i) {
- let phaseTh = document.createElement('th')
- phaseTh.classList.add('text-center')
- if (poule.teams.length === 5 && i < 3)
- phaseTh.colSpan = 2
- phaseTh.textContent = `Phase ${i}`
- phaseTr.append(phaseTh)
+ let teamTh = document.createElement('th')
+ teamTh.classList.add('text-center')
+ teamTh.rowSpan = poule.teams.length === 5 ? 3 : 2
+ teamTh.textContent = "Équipe"
+ phaseTr.append(teamTh)
+
+ for (let i = 1; i <= (poule.teams.length === 4 ? 4 : 3); ++i) {
+ let phaseTh = document.createElement('th')
+ phaseTh.classList.add('text-center')
+ if (poule.teams.length === 5 && i < 3)
+ phaseTh.colSpan = 2
+ phaseTh.textContent = `Phase ${i}`
+ phaseTr.append(phaseTh)
+ }
+
+ if (poule.teams.length === 5) {
+ let roomTr = document.createElement('tr')
+ thead.append(roomTr)
+
+ for (let i = 0; i < 5; ++i) {
+ let roomTh = document.createElement('th')
+ roomTh.classList.add('text-center')
+ roomTh.textContent = `Salle ${1 + (i % 2)}`
+ roomTr.append(roomTh)
+ }
+ }
+
+ let problemTr = document.createElement('tr')
+ thead.append(problemTr)
+
+ for (let team of poule.teams) {
+ let problemTh = document.createElement('th')
+ problemTh.classList.add('text-center')
+ problemTh.innerHTML = `Pb. ?`
+ problemTr.append(problemTh)
+ }
+
+ let tbody = document.createElement('tbody')
+ pouleTable.append(tbody)
+
+ for (let i = 0; i < poule.teams.length; ++i) {
+ let team = poule.teams[i]
+
+ let teamTr = document.createElement('tr')
+ tbody.append(teamTr)
+
+ let teamTd = document.createElement('td')
+ teamTd.classList.add('text-center')
+ teamTd.innerText = team
+ teamTr.append(teamTd)
+
+ let defenderTd = document.createElement('td')
+ defenderTd.classList.add('text-center')
+ defenderTd.innerText = 'Déf'
+
+ let opponentTd = document.createElement('td')
+ opponentTd.classList.add('text-center')
+ opponentTd.innerText = 'Opp'
+
+ let reporterTd = document.createElement('td')
+ reporterTd.classList.add('text-center')
+ reporterTd.innerText = 'Rap'
+
+ let emptyTd = document.createElement('td')
+ let emptyTd2 = document.createElement('td')
+
+
+ if (poule.teams.length === 3) {
+ switch (i) {
+ case 0:
+ teamTr.append(defenderTd, reporterTd, opponentTd)
+ break
+ case 1:
+ teamTr.append(opponentTd, defenderTd, reporterTd)
+ break
+ case 2:
+ teamTr.append(reporterTd, opponentTd, defenderTd)
+ break
}
-
- if (poule.teams.length === 5) {
- let roomTr = document.createElement('tr')
- thead.append(roomTr)
-
- for (let i = 0; i < 5; ++i) {
- let roomTh = document.createElement('th')
- roomTh.classList.add('text-center')
- roomTh.textContent = `Salle ${1 + (i % 2)}`
- roomTr.append(roomTh)
- }
+ }
+ else if (poule.teams.length === 4) {
+ switch (i) {
+ case 0:
+ teamTr.append(defenderTd, emptyTd, reporterTd, opponentTd)
+ break
+ case 1:
+ teamTr.append(opponentTd, defenderTd, emptyTd, reporterTd)
+ break
+ case 2:
+ teamTr.append(reporterTd, opponentTd, defenderTd, emptyTd)
+ break
+ case 3:
+ teamTr.append(emptyTd, reporterTd, opponentTd, defenderTd)
+ break
}
-
- let problemTr = document.createElement('tr')
- thead.append(problemTr)
-
- for (let team of poule.teams) {
- let problemTh = document.createElement('th')
- problemTh.classList.add('text-center')
- problemTh.innerHTML = `Pb. ?`
- problemTr.append(problemTh)
- }
-
- let tbody = document.createElement('tbody')
- pouleTable.append(tbody)
-
- for (let i = 0; i < poule.teams.length; ++i) {
- let team = poule.teams[i]
-
- let teamTr = document.createElement('tr')
- tbody.append(teamTr)
-
- let teamTd = document.createElement('td')
- teamTd.classList.add('text-center')
- teamTd.innerText = team
- teamTr.append(teamTd)
-
- let defenderTd = document.createElement('td')
- defenderTd.classList.add('text-center')
- defenderTd.innerText = 'Déf'
-
- let opponentTd = document.createElement('td')
- opponentTd.classList.add('text-center')
- opponentTd.innerText = 'Opp'
-
- let reporterTd = document.createElement('td')
- reporterTd.classList.add('text-center')
- reporterTd.innerText = 'Rap'
-
- let emptyTd = document.createElement('td')
- let emptyTd2 = document.createElement('td')
-
-
- if (poule.teams.length === 3) {
- switch (i) {
- case 0:
- teamTr.append(defenderTd, reporterTd, opponentTd)
- break
- case 1:
- teamTr.append(opponentTd, defenderTd, reporterTd)
- break
- case 2:
- teamTr.append(reporterTd, opponentTd, defenderTd)
- break
- }
- }
- else if (poule.teams.length === 4) {
- switch (i) {
- case 0:
- teamTr.append(defenderTd, emptyTd, reporterTd, opponentTd)
- break
- case 1:
- teamTr.append(opponentTd, defenderTd, emptyTd, reporterTd)
- break
- case 2:
- teamTr.append(reporterTd, opponentTd, defenderTd, emptyTd)
- break
- case 3:
- teamTr.append(emptyTd, reporterTd, opponentTd, defenderTd)
- break
- }
- }
- else if (poule.teams.length === 5) {
- switch (i) {
- case 0:
- teamTr.append(defenderTd, emptyTd, opponentTd, reporterTd, emptyTd2)
- break
- case 1:
- teamTr.append(emptyTd, defenderTd, reporterTd, emptyTd2, opponentTd)
- break
- case 2:
- teamTr.append(opponentTd, emptyTd, defenderTd, emptyTd2, reporterTd)
- break
- case 3:
- teamTr.append(reporterTd, opponentTd, emptyTd, defenderTd, emptyTd2)
- break
- case 4:
- teamTr.append(emptyTd, reporterTd, emptyTd2, opponentTd, defenderTd)
- break
- }
- }
+ }
+ else if (poule.teams.length === 5) {
+ switch (i) {
+ case 0:
+ teamTr.append(defenderTd, emptyTd, opponentTd, reporterTd, emptyTd2)
+ break
+ case 1:
+ teamTr.append(emptyTd, defenderTd, reporterTd, emptyTd2, opponentTd)
+ break
+ case 2:
+ teamTr.append(opponentTd, emptyTd, defenderTd, emptyTd2, reporterTd)
+ break
+ case 3:
+ teamTr.append(reporterTd, opponentTd, emptyTd, defenderTd, emptyTd2)
+ break
+ case 4:
+ teamTr.append(emptyTd, reporterTd, emptyTd2, opponentTd, defenderTd)
+ break
}
}
}
@@ -442,6 +447,20 @@ document.addEventListener('DOMContentLoaded', () => {
}
}
+ function reorderPoule(round, poule, teams, problems) {
+ let table = document.getElementById(`table-${tournament.id}-${round}-${poule}`)
+ table.parentElement.parentElement.remove()
+
+ updatePouleTable(round, {'letter': poule, 'teams': teams})
+
+ for (let i = 0; i < teams.length; ++i) {
+ let team = teams[i]
+ let problem = problems[i]
+
+ setProblemAccepted(round, team, problem)
+ }
+ }
+
socket.addEventListener('message', e => {
const data = JSON.parse(e.data)
console.log(data)
@@ -486,6 +505,9 @@ document.addEventListener('DOMContentLoaded', () => {
case 'reject_problem':
setProblemRejected(data.round, data.team, data.rejected)
break
+ case 'reorder_poule':
+ reorderPoule(data.round, data.poule, data.teams, data.problems)
+ break
}
})
diff --git a/draw/templates/draw/tournament_content.html b/draw/templates/draw/tournament_content.html
index fff5cc0..3dbf2a9 100644
--- a/draw/templates/draw/tournament_content.html
+++ b/draw/templates/draw/tournament_content.html
@@ -160,10 +160,10 @@
{{ round }}
-
+
{% for pool in round.pool_set.all %}
{% if pool.teamdraw_set.count %}
-