mirror of
https://gitlab.com/animath/si/plateforme.git
synced 2025-06-24 17:00:34 +02:00
Remove observer status
Signed-off-by: Emmy D'Anello <emmy.danello@animath.fr>
This commit is contained in:
@ -979,7 +979,7 @@ class Pool(models.Model):
|
||||
spreadsheet.del_worksheet(spreadsheet.worksheet("Sheet1"))
|
||||
|
||||
pool_size = self.participations.count()
|
||||
passage_width = 7 if pool_size == 4 else 6
|
||||
passage_width = 6
|
||||
passages = self.passages.all()
|
||||
|
||||
header = [
|
||||
@ -988,10 +988,8 @@ class Pool(models.Model):
|
||||
sum(([f"Défenseur⋅se ({passage.defender.team.trigram})", "",
|
||||
f"Opposant⋅e ({passage.opponent.team.trigram})", "",
|
||||
f"Rapporteur⋅rice ({passage.reporter.team.trigram})", ""]
|
||||
+ ([f"Observateur⋅rice ({passage.observer.team.trigram})"] if pool_size == 4 else [])
|
||||
for passage in passages), start=["Rôle", ""]),
|
||||
sum((["Écrit (/20)", "Oral (/20)", "Écrit (/10)", "Oral (/10)", "Écrit (/10)", "Oral (/10)"]
|
||||
+ (["Oral (± 4)"] if pool_size == 4 else [])
|
||||
for _passage in passages), start=["Juré⋅e", ""]),
|
||||
]
|
||||
|
||||
@ -1002,8 +1000,6 @@ class Pool(models.Model):
|
||||
note = passage.notes.filter(jury=jury).first()
|
||||
line.extend([note.defender_writing, note.defender_oral, note.opponent_writing, note.opponent_oral,
|
||||
note.reporter_writing, note.reporter_oral])
|
||||
if pool_size == 4:
|
||||
line.append(note.observer_oral)
|
||||
notes.append(line)
|
||||
notes.append([]) # Add empty line to ensure pretty design
|
||||
|
||||
@ -1016,8 +1012,8 @@ class Pool(models.Model):
|
||||
return getcol((number - 1) // 26) + chr(65 + (number - 1) % 26)
|
||||
|
||||
average = ["Moyenne", ""]
|
||||
coeffs = sum(([1, 1.6 - 0.4 * passage.defender_penalties, 0.9, 2, 0.9, 1]
|
||||
+ ([1] if pool_size == 4 else []) for passage in passages), start=["Coefficient", ""])
|
||||
coeffs = sum(([1, 1.6 - 0.4 * passage.defender_penalties, 0.9, 2, 0.9, 1] for passage in passages),
|
||||
start=["Coefficient", ""])
|
||||
subtotal = ["Sous-total", ""]
|
||||
footer = [average, coeffs, subtotal, 32 * [""]]
|
||||
|
||||
@ -1045,10 +1041,6 @@ class Pool(models.Model):
|
||||
subtotal.extend([f"={rep_w_col}{max_row + 1} * {rep_w_col}{max_row + 2}"
|
||||
f" + {rep_o_col}{max_row + 1} * {rep_o_col}{max_row + 2}", ""])
|
||||
|
||||
if pool_size == 4:
|
||||
obs_col = getcol(min_column + passage_width * i + 6)
|
||||
subtotal.append(f"={obs_col}{max_row + 1} * {obs_col}{max_row + 2}")
|
||||
|
||||
ranking = [
|
||||
["Équipe", "", "Problème", "Total", "Rang"],
|
||||
]
|
||||
@ -1062,10 +1054,10 @@ class Pool(models.Model):
|
||||
]
|
||||
case 4:
|
||||
passage_matrix = [
|
||||
[0, 3, 2, 1],
|
||||
[1, 0, 3, 2],
|
||||
[2, 1, 0, 3],
|
||||
[3, 2, 1, 0],
|
||||
[0, 3, 2],
|
||||
[1, 0, 3],
|
||||
[2, 1, 0],
|
||||
[3, 2, 1],
|
||||
]
|
||||
case 5:
|
||||
passage_matrix = [
|
||||
@ -1082,9 +1074,6 @@ class Pool(models.Model):
|
||||
formula += getcol(min_column + passage_line[0] * passage_width) + str(max_row + 3) # Defender
|
||||
formula += " + " + getcol(min_column + passage_line[1] * passage_width + 2) + str(max_row + 3) # Opponent
|
||||
formula += " + " + getcol(min_column + passage_line[2] * passage_width + 4) + str(max_row + 3) # Reporter
|
||||
if pool_size == 4:
|
||||
# Observer
|
||||
formula += " + " + getcol(min_column + passage_line[3] * passage_width + 6) + str(max_row + 3)
|
||||
ranking.append([f"{participation.team.name} ({participation.team.trigram})", "",
|
||||
f"=${getcol(3 + (passage.position - 1) * passage_width)}$1", formula,
|
||||
f"=RANG(D{max_row + 5 + passage.position}; "
|
||||
@ -1173,8 +1162,6 @@ class Pool(models.Model):
|
||||
for passage in passages:
|
||||
column_widths.append((f"{getcol(3 + passage_width * (passage.position - 1))}"
|
||||
f":{getcol(8 + passage_width * (passage.position - 1))}", 75))
|
||||
if pool_size == 4:
|
||||
column_widths.append((getcol(9 + passage_width * (passage.position - 1)), 120))
|
||||
for column, width in column_widths:
|
||||
grid_range = a1_range_to_grid_range(column, worksheet.id)
|
||||
format_requests.append({
|
||||
@ -1260,8 +1247,8 @@ class Pool(models.Model):
|
||||
for i in range(pool_size):
|
||||
for j in range(passage_width):
|
||||
column = getcol(min_column + i * passage_width + j)
|
||||
min_note = 0 if j < 6 else -4
|
||||
max_note = 20 if j < 2 else 10 if j < 6 else 4
|
||||
min_note = 0
|
||||
max_note = 20 if j < 2 else 10
|
||||
format_requests.append({
|
||||
"setDataValidation": {
|
||||
"range": a1_range_to_grid_range(f"{column}{min_row - 1}:{column}{max_row}", worksheet.id),
|
||||
@ -1350,7 +1337,7 @@ class Pool(models.Model):
|
||||
if not data or not data[0]:
|
||||
return
|
||||
|
||||
passage_width = 7 if self.participations.count() == 4 else 6
|
||||
passage_width = 6
|
||||
for line in data:
|
||||
jury_name = line[0]
|
||||
jury_id = line[1]
|
||||
@ -1422,16 +1409,6 @@ class Passage(models.Model):
|
||||
related_name="+",
|
||||
)
|
||||
|
||||
observer = models.ForeignKey(
|
||||
Participation,
|
||||
on_delete=models.PROTECT,
|
||||
null=True,
|
||||
blank=True,
|
||||
default=None,
|
||||
verbose_name=_("observer"),
|
||||
related_name="+",
|
||||
)
|
||||
|
||||
defender_penalties = models.PositiveSmallIntegerField(
|
||||
verbose_name=_("penalties"),
|
||||
default=0,
|
||||
@ -1486,10 +1463,6 @@ class Passage(models.Model):
|
||||
def average_reporter(self) -> float:
|
||||
return 0.9 * self.average_reporter_writing + self.average_reporter_oral
|
||||
|
||||
@property
|
||||
def average_observer(self) -> float:
|
||||
return self.avg(note.observer_oral for note in self.notes.all())
|
||||
|
||||
@property
|
||||
def averages(self):
|
||||
yield self.average_defender_writing
|
||||
@ -1498,13 +1471,10 @@ class Passage(models.Model):
|
||||
yield self.average_opponent_oral
|
||||
yield self.average_reporter_writing
|
||||
yield self.average_reporter_oral
|
||||
if self.observer:
|
||||
yield self.average_observer
|
||||
|
||||
def average(self, participation):
|
||||
return self.average_defender if participation == self.defender else self.average_opponent \
|
||||
if participation == self.opponent else self.average_reporter if participation == self.reporter \
|
||||
else self.average_observer if participation == self.observer else 0
|
||||
if participation == self.opponent else self.average_reporter if participation == self.reporter else 0
|
||||
|
||||
def get_absolute_url(self):
|
||||
return reverse_lazy("participation:passage_detail", args=(self.pk,))
|
||||
@ -1519,9 +1489,6 @@ class Passage(models.Model):
|
||||
if self.reporter not in self.pool.participations.all():
|
||||
raise ValidationError(_("Team {trigram} is not registered in the pool.")
|
||||
.format(trigram=self.reporter.team.trigram))
|
||||
if self.observer and self.observer not in self.pool.participations.all():
|
||||
raise ValidationError(_("Team {trigram} is not registered in the pool.")
|
||||
.format(trigram=self.observer.team.trigram))
|
||||
return super().clean()
|
||||
|
||||
def __str__(self):
|
||||
@ -1705,12 +1672,6 @@ class Note(models.Model):
|
||||
default=0,
|
||||
)
|
||||
|
||||
observer_oral = models.SmallIntegerField(
|
||||
verbose_name=_("observer note"),
|
||||
choices=zip(range(-4, 5), range(-4, 5)),
|
||||
default=0,
|
||||
)
|
||||
|
||||
def get_all(self):
|
||||
yield self.defender_writing
|
||||
yield self.defender_oral
|
||||
@ -1718,18 +1679,15 @@ class Note(models.Model):
|
||||
yield self.opponent_oral
|
||||
yield self.reporter_writing
|
||||
yield self.reporter_oral
|
||||
if self.passage.observer:
|
||||
yield self.observer_oral
|
||||
|
||||
def set_all(self, defender_writing: int, defender_oral: int, opponent_writing: int, opponent_oral: int,
|
||||
reporter_writing: int, reporter_oral: int, observer_oral: int = 0):
|
||||
reporter_writing: int, reporter_oral: int):
|
||||
self.defender_writing = defender_writing
|
||||
self.defender_oral = defender_oral
|
||||
self.opponent_writing = opponent_writing
|
||||
self.opponent_oral = opponent_oral
|
||||
self.reporter_writing = reporter_writing
|
||||
self.reporter_oral = reporter_oral
|
||||
self.observer_oral = observer_oral
|
||||
|
||||
def update_spreadsheet(self):
|
||||
if not self.has_any_note():
|
||||
@ -1744,7 +1702,7 @@ class Note(models.Model):
|
||||
if not jury_id_cell:
|
||||
raise ValueError("The jury ID cell was not found in the spreadsheet.")
|
||||
jury_row = jury_id_cell.row
|
||||
passage_width = 7 if passage.pool.participations.count() == 4 else 6
|
||||
passage_width = 6
|
||||
|
||||
def getcol(number: int) -> str:
|
||||
if number == 0:
|
||||
|
Reference in New Issue
Block a user