Add ability to fake the draw for admins

Signed-off-by: Emmy D'Anello <emmy.danello@animath.fr>
This commit is contained in:
Emmy D'Anello 2023-05-19 18:24:01 +02:00
parent 29074c4bfd
commit 310ac70a74
Signed by: ynerant
GPG Key ID: 3A75C55819C8CF85
2 changed files with 45 additions and 14 deletions

View File

@ -315,6 +315,10 @@ class DrawConsumer(AsyncJsonWebsocketConsumer):
# Launch the dice and get the result # Launch the dice and get the result
res = randint(1, 100) res = randint(1, 100)
if self.registration.is_admin and 'result' in kwargs \
and isinstance(kwargs['result'], int) and (1 <= kwargs['result'] <= 100):
# Admins can force the result
res = int(kwargs['result'])
if state == 'DICE_SELECT_POULES': if state == 'DICE_SELECT_POULES':
team_draw.passage_dice = res team_draw.passage_dice = res
else: else:
@ -591,6 +595,11 @@ class DrawConsumer(AsyncJsonWebsocketConsumer):
while True: while True:
# Choose a random problem # Choose a random problem
problem = randint(1, len(settings.PROBLEMS)) problem = randint(1, len(settings.PROBLEMS))
if self.registration.is_admin and 'problem' in kwargs \
and isinstance(kwargs['problem'], int) and (1 <= kwargs['problem'] <= len(settings.PROBLEMS)):
# Admins can force the draw
problem = int(kwargs['problem'])
# 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
if await TeamDraw.objects.filter(participation_id=td.participation_id, if await TeamDraw.objects.filter(participation_id=td.participation_id,

View File

@ -34,17 +34,19 @@ function cancelLastStep(tid) {
* The parameter `trigram` can be specified (by volunteers) to launch a dice for a specific team. * The parameter `trigram` can be specified (by volunteers) to launch a dice for a specific team.
* @param tid The tournament id * @param tid The tournament id
* @param trigram The trigram of the team that a volunteer wants to force the dice launch (default: null) * @param trigram The trigram of the team that a volunteer wants to force the dice launch (default: null)
* @param result The forced value. Null if unused (for regular people)
*/ */
function drawDice(tid, trigram = null) { function drawDice(tid, trigram = null, result = null) {
socket.send(JSON.stringify({'tid': tid, 'type': 'dice', 'trigram': trigram})) socket.send(JSON.stringify({'tid': tid, 'type': 'dice', 'trigram': trigram, 'result': result}))
} }
/** /**
* Request to draw a new problem. * Request to draw a new problem.
* @param tid The tournament id * @param tid The tournament id
* @param problem The forced problem. Null if unused (for regular people)
*/ */
function drawProblem(tid) { function drawProblem(tid, problem = null) {
socket.send(JSON.stringify({'tid': tid, 'type': 'draw_problem'})) socket.send(JSON.stringify({'tid': tid, 'type': 'draw_problem', 'problem': problem}))
} }
/** /**
@ -196,8 +198,7 @@ document.addEventListener('DOMContentLoaded', () => {
elem.classList.remove('text-bg-success') elem.classList.remove('text-bg-success')
elem.classList.add('text-bg-warning') elem.classList.add('text-bg-warning')
elem.innerText = `${trigram} 🎲 ??` elem.innerText = `${trigram} 🎲 ??`
} } else {
else {
elem.classList.remove('text-bg-warning') elem.classList.remove('text-bg-warning')
elem.classList.add('text-bg-success') elem.classList.add('text-bg-success')
elem.innerText = `${trigram} 🎲 ${result}` elem.innerText = `${trigram} 🎲 ${result}`
@ -510,8 +511,7 @@ document.addEventListener('DOMContentLoaded', () => {
teamTr.append(reporterTd, opponentTd, defenderTd) teamTr.append(reporterTd, opponentTd, defenderTd)
break break
} }
} } else if (poule.teams.length === 4) {
else if (poule.teams.length === 4) {
let emptyTd = document.createElement('td') let emptyTd = document.createElement('td')
switch (i) { switch (i) {
case 0: case 0:
@ -527,8 +527,7 @@ document.addEventListener('DOMContentLoaded', () => {
teamTr.append(emptyTd, reporterTd, opponentTd, defenderTd) teamTr.append(emptyTd, reporterTd, opponentTd, defenderTd)
break break
} }
} } else if (poule.teams.length === 5) {
else if (poule.teams.length === 5) {
let emptyTd = document.createElement('td') let emptyTd = document.createElement('td')
let emptyTd2 = document.createElement('td') let emptyTd2 = document.createElement('td')
switch (i) { switch (i) {
@ -598,8 +597,7 @@ document.addEventListener('DOMContentLoaded', () => {
if (problem !== null) { if (problem !== null) {
recapDiv.classList.remove('text-bg-warning') recapDiv.classList.remove('text-bg-warning')
recapDiv.classList.add('text-bg-success') recapDiv.classList.add('text-bg-success')
} } else {
else {
recapDiv.classList.add('text-bg-warning') recapDiv.classList.add('text-bg-warning')
recapDiv.classList.remove('text-bg-success') recapDiv.classList.remove('text-bg-success')
} }
@ -632,8 +630,7 @@ document.addEventListener('DOMContentLoaded', () => {
recapDiv.parentNode.append(penaltyDiv) recapDiv.parentNode.append(penaltyDiv)
} }
penaltyDiv.textContent = `${0.5 * (rejected.length - (problems_count - 5))}` penaltyDiv.textContent = `${0.5 * (rejected.length - (problems_count - 5))}`
} } else {
else {
// Eventually remove this div // Eventually remove this div
if (penaltyDiv !== null) if (penaltyDiv !== null)
penaltyDiv.remove() penaltyDiv.remove()
@ -786,4 +783,29 @@ document.addEventListener('DOMContentLoaded', () => {
} }
setupSocket() setupSocket()
if (document.querySelector('a[href="/admin/"]')) {
// Administrators can fake the draw
// This is useful for debug purposes, or
document.getElementsByTagName('body')[0].addEventListener('keyup', event => {
if (event.key === 'f') {
let activeTab = document.querySelector('#tournaments-tab button.active')
let tid = activeTab.id.substring(4)
let dice = document.getElementById(`launch-dice-${tid}`)
let box = document.getElementById(`draw-problem-${tid}`)
let value = NaN
if (!dice.classList.contains('d-none')) {
value = parseInt(prompt("Entrez la valeur du dé (laissez vide pour annuler) :"))
if (!isNaN(value) && 1 <= value && value <= 100)
drawDice(tid, null, value)
} else if (!box.classList.contains('d-none')) {
value = parseInt(prompt("Entrez le numéro du problème à choisir (laissez vide pour annuler) :"))
if (!isNaN(value) && 1 <= value && value <= 8)
drawProblem(tid, value)
}
}
})
}
}) })