mirror of
https://gitlab.com/animath/si/plateforme.git
synced 2025-02-23 21:41:19 +00:00
Compare commits
3 Commits
86e978faf2
...
3ca0148934
Author | SHA1 | Date | |
---|---|---|---|
|
3ca0148934 | ||
|
58608ea5ff | ||
|
68da61a33b |
@ -502,8 +502,9 @@ class DrawConsumer(AsyncJsonWebsocketConsumer):
|
|||||||
msg = "Les résultats des dés sont les suivants : "
|
msg = "Les résultats des dés sont les suivants : "
|
||||||
msg += ", ".join(f"<strong>{td.participation.team.trigram}</strong> ({td.passage_dice})" for td in tds)
|
msg += ", ".join(f"<strong>{td.participation.team.trigram}</strong> ({td.passage_dice})" for td in tds)
|
||||||
msg += ". L'ordre de passage et les compositions des différentes poules sont affiché⋅es sur le côté. "
|
msg += ". L'ordre de passage et les compositions des différentes poules sont affiché⋅es sur le côté. "
|
||||||
msg += "Attention : les ordres de passage sont déterminés à partir des scores des dés, mais ne sont pas "
|
msg += "Les ordres de passage pour le premier tour sont déterminés à partir des scores des dés, "
|
||||||
msg += "directement l'ordre croissant des dés, afin d'avoir des poules mélangées."
|
msg += "dans l'ordre croissant. Pour le deuxième tour, les ordres de passage sont déterminés à partir "
|
||||||
|
msg += "des ordres de passage du premier tour."
|
||||||
self.tournament.draw.last_message = msg
|
self.tournament.draw.last_message = msg
|
||||||
await self.tournament.draw.asave()
|
await self.tournament.draw.asave()
|
||||||
|
|
||||||
@ -936,7 +937,7 @@ class DrawConsumer(AsyncJsonWebsocketConsumer):
|
|||||||
if already_refused:
|
if already_refused:
|
||||||
msg += "Cela n'ajoute pas de pénalité."
|
msg += "Cela n'ajoute pas de pénalité."
|
||||||
else:
|
else:
|
||||||
msg += "Cela ajoute une pénalité de 0.5 sur le coefficient de l'oral de la défense."
|
msg += "Cela ajoute une pénalité de 25 % sur le coefficient de l'oral de la défense."
|
||||||
self.tournament.draw.last_message = msg
|
self.tournament.draw.last_message = msg
|
||||||
await self.tournament.draw.asave()
|
await self.tournament.draw.asave()
|
||||||
|
|
||||||
@ -1018,7 +1019,8 @@ class DrawConsumer(AsyncJsonWebsocketConsumer):
|
|||||||
r2 = await self.tournament.draw.round_set.filter(number=2).aget()
|
r2 = await self.tournament.draw.round_set.filter(number=2).aget()
|
||||||
self.tournament.draw.current_round = r2
|
self.tournament.draw.current_round = r2
|
||||||
msg = "Le tirage au sort pour le tour 2 va commencer. " \
|
msg = "Le tirage au sort pour le tour 2 va commencer. " \
|
||||||
"L'ordre de passage est déterminé à partir du classement du premier tour."
|
"L'ordre de passage est déterminé à partir du classement du premier tour, " \
|
||||||
|
"de sorte à mélanger les équipes entre les deux jours."
|
||||||
self.tournament.draw.last_message = msg
|
self.tournament.draw.last_message = msg
|
||||||
await self.tournament.draw.asave()
|
await self.tournament.draw.asave()
|
||||||
|
|
||||||
|
@ -148,7 +148,7 @@ class Draw(models.Model):
|
|||||||
# The problem can be rejected
|
# The problem can be rejected
|
||||||
s += "Elle peut décider d'accepter ou de refuser ce problème. "
|
s += "Elle peut décider d'accepter ou de refuser ce problème. "
|
||||||
if len(td.rejected) >= len(settings.PROBLEMS) - 5:
|
if len(td.rejected) >= len(settings.PROBLEMS) - 5:
|
||||||
s += "Refuser ce problème ajoutera une nouvelle pénalité de 0.5 sur le coefficient de l'oral de la défense."
|
s += "Refuser ce problème ajoutera une nouvelle pénalité de 25 % sur le coefficient de l'oral de la défense."
|
||||||
else:
|
else:
|
||||||
s += f"Il reste {len(settings.PROBLEMS) - 5 - len(td.rejected)} refus sans pénalité."
|
s += f"Il reste {len(settings.PROBLEMS) - 5 - len(td.rejected)} refus sans pénalité."
|
||||||
case 'WAITING_FINAL':
|
case 'WAITING_FINAL':
|
||||||
@ -532,9 +532,9 @@ class TeamDraw(models.Model):
|
|||||||
@property
|
@property
|
||||||
def penalty(self):
|
def penalty(self):
|
||||||
"""
|
"""
|
||||||
The penalty multiplier on the defender oral, which is a malus of 0.5 for each penalty.
|
The penalty multiplier on the defender oral, in percentage, which is a malus of 25% for each penalty.
|
||||||
"""
|
"""
|
||||||
return 0.5 * self.penalty_int
|
return 25 * self.penalty_int
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return str(format_lazy(_("Draw of the team {trigram} for the pool {letter}{number}"),
|
return str(format_lazy(_("Draw of the team {trigram} for the pool {letter}{number}"),
|
||||||
|
@ -622,14 +622,14 @@ document.addEventListener('DOMContentLoaded', () => {
|
|||||||
|
|
||||||
let penaltyDiv = document.getElementById(`recap-${tid}-round-${round}-team-${team}-penalty`)
|
let penaltyDiv = document.getElementById(`recap-${tid}-round-${round}-team-${team}-penalty`)
|
||||||
if (rejected.length > problems_count - 5) {
|
if (rejected.length > problems_count - 5) {
|
||||||
// If more than P - 5 problems were rejected, add a penalty of 0.5 of the coefficient of the oral defender
|
// If more than P - 5 problems were rejected, add a penalty of 25% of the coefficient of the oral defender
|
||||||
if (penaltyDiv === null) {
|
if (penaltyDiv === null) {
|
||||||
penaltyDiv = document.createElement('div')
|
penaltyDiv = document.createElement('div')
|
||||||
penaltyDiv.id = `recap-${tid}-round-${round}-team-${team}-penalty`
|
penaltyDiv.id = `recap-${tid}-round-${round}-team-${team}-penalty`
|
||||||
penaltyDiv.classList.add('badge', 'rounded-pill', 'text-bg-info')
|
penaltyDiv.classList.add('badge', 'rounded-pill', 'text-bg-info')
|
||||||
recapDiv.parentNode.append(penaltyDiv)
|
recapDiv.parentNode.append(penaltyDiv)
|
||||||
}
|
}
|
||||||
penaltyDiv.textContent = `❌ ${0.5 * (rejected.length - (problems_count - 5))}`
|
penaltyDiv.textContent = `❌ ${25 * (rejected.length - (problems_count - 5))} %`
|
||||||
} else {
|
} else {
|
||||||
// Eventually remove this div
|
// Eventually remove this div
|
||||||
if (penaltyDiv !== null)
|
if (penaltyDiv !== null)
|
||||||
|
@ -99,7 +99,7 @@
|
|||||||
{# If needed, add the penalty of the team #}
|
{# If needed, add the penalty of the team #}
|
||||||
<div id="recap-{{ tournament.id }}-round-{{ round.number }}-team-{{ td.participation.team.trigram }}-penalty"
|
<div id="recap-{{ tournament.id }}-round-{{ round.number }}-team-{{ td.participation.team.trigram }}-penalty"
|
||||||
class="badge rounded-pill text-bg-info">
|
class="badge rounded-pill text-bg-info">
|
||||||
❌ {{ td.penalty }}
|
❌ {{ td.penalty }} %
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</li>
|
</li>
|
||||||
|
@ -7,7 +7,7 @@ from django.utils.translation import activate
|
|||||||
import gspread
|
import gspread
|
||||||
from gspread.utils import a1_range_to_grid_range, MergeType
|
from gspread.utils import a1_range_to_grid_range, MergeType
|
||||||
|
|
||||||
from ...models import Tournament
|
from ...models import Passage, Tournament
|
||||||
|
|
||||||
|
|
||||||
class Command(BaseCommand):
|
class Command(BaseCommand):
|
||||||
@ -50,14 +50,14 @@ class Command(BaseCommand):
|
|||||||
team2, score2 = sorted_notes[1]
|
team2, score2 = sorted_notes[1]
|
||||||
team3, score3 = sorted_notes[2]
|
team3, score3 = sorted_notes[2]
|
||||||
|
|
||||||
pool1 = tournament.pools.get(round=1, participations=team2)
|
pool1 = tournament.pools.filter(round=1, participations=team2).first()
|
||||||
defender_passage_1 = pool1.passages.get(defender=team2)
|
defender_passage_1 = Passage.objects.get(pool__tournament=tournament, pool__round=1, defender=team2)
|
||||||
opponent_passage_1 = pool1.passages.get(opponent=team2)
|
opponent_passage_1 = Passage.objects.get(pool__tournament=tournament, pool__round=1, opponent=team2)
|
||||||
reporter_passage_1 = pool1.passages.get(reporter=team2)
|
reporter_passage_1 = Passage.objects.get(pool__tournament=tournament, pool__round=1, reporter=team2)
|
||||||
pool2 = tournament.pools.get(round=2, participations=team2)
|
pool2 = tournament.pools.filter(round=2, participations=team2).first()
|
||||||
defender_passage_2 = pool2.passages.get(defender=team2)
|
defender_passage_2 = Passage.objects.get(pool__tournament=tournament, pool__round=2, defender=team2)
|
||||||
opponent_passage_2 = pool2.passages.get(opponent=team2)
|
opponent_passage_2 = Passage.objects.get(pool__tournament=tournament, pool__round=2, opponent=team2)
|
||||||
reporter_passage_2 = pool2.passages.get(reporter=team2)
|
reporter_passage_2 = Passage.objects.get(pool__tournament=tournament, pool__round=2, reporter=team2)
|
||||||
|
|
||||||
line.append(team2.team.trigram)
|
line.append(team2.team.trigram)
|
||||||
line.append(str(pool1.jury_president or ""))
|
line.append(str(pool1.jury_president or ""))
|
||||||
|
@ -866,7 +866,6 @@ class Participation(models.Model):
|
|||||||
'content': content,
|
'content': content,
|
||||||
})
|
})
|
||||||
elif timezone.now() <= tournament.syntheses_second_phase_limit + timedelta(hours=2):
|
elif timezone.now() <= tournament.syntheses_second_phase_limit + timedelta(hours=2):
|
||||||
pool = self.pools.get(round=2, tournament=tournament)
|
|
||||||
defender_passage = Passage.objects.get(pool__tournament=self.tournament, pool__round=2, defender=self)
|
defender_passage = Passage.objects.get(pool__tournament=self.tournament, pool__round=2, defender=self)
|
||||||
opponent_passage = Passage.objects.get(pool__tournament=self.tournament, pool__round=2, opponent=self)
|
opponent_passage = Passage.objects.get(pool__tournament=self.tournament, pool__round=2, opponent=self)
|
||||||
reporter_passage = Passage.objects.get(pool__tournament=self.tournament, pool__round=2, reporter=self)
|
reporter_passage = Passage.objects.get(pool__tournament=self.tournament, pool__round=2, reporter=self)
|
||||||
@ -1197,6 +1196,9 @@ class Pool(models.Model):
|
|||||||
(f"C{max_row + 1}:{getcol(2 + passages.count() * passage_width)}{max_row + 3}", (0.9, 0.9, 0.9)),
|
(f"C{max_row + 1}:{getcol(2 + passages.count() * passage_width)}{max_row + 3}", (0.9, 0.9, 0.9)),
|
||||||
(f"A{max_row + 5}:E{max_row + 5}", (0.8, 0.8, 0.8)),
|
(f"A{max_row + 5}:E{max_row + 5}", (0.8, 0.8, 0.8)),
|
||||||
(f"A{max_row + 6}:E{max_row + 5 + pool_size}", (0.9, 0.9, 0.9)),]
|
(f"A{max_row + 6}:E{max_row + 5 + pool_size}", (0.9, 0.9, 0.9)),]
|
||||||
|
# Display penalties in red
|
||||||
|
bg_colors += [(f"{getcol(2 + (passage.position - 1) * passage_width + 2)}{max_row + 2}", (1.0, 0.7, 0.7))
|
||||||
|
for passage in self.passages.filter(defender_penalties__gte=1).all()]
|
||||||
for bg_range, bg_color in bg_colors:
|
for bg_range, bg_color in bg_colors:
|
||||||
r, g, b = bg_color
|
r, g, b = bg_color
|
||||||
format_requests.append({
|
format_requests.append({
|
||||||
|
@ -1660,7 +1660,6 @@ class PoolNotesTemplateView(VolunteerMixin, DetailView):
|
|||||||
|
|
||||||
table.addElement(TableRow())
|
table.addElement(TableRow())
|
||||||
|
|
||||||
|
|
||||||
if self.object.participations.count() == 5:
|
if self.object.participations.count() == 5:
|
||||||
# 5-teams pools are separated in two different objects.
|
# 5-teams pools are separated in two different objects.
|
||||||
# So, displaying the ranking may don't make any sens. We don't display it for this reason.
|
# So, displaying the ranking may don't make any sens. We don't display it for this reason.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user