mirror of
https://gitlab.com/animath/si/plateforme.git
synced 2025-06-29 09:51:03 +02:00
Reorder teams for 5-teams pools
Signed-off-by: Emmy D'Anello <emmy.danello@animath.fr>
This commit is contained in:
@ -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"<br><br>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']})
|
||||
|
@ -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 = `<h2>Poule ${poule.letter}</h2>`
|
||||
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 = `<h2>Poule ${poule.letter}${round}</h2>`
|
||||
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. <span id="table-${tournament.id}-round-${round}-problem-${team}">?</span>`
|
||||
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. <span id="table-${tournament.id}-round-${round}-problem-${team}">?</span>`
|
||||
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
|
||||
}
|
||||
})
|
||||
|
||||
|
@ -160,10 +160,10 @@
|
||||
{{ round }}
|
||||
</h2>
|
||||
</div>
|
||||
<div id="tables-{{ tournament.id }}-round-{{ round.number }}" class="card-body">
|
||||
<div id="tables-{{ tournament.id }}-round-{{ round.number }}" class="card-body d-flex flex-wrap">
|
||||
{% for pool in round.pool_set.all %}
|
||||
{% if pool.teamdraw_set.count %}
|
||||
<div class="card my-3">
|
||||
<div class="card w-100 my-3 order-{{ pool.letter }}">
|
||||
<div class="card-header">
|
||||
<h3>
|
||||
{% trans "pool"|capfirst %} {{ pool }}
|
||||
|
Reference in New Issue
Block a user