mirror of
				https://gitlab.com/animath/si/plateforme.git
				synced 2025-11-04 07:42:11 +01:00 
			
		
		
		
	Add Abort button
Signed-off-by: Emmy D'Anello <emmy.danello@animath.fr>
This commit is contained in:
		@@ -67,19 +67,18 @@ class DrawConsumer(AsyncJsonWebsocketConsumer):
 | 
			
		||||
        match content['type']:
 | 
			
		||||
            case 'start_draw':
 | 
			
		||||
                await self.start_draw(**content)
 | 
			
		||||
            case 'abort':
 | 
			
		||||
                await self.abort(**content)
 | 
			
		||||
            case 'dice':
 | 
			
		||||
                await self.process_dice(**content)
 | 
			
		||||
 | 
			
		||||
    @ensure_orga
 | 
			
		||||
    async def start_draw(self, fmt, **kwargs):
 | 
			
		||||
        print(fmt, kwargs)
 | 
			
		||||
        try:
 | 
			
		||||
            fmt = list(map(int, fmt.split('+')))
 | 
			
		||||
        except ValueError as e:
 | 
			
		||||
            return await self.alert(_("Invalid format"), 'danger')
 | 
			
		||||
 | 
			
		||||
        print(fmt, sum(fmt), len(self.participations))
 | 
			
		||||
 | 
			
		||||
        if sum(fmt) != len(self.participations):
 | 
			
		||||
            return await self.alert(
 | 
			
		||||
                _("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'],
 | 
			
		||||
                              '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):
 | 
			
		||||
        if self.registration.is_volunteer:
 | 
			
		||||
 
 | 
			
		||||
@@ -8,6 +8,10 @@ const sockets = {}
 | 
			
		||||
 | 
			
		||||
const messages = document.getElementById('messages')
 | 
			
		||||
 | 
			
		||||
function abortDraw(tid) {
 | 
			
		||||
    sockets[tid].send(JSON.stringify({'type': 'abort'}))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function drawDice(tid, trigram = null) {
 | 
			
		||||
    sockets[tid].send(JSON.stringify({'type': 'dice', 'trigram': trigram}))
 | 
			
		||||
}
 | 
			
		||||
@@ -55,9 +59,34 @@ document.addEventListener('DOMContentLoaded', () => {
 | 
			
		||||
            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(`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) {
 | 
			
		||||
@@ -186,6 +215,9 @@ document.addEventListener('DOMContentLoaded', () => {
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                for (let poule of poules) {
 | 
			
		||||
                    if (poule.teams.length === 0)
 | 
			
		||||
                        continue
 | 
			
		||||
 | 
			
		||||
                    let pouleTable = document.getElementById(`table-${tournament.id}-${round}-${poule.letter}`)
 | 
			
		||||
                    if (pouleTable === null) {
 | 
			
		||||
                        // Create table
 | 
			
		||||
@@ -219,7 +251,7 @@ document.addEventListener('DOMContentLoaded', () => {
 | 
			
		||||
                        teamTh.textContent = "Équipe"
 | 
			
		||||
                        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')
 | 
			
		||||
                            phaseTh.classList.add('text-center')
 | 
			
		||||
                            if (poule.teams.length === 5 && i < 3)
 | 
			
		||||
@@ -246,7 +278,7 @@ document.addEventListener('DOMContentLoaded', () => {
 | 
			
		||||
                        for (let team of poule.teams) {
 | 
			
		||||
                            let problemTh = document.createElement('th')
 | 
			
		||||
                            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)
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
@@ -266,17 +298,18 @@ document.addEventListener('DOMContentLoaded', () => {
 | 
			
		||||
 | 
			
		||||
                            let defenderTd = document.createElement('td')
 | 
			
		||||
                            defenderTd.classList.add('text-center')
 | 
			
		||||
                            defenderTd.innerText = 'Défenseur⋅se'
 | 
			
		||||
                            defenderTd.innerText = 'Déf'
 | 
			
		||||
 | 
			
		||||
                            let opponentTd = document.createElement('td')
 | 
			
		||||
                            opponentTd.classList.add('text-center')
 | 
			
		||||
                            opponentTd.innerText = 'Opposant⋅e'
 | 
			
		||||
                            opponentTd.innerText = 'Opp'
 | 
			
		||||
 | 
			
		||||
                            let reporterTd = document.createElement('td')
 | 
			
		||||
                            reporterTd.classList.add('text-center')
 | 
			
		||||
                            reporterTd.innerText = 'Rapporteur⋅e'
 | 
			
		||||
                            reporterTd.innerText = 'Rap'
 | 
			
		||||
 | 
			
		||||
                            let emptyTd = document.createElement('td')
 | 
			
		||||
                            let emptyTd2 = document.createElement('td')
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                            if (poule.teams.length === 3) {
 | 
			
		||||
@@ -311,19 +344,19 @@ document.addEventListener('DOMContentLoaded', () => {
 | 
			
		||||
                            else if (poule.teams.length === 5) {
 | 
			
		||||
                                switch (i) {
 | 
			
		||||
                                    case 0:
 | 
			
		||||
                                        teamTr.append(defenderTd, emptyTd, opponentTd, reporterTd, emptyTd)
 | 
			
		||||
                                        teamTr.append(defenderTd, emptyTd, opponentTd, reporterTd, emptyTd2)
 | 
			
		||||
                                        break
 | 
			
		||||
                                    case 1:
 | 
			
		||||
                                        teamTr.append(emptyTd, defenderTd, reporterTd, emptyTd, opponentTd)
 | 
			
		||||
                                        teamTr.append(emptyTd, defenderTd, reporterTd, emptyTd2, opponentTd)
 | 
			
		||||
                                        break
 | 
			
		||||
                                    case 2:
 | 
			
		||||
                                        teamTr.append(opponentTd, emptyTd, defenderTd, emptyTd, reporterTd)
 | 
			
		||||
                                        teamTr.append(opponentTd, emptyTd, defenderTd, emptyTd2, reporterTd)
 | 
			
		||||
                                        break
 | 
			
		||||
                                    case 3:
 | 
			
		||||
                                        teamTr.append(reporterTd, opponentTd, emptyTd, defenderTd, emptyTd)
 | 
			
		||||
                                        teamTr.append(reporterTd, opponentTd, emptyTd, defenderTd, emptyTd2)
 | 
			
		||||
                                        break
 | 
			
		||||
                                    case 4:
 | 
			
		||||
                                        teamTr.append(emptyTd, reporterTd, emptyTd, opponentTd, defenderTd)
 | 
			
		||||
                                        teamTr.append(emptyTd, reporterTd, emptyTd2, opponentTd, defenderTd)
 | 
			
		||||
                                        break
 | 
			
		||||
                                }
 | 
			
		||||
                            }
 | 
			
		||||
@@ -369,7 +402,10 @@ document.addEventListener('DOMContentLoaded', () => {
 | 
			
		||||
                    setInfo(data.information)
 | 
			
		||||
                    break
 | 
			
		||||
                case 'draw_start':
 | 
			
		||||
                    drawStart()
 | 
			
		||||
                    drawStart(data.trigrams)
 | 
			
		||||
                    break
 | 
			
		||||
                case 'abort':
 | 
			
		||||
                    drawAbort()
 | 
			
		||||
                    break
 | 
			
		||||
                case 'dice':
 | 
			
		||||
                    updateDiceInfo(data.team, data.result)
 | 
			
		||||
 
 | 
			
		||||
@@ -28,7 +28,7 @@
 | 
			
		||||
                <h2>{% trans "Last dices" %}</h2>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="card-body">
 | 
			
		||||
                <div class="row">
 | 
			
		||||
                <div id="dices-{{ tournament.id }}" class="row">
 | 
			
		||||
                    {% for td in tournament.draw.current_round.team_draws %}
 | 
			
		||||
                        <div class="col-md-1" style="order: {{ forloop.counter }};">
 | 
			
		||||
                            <div id="dice-{{ tournament.id }}-{{ td.participation.team.trigram }}"
 | 
			
		||||
@@ -48,6 +48,11 @@
 | 
			
		||||
                <div class="card">
 | 
			
		||||
                    <div class="card-header">
 | 
			
		||||
                        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 class="card-body">
 | 
			
		||||
                        <ul id="recap-{{ tournament.id }}-round-list" class="list-group list-group-flush">
 | 
			
		||||
@@ -170,7 +175,7 @@
 | 
			
		||||
                                                <tr>
 | 
			
		||||
                                                    {% for td in pool.team_draws.all %}
 | 
			
		||||
                                                        <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>
 | 
			
		||||
                                                        </th>
 | 
			
		||||
                                                    {% endfor %}
 | 
			
		||||
@@ -182,71 +187,71 @@
 | 
			
		||||
                                                        <td class="text-center">{{ td.participation.team.trigram }}</td>
 | 
			
		||||
                                                        {% if pool.size == 3 %}
 | 
			
		||||
                                                            {% if forloop.counter == 1 %}
 | 
			
		||||
                                                                <td class="text-center">{% trans "defender"|capfirst %}</td>
 | 
			
		||||
                                                                <td class="text-center">{% trans "reporter"|capfirst %}</td>
 | 
			
		||||
                                                                <td class="text-center">{% trans "opponent"|capfirst %}</td>
 | 
			
		||||
                                                                <td class="text-center">Déf</td>
 | 
			
		||||
                                                                <td class="text-center">Rap</td>
 | 
			
		||||
                                                                <td class="text-center">Opp</td>
 | 
			
		||||
                                                            {% elif forloop.counter == 2 %}
 | 
			
		||||
                                                                <td class="text-center">{% trans "opponent"|capfirst %}</td>
 | 
			
		||||
                                                                <td class="text-center">{% trans "defender"|capfirst %}</td>
 | 
			
		||||
                                                                <td class="text-center">{% trans "reporter"|capfirst %}</td>
 | 
			
		||||
                                                                <td class="text-center">Opp</td>
 | 
			
		||||
                                                                <td class="text-center">Déf</td>
 | 
			
		||||
                                                                <td class="text-center">Rap</td>
 | 
			
		||||
                                                            {% elif forloop.counter == 3 %}
 | 
			
		||||
                                                                <td class="text-center">{% trans "reporter"|capfirst %}</td>
 | 
			
		||||
                                                                <td class="text-center">{% trans "opponent"|capfirst %}</td>
 | 
			
		||||
                                                                <td class="text-center">{% trans "defender"|capfirst %}</td>
 | 
			
		||||
                                                                <td class="text-center">Rap</td>
 | 
			
		||||
                                                                <td class="text-center">Opp</td>
 | 
			
		||||
                                                                <td class="text-center">Déf</td>
 | 
			
		||||
                                                            {% endif %}
 | 
			
		||||
                                                        {% elif pool.size == 4 %}
 | 
			
		||||
                                                            {% if forloop.counter == 1 %}
 | 
			
		||||
                                                                <td class="text-center">{% trans "defender"|capfirst %}</td>
 | 
			
		||||
                                                                <td class="text-center">Déf</td>
 | 
			
		||||
                                                                <td></td>
 | 
			
		||||
                                                                <td class="text-center">{% trans "reporter"|capfirst %}</td>
 | 
			
		||||
                                                                <td class="text-center">{% trans "opponent"|capfirst %}</td>
 | 
			
		||||
                                                                <td class="text-center">Rap</td>
 | 
			
		||||
                                                                <td class="text-center">Opp</td>
 | 
			
		||||
                                                            {% elif forloop.counter == 2 %}
 | 
			
		||||
                                                                <td class="text-center">{% trans "opponent"|capfirst %}</td>
 | 
			
		||||
                                                                <td class="text-center">{% trans "defender"|capfirst %}</td>
 | 
			
		||||
                                                                <td class="text-center">Opp</td>
 | 
			
		||||
                                                                <td class="text-center">Déf</td>
 | 
			
		||||
                                                                <td></td>
 | 
			
		||||
                                                                <td class="text-center">{% trans "reporter"|capfirst %}</td>
 | 
			
		||||
                                                                <td class="text-center">Rap</td>
 | 
			
		||||
                                                            {% elif forloop.counter == 3 %}
 | 
			
		||||
                                                                <td class="text-center">{% trans "reporter"|capfirst %}</td>
 | 
			
		||||
                                                                <td class="text-center">{% trans "opponent"|capfirst %}</td>
 | 
			
		||||
                                                                <td class="text-center">{% trans "defender"|capfirst %}</td>
 | 
			
		||||
                                                                <td class="text-center">Rap</td>
 | 
			
		||||
                                                                <td class="text-center">Opp</td>
 | 
			
		||||
                                                                <td class="text-center">Déf</td>
 | 
			
		||||
                                                                <td></td>
 | 
			
		||||
                                                            {% elif forloop.counter == 4 %}
 | 
			
		||||
                                                                <td></td>
 | 
			
		||||
                                                                <td class="text-center">{% trans "reporter"|capfirst %}</td>
 | 
			
		||||
                                                                <td class="text-center">{% trans "opponent"|capfirst %}</td>
 | 
			
		||||
                                                                <td class="text-center">{% trans "defender"|capfirst %}</td>
 | 
			
		||||
                                                                <td class="text-center">Rap</td>
 | 
			
		||||
                                                                <td class="text-center">Opp</td>
 | 
			
		||||
                                                                <td class="text-center">Déf</td>
 | 
			
		||||
                                                            {% endif %}
 | 
			
		||||
                                                        {% elif pool.size == 5 %}
 | 
			
		||||
                                                            {% if forloop.counter == 1 %}
 | 
			
		||||
                                                                <td class="text-center">{% trans "defender"|capfirst %}</td>
 | 
			
		||||
                                                                <td class="text-center">Déf</td>
 | 
			
		||||
                                                                <td></td>
 | 
			
		||||
                                                                <td class="text-center">{% trans "opponent"|capfirst %}</td>
 | 
			
		||||
                                                                <td class="text-center">{% trans "reporter"|capfirst %}</td>
 | 
			
		||||
                                                                <td class="text-center">Opp</td>
 | 
			
		||||
                                                                <td class="text-center">Rap</td>
 | 
			
		||||
                                                                <td></td>
 | 
			
		||||
                                                            {% elif forloop.counter == 2 %}
 | 
			
		||||
                                                                <td></td>
 | 
			
		||||
                                                                <td class="text-center">{% trans "defender"|capfirst %}</td>
 | 
			
		||||
                                                                <td class="text-center">{% trans "reporter"|capfirst %}</td>
 | 
			
		||||
                                                                <td class="text-center">Déf</td>
 | 
			
		||||
                                                                <td class="text-center">Rap</td>
 | 
			
		||||
                                                                <td></td>
 | 
			
		||||
                                                                <td class="text-center">{% trans "opponent"|capfirst %}</td>
 | 
			
		||||
                                                                <td class="text-center">Opp</td>
 | 
			
		||||
                                                            {% elif forloop.counter == 3 %}
 | 
			
		||||
                                                                <td class="text-center">{% trans "opponent"|capfirst %}</td>
 | 
			
		||||
                                                                <td class="text-center">Opp</td>
 | 
			
		||||
                                                                <td></td>
 | 
			
		||||
                                                                <td class="text-center">{% trans "defender"|capfirst %}</td>
 | 
			
		||||
                                                                <td class="text-center">Déf</td>
 | 
			
		||||
                                                                <td></td>
 | 
			
		||||
                                                                <td class="text-center">{% trans "reporter"|capfirst %}</td>
 | 
			
		||||
                                                                <td class="text-center">Rap</td>
 | 
			
		||||
                                                            {% elif forloop.counter == 4 %}
 | 
			
		||||
                                                                <td class="text-center">{% trans "reporter"|capfirst %}</td>
 | 
			
		||||
                                                                <td class="text-center">{% trans "opponent"|capfirst %}</td>
 | 
			
		||||
                                                                <td class="text-center">Rap</td>
 | 
			
		||||
                                                                <td class="text-center">Opp</td>
 | 
			
		||||
                                                                <td></td>
 | 
			
		||||
                                                                <td class="text-center">{% trans "defender"|capfirst %}</td>
 | 
			
		||||
                                                                <td class="text-center">Déf</td>
 | 
			
		||||
                                                                <td></td>
 | 
			
		||||
                                                            {% elif forloop.counter == 4 %}
 | 
			
		||||
                                                            {% elif forloop.counter == 5 %}
 | 
			
		||||
                                                                <td></td>
 | 
			
		||||
                                                                <td class="text-center">{% trans "reporter"|capfirst %}</td>
 | 
			
		||||
                                                                <td class="text-center">Rap</td>
 | 
			
		||||
                                                                <td></td>
 | 
			
		||||
                                                                <td class="text-center">{% trans "opponent"|capfirst %}</td>
 | 
			
		||||
                                                                <td class="text-center">{% trans "defender"|capfirst %}</td>
 | 
			
		||||
                                                                <td class="text-center">Opp</td>
 | 
			
		||||
                                                                <td class="text-center">Déf</td>
 | 
			
		||||
                                                                <td></td>
 | 
			
		||||
                                                            {% endif %}
 | 
			
		||||
                                                        {% endif %}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user