mirror of
https://gitlab.com/animath/si/plateforme.git
synced 2025-06-24 17:00:34 +02:00
Defender => Reporter
Signed-off-by: Emmy D'Anello <emmy.danello@animath.fr>
This commit is contained in:
@ -490,7 +490,7 @@ class Tournament(models.Model):
|
||||
line = [f"{participation.team.name} ({participation.team.trigram})"]
|
||||
lines.append(line)
|
||||
|
||||
passage1 = Passage.objects.get(pool__tournament=self, pool__round=1, defender=participation)
|
||||
passage1 = Passage.objects.get(pool__tournament=self, pool__round=1, reporter=participation)
|
||||
pool1 = passage1.pool
|
||||
if pool1.participations.count() != 5:
|
||||
position1 = passage1.position
|
||||
@ -502,8 +502,8 @@ class Tournament(models.Model):
|
||||
line.append(f"=SIERREUR('{_('Pool')} {pool1.short_name}'!$D{pool1.juries.count() + 10 + position1}; 0)")
|
||||
line.append(tweak1.diff if tweak1 else 0)
|
||||
|
||||
if Passage.objects.filter(pool__tournament=self, pool__round=2, defender=participation).exists():
|
||||
passage2 = Passage.objects.get(pool__tournament=self, pool__round=2, defender=participation)
|
||||
if Passage.objects.filter(pool__tournament=self, pool__round=2, reporter=participation).exists():
|
||||
passage2 = Passage.objects.get(pool__tournament=self, pool__round=2, reporter=participation)
|
||||
pool2 = passage2.pool
|
||||
if pool2.participations.count() != 5:
|
||||
position2 = passage2.position
|
||||
@ -519,8 +519,8 @@ class Tournament(models.Model):
|
||||
if settings.NB_ROUNDS >= 3:
|
||||
line.append(f"=$B{i + 2} + $C{i + 2} + $D{i + 2} + E{i + 2}")
|
||||
|
||||
if Passage.objects.filter(pool__tournament=self, pool__round=3, defender=participation).exists():
|
||||
passage3 = Passage.objects.get(pool__tournament=self, pool__round=3, defender=participation)
|
||||
if Passage.objects.filter(pool__tournament=self, pool__round=3, reporter=participation).exists():
|
||||
passage3 = Passage.objects.get(pool__tournament=self, pool__round=3, reporter=participation)
|
||||
pool3 = passage3.pool
|
||||
if pool3.participations.count() != 5:
|
||||
position3 = passage3.position
|
||||
@ -912,36 +912,36 @@ class Participation(models.Model):
|
||||
'content': content,
|
||||
})
|
||||
elif timezone.now() <= tournament.reviews_first_phase_limit + timedelta(hours=2):
|
||||
defender_passage = Passage.objects.get(pool__tournament=self.tournament, pool__round=1, defender=self)
|
||||
reporter_passage = Passage.objects.get(pool__tournament=self.tournament, pool__round=1, reporter=self)
|
||||
opponent_passage = Passage.objects.get(pool__tournament=self.tournament, pool__round=1, opponent=self)
|
||||
reviewer_passage = Passage.objects.get(pool__tournament=self.tournament, pool__round=1, reviewer=self)
|
||||
observer_passage = Passage.objects.filter(pool__tournament=self.tournament, pool__round=1, observer=self)
|
||||
observer_passage = observer_passage.get() if observer_passage.exists() else None
|
||||
|
||||
defender_text = _("<p>The solutions draw is ended. You can check the result on "
|
||||
reporter_text = _("<p>The solutions draw is ended. You can check the result on "
|
||||
"<a href='{draw_url}'>this page</a>.</p>"
|
||||
"<p>For the first round, you will defend "
|
||||
"<p>For the first round, you will present "
|
||||
"<a href='{solution_url}'>your solution of the problem {problem}</a>.</p>")
|
||||
draw_url = reverse_lazy("draw:index")
|
||||
solution_url = defender_passage.defended_solution.file.url
|
||||
defender_content = format_lazy(defender_text, draw_url=draw_url,
|
||||
solution_url=solution_url, problem=defender_passage.solution_number)
|
||||
solution_url = reporter_passage.reported_solution.file.url
|
||||
reporter_content = format_lazy(reporter_text, draw_url=draw_url,
|
||||
solution_url=solution_url, problem=reporter_passage.solution_number)
|
||||
|
||||
opponent_text = _("<p>You will oppose the solution of the team {opponent} on the "
|
||||
"<a href='{solution_url}'>problem {problem}</a>. "
|
||||
"You can upload your written review on <a href='{passage_url}'>this page</a>.</p>")
|
||||
solution_url = opponent_passage.defended_solution.file.url
|
||||
solution_url = opponent_passage.reported_solution.file.url
|
||||
passage_url = reverse_lazy("participation:passage_detail", args=(opponent_passage.pk,))
|
||||
opponent_content = format_lazy(opponent_text, opponent=opponent_passage.defender.team.trigram,
|
||||
opponent_content = format_lazy(opponent_text, opponent=opponent_passage.reporter.team.trigram,
|
||||
solution_url=solution_url,
|
||||
problem=opponent_passage.solution_number, passage_url=passage_url)
|
||||
|
||||
reviewer_text = _("<p>You will report the solution of the team {reviewer} on the "
|
||||
"<a href='{solution_url}'>problem {problem}</a>. "
|
||||
"You can upload your written review on <a href='{passage_url}'>this page</a>.</p>")
|
||||
solution_url = reviewer_passage.defended_solution.file.url
|
||||
solution_url = reviewer_passage.reported_solution.file.url
|
||||
passage_url = reverse_lazy("participation:passage_detail", args=(reviewer_passage.pk,))
|
||||
reviewer_content = format_lazy(reviewer_text, reviewer=reviewer_passage.defender.team.trigram,
|
||||
reviewer_content = format_lazy(reviewer_text, reviewer=reviewer_passage.reporter.team.trigram,
|
||||
solution_url=solution_url,
|
||||
problem=reviewer_passage.solution_number, passage_url=passage_url)
|
||||
|
||||
@ -949,10 +949,10 @@ class Participation(models.Model):
|
||||
observer_text = _("<p>You will observe the solution of the team {observer} on the "
|
||||
"<a href='{solution_url}'>problem {problem}</a>. "
|
||||
"You can upload your written review on <a href='{passage_url}'>this page</a>.</p>")
|
||||
solution_url = observer_passage.defended_solution.file.url
|
||||
solution_url = observer_passage.reported_solution.file.url
|
||||
passage_url = reverse_lazy("participation:passage_detail", args=(observer_passage.pk,))
|
||||
observer_content = format_lazy(observer_text,
|
||||
observer=observer_passage.defender.team.trigram,
|
||||
observer=observer_passage.reporter.team.trigram,
|
||||
solution_url=solution_url,
|
||||
problem=observer_passage.solution_number, passage_url=passage_url)
|
||||
else:
|
||||
@ -968,7 +968,7 @@ class Participation(models.Model):
|
||||
for ext in ["pdf", "tex"])
|
||||
reviews_templates_content = f"<p>{_('Templates:')} {reviews_templates}</p>"
|
||||
|
||||
content = defender_content + opponent_content + reviewer_content + observer_content \
|
||||
content = reporter_content + opponent_content + reviewer_content + observer_content \
|
||||
+ reviews_templates_content
|
||||
informations.append({
|
||||
'title': _("First round"),
|
||||
@ -977,34 +977,34 @@ class Participation(models.Model):
|
||||
'content': content,
|
||||
})
|
||||
elif timezone.now() <= tournament.reviews_second_phase_limit + timedelta(hours=2):
|
||||
defender_passage = Passage.objects.get(pool__tournament=self.tournament, pool__round=2, defender=self)
|
||||
reporter_passage = Passage.objects.get(pool__tournament=self.tournament, pool__round=2, reporter=self)
|
||||
opponent_passage = Passage.objects.get(pool__tournament=self.tournament, pool__round=2, opponent=self)
|
||||
reviewer_passage = Passage.objects.get(pool__tournament=self.tournament, pool__round=2, reviewer=self)
|
||||
observer_passage = Passage.objects.filter(pool__tournament=self.tournament, pool__round=2, observer=self)
|
||||
observer_passage = observer_passage.get() if observer_passage.exists() else None
|
||||
|
||||
defender_text = _("<p>For the second round, you will defend "
|
||||
reporter_text = _("<p>For the second round, you will present "
|
||||
"<a href='{solution_url}'>your solution of the problem {problem}</a>.</p>")
|
||||
draw_url = reverse_lazy("draw:index")
|
||||
solution_url = defender_passage.defended_solution.file.url
|
||||
defender_content = format_lazy(defender_text, draw_url=draw_url,
|
||||
solution_url=solution_url, problem=defender_passage.solution_number)
|
||||
solution_url = reporter_passage.reported_solution.file.url
|
||||
reporter_content = format_lazy(reporter_text, draw_url=draw_url,
|
||||
solution_url=solution_url, problem=reporter_passage.solution_number)
|
||||
|
||||
opponent_text = _("<p>You will oppose the solution of the team {opponent} on the "
|
||||
"<a href='{solution_url}'>problem {problem}</a>. "
|
||||
"You can upload your written review on <a href='{passage_url}'>this page</a>.</p>")
|
||||
solution_url = opponent_passage.defended_solution.file.url
|
||||
solution_url = opponent_passage.reported_solution.file.url
|
||||
passage_url = reverse_lazy("participation:passage_detail", args=(opponent_passage.pk,))
|
||||
opponent_content = format_lazy(opponent_text, opponent=opponent_passage.defender.team.trigram,
|
||||
opponent_content = format_lazy(opponent_text, opponent=opponent_passage.reporter.team.trigram,
|
||||
solution_url=solution_url,
|
||||
problem=opponent_passage.solution_number, passage_url=passage_url)
|
||||
|
||||
reviewer_text = _("<p>You will report the solution of the team {reviewer} on the "
|
||||
"<a href='{solution_url}'>problem {problem}</a>. "
|
||||
"You can upload your written review on <a href='{passage_url}'>this page</a>.</p>")
|
||||
solution_url = reviewer_passage.defended_solution.file.url
|
||||
solution_url = reviewer_passage.reported_solution.file.url
|
||||
passage_url = reverse_lazy("participation:passage_detail", args=(reviewer_passage.pk,))
|
||||
reviewer_content = format_lazy(reviewer_text, reviewer=reviewer_passage.defender.team.trigram,
|
||||
reviewer_content = format_lazy(reviewer_text, reviewer=reviewer_passage.reporter.team.trigram,
|
||||
solution_url=solution_url,
|
||||
problem=reviewer_passage.solution_number, passage_url=passage_url)
|
||||
|
||||
@ -1012,10 +1012,10 @@ class Participation(models.Model):
|
||||
observer_text = _("<p>You will observe the solution of the team {observer} on the "
|
||||
"<a href='{solution_url}'>problem {problem}</a>. "
|
||||
"You can upload your written review on <a href='{passage_url}'>this page</a>.</p>")
|
||||
solution_url = observer_passage.defended_solution.file.url
|
||||
solution_url = observer_passage.reported_solution.file.url
|
||||
passage_url = reverse_lazy("participation:passage_detail", args=(observer_passage.pk,))
|
||||
observer_content = format_lazy(observer_text,
|
||||
observer=observer_passage.defender.team.trigram,
|
||||
observer=observer_passage.reporter.team.trigram,
|
||||
solution_url=solution_url,
|
||||
problem=observer_passage.solution_number, passage_url=passage_url)
|
||||
else:
|
||||
@ -1031,7 +1031,7 @@ class Participation(models.Model):
|
||||
for ext in ["pdf", "tex"])
|
||||
reviews_templates_content = f"<p>{_('Templates:')} {reviews_templates}</p>"
|
||||
|
||||
content = defender_content + opponent_content + reviewer_content + observer_content \
|
||||
content = reporter_content + opponent_content + reviewer_content + observer_content \
|
||||
+ reviews_templates_content
|
||||
informations.append({
|
||||
'title': _("Second round"),
|
||||
@ -1041,34 +1041,34 @@ class Participation(models.Model):
|
||||
})
|
||||
elif settings.TFJM_APP == "ETEAM" \
|
||||
and timezone.now() <= tournament.reviews_third_phase_limit + timedelta(hours=2):
|
||||
defender_passage = Passage.objects.get(pool__tournament=self.tournament, pool__round=3, defender=self)
|
||||
reporter_passage = Passage.objects.get(pool__tournament=self.tournament, pool__round=3, reporter=self)
|
||||
opponent_passage = Passage.objects.get(pool__tournament=self.tournament, pool__round=3, opponent=self)
|
||||
reviewer_passage = Passage.objects.get(pool__tournament=self.tournament, pool__round=3, reviewer=self)
|
||||
observer_passage = Passage.objects.filter(pool__tournament=self.tournament, pool__round=3, observer=self)
|
||||
observer_passage = observer_passage.get() if observer_passage.exists() else None
|
||||
|
||||
defender_text = _("<p>For the third round, you will defend "
|
||||
reporter_text = _("<p>For the third round, you will present "
|
||||
"<a href='{solution_url}'>your solution of the problem {problem}</a>.</p>")
|
||||
draw_url = reverse_lazy("draw:index")
|
||||
solution_url = defender_passage.defended_solution.file.url
|
||||
defender_content = format_lazy(defender_text, draw_url=draw_url,
|
||||
solution_url=solution_url, problem=defender_passage.solution_number)
|
||||
solution_url = reporter_passage.reported_solution.file.url
|
||||
reporter_content = format_lazy(reporter_text, draw_url=draw_url,
|
||||
solution_url=solution_url, problem=reporter_passage.solution_number)
|
||||
|
||||
opponent_text = _("<p>You will oppose the solution of the team {opponent} on the "
|
||||
"<a href='{solution_url}'>problem {problem}</a>. "
|
||||
"You can upload your written review on <a href='{passage_url}'>this page</a>.</p>")
|
||||
solution_url = opponent_passage.defended_solution.file.url
|
||||
solution_url = opponent_passage.reported_solution.file.url
|
||||
passage_url = reverse_lazy("participation:passage_detail", args=(opponent_passage.pk,))
|
||||
opponent_content = format_lazy(opponent_text, opponent=opponent_passage.defender.team.trigram,
|
||||
opponent_content = format_lazy(opponent_text, opponent=opponent_passage.reporter.team.trigram,
|
||||
solution_url=solution_url,
|
||||
problem=opponent_passage.solution_number, passage_url=passage_url)
|
||||
|
||||
reviewer_text = _("<p>You will report the solution of the team {reviewer} on the "
|
||||
"<a href='{solution_url}'>problem {problem}</a>. "
|
||||
"You can upload your written review on <a href='{passage_url}'>this page</a>.</p>")
|
||||
solution_url = reviewer_passage.defended_solution.file.url
|
||||
solution_url = reviewer_passage.reported_solution.file.url
|
||||
passage_url = reverse_lazy("participation:passage_detail", args=(reviewer_passage.pk,))
|
||||
reviewer_content = format_lazy(reviewer_text, reviewer=reviewer_passage.defender.team.trigram,
|
||||
reviewer_content = format_lazy(reviewer_text, reviewer=reviewer_passage.reporter.team.trigram,
|
||||
solution_url=solution_url,
|
||||
problem=reviewer_passage.solution_number, passage_url=passage_url)
|
||||
|
||||
@ -1076,10 +1076,10 @@ class Participation(models.Model):
|
||||
observer_text = _("<p>You will observe the solution of the team {observer} on the "
|
||||
"<a href='{solution_url}'>problem {problem}</a>. "
|
||||
"You can upload your written review on <a href='{passage_url}'>this page</a>.</p>")
|
||||
solution_url = observer_passage.defended_solution.file.url
|
||||
solution_url = observer_passage.reported_solution.file.url
|
||||
passage_url = reverse_lazy("participation:passage_detail", args=(observer_passage.pk,))
|
||||
observer_content = format_lazy(observer_text,
|
||||
observer=observer_passage.defender.team.trigram,
|
||||
observer=observer_passage.reporter.team.trigram,
|
||||
solution_url=solution_url,
|
||||
problem=observer_passage.solution_number, passage_url=passage_url)
|
||||
else:
|
||||
@ -1095,7 +1095,7 @@ class Participation(models.Model):
|
||||
for ext in ["pdf", "tex"])
|
||||
reviews_templates_content = f"<p>{_('Templates:')} {reviews_templates}</p>"
|
||||
|
||||
content = defender_content + opponent_content + reviewer_content + observer_content \
|
||||
content = reporter_content + opponent_content + reviewer_content + observer_content \
|
||||
+ reviews_templates_content
|
||||
informations.append({
|
||||
'title': _("Second round"),
|
||||
@ -1204,7 +1204,7 @@ class Pool(models.Model):
|
||||
|
||||
@property
|
||||
def solutions(self):
|
||||
return [passage.defended_solution for passage in self.passages.all()]
|
||||
return [passage.reported_solution for passage in self.passages.all()]
|
||||
|
||||
@property
|
||||
def coeff(self):
|
||||
@ -1251,7 +1251,7 @@ class Pool(models.Model):
|
||||
header = [
|
||||
sum(([str(_("Problem #{problem}").format(problem=passage.solution_number))] + (passage_width - 1) * [""]
|
||||
for passage in passages), start=[str(_("Problem")), ""]),
|
||||
sum(([f"{_('Defender')} ({passage.defender.team.trigram})", "",
|
||||
sum(([f"{_('Reporter')} ({passage.reporter.team.trigram})", "",
|
||||
f"{_('Opponent')} ({passage.opponent.team.trigram})", "",
|
||||
f"{_('Reviewer')} ({passage.reviewer.team.trigram})", ""]
|
||||
+ ([f"{_('Observer')} ({passage.observer.team.trigram})", ""] if has_observer else [])
|
||||
@ -1268,7 +1268,7 @@ class Pool(models.Model):
|
||||
line = [str(jury), jury.id]
|
||||
for passage in passages:
|
||||
note = passage.notes.filter(jury=jury).first()
|
||||
line.extend([note.defender_writing, note.defender_oral, note.opponent_writing, note.opponent_oral,
|
||||
line.extend([note.reporter_writing, note.reporter_oral, note.opponent_writing, note.opponent_oral,
|
||||
note.reviewer_writing, note.reviewer_oral])
|
||||
if has_observer:
|
||||
line.extend([note.observer_writing, note.observer_oral])
|
||||
@ -1284,7 +1284,7 @@ class Pool(models.Model):
|
||||
return getcol((number - 1) // 26) + chr(65 + (number - 1) % 26)
|
||||
|
||||
average = [str(_("Average")), ""]
|
||||
coeffs = sum(([passage.coeff_defender_writing, passage.coeff_defender_oral,
|
||||
coeffs = sum(([passage.coeff_reporter_writing, passage.coeff_reporter_oral,
|
||||
passage.coeff_opponent_writing, passage.coeff_opponent_oral,
|
||||
passage.coeff_reviewer_writing, passage.coeff_reviewer_oral]
|
||||
+ ([passage.coeff_observer_writing, passage.coeff_observer_oral] if has_observer else [])
|
||||
@ -1330,11 +1330,11 @@ class Pool(models.Model):
|
||||
pool__round=self.round,
|
||||
pool__letter=self.letter).order_by('position', 'pool__room')
|
||||
for i, passage in enumerate(all_passages):
|
||||
participation = passage.defender
|
||||
defender_passage = Passage.objects.get(defender=participation,
|
||||
participation = passage.reporter
|
||||
reporter_passage = Passage.objects.get(reporter=participation,
|
||||
pool__tournament=self.tournament, pool__round=self.round)
|
||||
defender_row = 5 + defender_passage.pool.juries.count()
|
||||
defender_col = defender_passage.position - 1
|
||||
reporter_row = 5 + reporter_passage.pool.juries.count()
|
||||
reporter_col = reporter_passage.position - 1
|
||||
|
||||
opponent_passage = Passage.objects.get(opponent=participation,
|
||||
pool__tournament=self.tournament, pool__round=self.round)
|
||||
@ -1347,8 +1347,8 @@ class Pool(models.Model):
|
||||
reviewer_col = reviewer_passage.position - 1
|
||||
|
||||
formula = "="
|
||||
formula += (f"'{_('Pool')} {defender_passage.pool.short_name}'"
|
||||
f"!{getcol(min_column + defender_col * passage_width)}{defender_row + 3}") # Defender
|
||||
formula += (f"'{_('Pool')} {reporter_passage.pool.short_name}'"
|
||||
f"!{getcol(min_column + reporter_col * passage_width)}{reporter_row + 3}") # Reporter
|
||||
formula += (f" + '{_('Pool')} {opponent_passage.pool.short_name}'"
|
||||
f"!{getcol(min_column + opponent_col * passage_width + 2)}{opponent_row + 3}") # Opponent
|
||||
formula += (f" + '{_('Pool')} {reviewer_passage.pool.short_name}'"
|
||||
@ -1362,8 +1362,8 @@ class Pool(models.Model):
|
||||
f"!{getcol(min_column + observer_col * passage_width + 6)}{observer_row + 3}")
|
||||
|
||||
ranking.append([f"{participation.team.name} ({participation.team.trigram})", "",
|
||||
f"='{_('Pool')} {defender_passage.pool.short_name}'"
|
||||
f"!${getcol(3 + defender_col * passage_width)}$1",
|
||||
f"='{_('Pool')} {reporter_passage.pool.short_name}'"
|
||||
f"!${getcol(3 + reporter_col * passage_width)}$1",
|
||||
formula,
|
||||
f"=RANG(D{max_row + 6 + i}; "
|
||||
f"D${max_row + 6}:D${max_row + 5 + pool_size})"])
|
||||
@ -1430,7 +1430,7 @@ class Pool(models.Model):
|
||||
(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 passage in self.passages.filter(reporter_penalties__gte=1).all()]
|
||||
for bg_range, bg_color in bg_colors:
|
||||
r, g, b = bg_color
|
||||
format_requests.append({
|
||||
@ -1684,16 +1684,16 @@ class Passage(models.Model):
|
||||
)
|
||||
|
||||
solution_number = models.PositiveSmallIntegerField(
|
||||
verbose_name=_("defended solution"),
|
||||
verbose_name=_("reported solution"),
|
||||
choices=[
|
||||
(i, format_lazy(_("Problem #{problem}"), problem=i)) for i in range(1, len(settings.PROBLEMS) + 1)
|
||||
],
|
||||
)
|
||||
|
||||
defender = models.ForeignKey(
|
||||
reporter = models.ForeignKey(
|
||||
Participation,
|
||||
on_delete=models.PROTECT,
|
||||
verbose_name=_("defender"),
|
||||
verbose_name=_("reporter"),
|
||||
related_name="+",
|
||||
)
|
||||
|
||||
@ -1721,17 +1721,17 @@ class Passage(models.Model):
|
||||
default=None,
|
||||
)
|
||||
|
||||
defender_penalties = models.PositiveSmallIntegerField(
|
||||
reporter_penalties = models.PositiveSmallIntegerField(
|
||||
verbose_name=_("penalties"),
|
||||
default=0,
|
||||
help_text=_("Number of penalties for the defender. "
|
||||
"The defender will loose a 0.5 coefficient per penalty."),
|
||||
help_text=_("Number of penalties for the reporter. "
|
||||
"The reporter will loose a 0.5 coefficient per penalty."),
|
||||
)
|
||||
|
||||
@property
|
||||
def defended_solution(self) -> "Solution":
|
||||
def reported_solution(self) -> "Solution":
|
||||
return Solution.objects.get(
|
||||
participation=self.defender,
|
||||
participation=self.reporter,
|
||||
problem=self.solution_number,
|
||||
final_solution=self.pool.tournament.final)
|
||||
|
||||
@ -1740,27 +1740,27 @@ class Passage(models.Model):
|
||||
return sum(items) / len(items) if items else 0
|
||||
|
||||
@property
|
||||
def average_defender_writing(self) -> float:
|
||||
return self.avg(note.defender_writing for note in self.notes.all())
|
||||
def average_reporter_writing(self) -> float:
|
||||
return self.avg(note.reporter_writing for note in self.notes.all())
|
||||
|
||||
@property
|
||||
def coeff_defender_writing(self) -> float:
|
||||
def coeff_reporter_writing(self) -> float:
|
||||
return 1 if settings.TFJM_APP == "TFJM" else 2
|
||||
|
||||
@property
|
||||
def average_defender_oral(self) -> float:
|
||||
return self.avg(note.defender_oral for note in self.notes.all())
|
||||
def average_reporter_oral(self) -> float:
|
||||
return self.avg(note.reporter_oral for note in self.notes.all())
|
||||
|
||||
@property
|
||||
def coeff_defender_oral(self) -> float:
|
||||
def coeff_reporter_oral(self) -> float:
|
||||
coeff = 1.6 if settings.TFJM_APP == "TFJM" else 3
|
||||
coeff *= 1 - 0.25 * self.defender_penalties
|
||||
coeff *= 1 - 0.25 * self.reporter_penalties
|
||||
return coeff
|
||||
|
||||
@property
|
||||
def average_defender(self) -> float:
|
||||
return (self.coeff_defender_writing * self.average_defender_writing
|
||||
+ self.coeff_defender_oral * self.average_defender_oral)
|
||||
def average_reporter(self) -> float:
|
||||
return (self.coeff_reporter_writing * self.average_reporter_writing
|
||||
+ self.coeff_reporter_oral * self.average_reporter_oral)
|
||||
|
||||
@property
|
||||
def average_opponent_writing(self) -> float:
|
||||
@ -1827,8 +1827,8 @@ class Passage(models.Model):
|
||||
|
||||
@property
|
||||
def averages(self):
|
||||
yield self.average_defender_writing
|
||||
yield self.average_defender_oral
|
||||
yield self.average_reporter_writing
|
||||
yield self.average_reporter_oral
|
||||
yield self.average_opponent_writing
|
||||
yield self.average_opponent_oral
|
||||
yield self.average_reviewer_writing
|
||||
@ -1838,7 +1838,7 @@ class Passage(models.Model):
|
||||
yield self.average_observer_oral
|
||||
|
||||
def average(self, participation):
|
||||
avg = self.average_defender if participation == self.defender else self.average_opponent \
|
||||
avg = self.average_reporter if participation == self.reporter else self.average_opponent \
|
||||
if participation == self.opponent else self.average_reviewer if participation == self.reviewer \
|
||||
else self.average_observer if participation == self.observer else 0
|
||||
avg *= self.pool.coeff
|
||||
@ -1849,9 +1849,9 @@ class Passage(models.Model):
|
||||
return reverse_lazy("participation:passage_detail", args=(self.pk,))
|
||||
|
||||
def clean(self):
|
||||
if self.defender not in self.pool.participations.all():
|
||||
if self.reporter not in self.pool.participations.all():
|
||||
raise ValidationError(_("Team {trigram} is not registered in the pool.")
|
||||
.format(trigram=self.defender.team.trigram))
|
||||
.format(trigram=self.reporter.team.trigram))
|
||||
if self.opponent not in self.pool.participations.all():
|
||||
raise ValidationError(_("Team {trigram} is not registered in the pool.")
|
||||
.format(trigram=self.opponent.team.trigram))
|
||||
@ -1864,8 +1864,8 @@ class Passage(models.Model):
|
||||
return super().clean()
|
||||
|
||||
def __str__(self):
|
||||
return _("Passage of {defender} for problem {problem}")\
|
||||
.format(defender=self.defender.team, problem=self.solution_number)
|
||||
return _("Passage of {reporter} for problem {problem}")\
|
||||
.format(reporter=self.reporter.team, problem=self.solution_number)
|
||||
|
||||
class Meta:
|
||||
verbose_name = _("passage")
|
||||
@ -1984,11 +1984,11 @@ class WrittenReview(models.Model):
|
||||
)
|
||||
|
||||
def __str__(self):
|
||||
return _("Written review of {team} as {type} for problem {problem} of {defender}").format(
|
||||
return _("Written review of {team} as {type} for problem {problem} of {reporter}").format(
|
||||
team=self.participation.team.trigram,
|
||||
type=self.get_type_display(),
|
||||
problem=self.passage.solution_number,
|
||||
defender=self.passage.defender.team.trigram,
|
||||
reporter=self.passage.reporter.team.trigram,
|
||||
)
|
||||
|
||||
class Meta:
|
||||
@ -2013,14 +2013,14 @@ class Note(models.Model):
|
||||
related_name="notes",
|
||||
)
|
||||
|
||||
defender_writing = models.PositiveSmallIntegerField(
|
||||
verbose_name=_("defender writing note"),
|
||||
reporter_writing = models.PositiveSmallIntegerField(
|
||||
verbose_name=_("reporter writing note"),
|
||||
choices=[(i, i) for i in range(0, 21)],
|
||||
default=0,
|
||||
)
|
||||
|
||||
defender_oral = models.PositiveSmallIntegerField(
|
||||
verbose_name=_("defender oral note"),
|
||||
reporter_oral = models.PositiveSmallIntegerField(
|
||||
verbose_name=_("reporter oral note"),
|
||||
choices=[(i, i) for i in range(0, 21)],
|
||||
default=0,
|
||||
)
|
||||
@ -2062,8 +2062,8 @@ class Note(models.Model):
|
||||
)
|
||||
|
||||
def get_all(self):
|
||||
yield self.defender_writing
|
||||
yield self.defender_oral
|
||||
yield self.reporter_writing
|
||||
yield self.reporter_oral
|
||||
yield self.opponent_writing
|
||||
yield self.opponent_oral
|
||||
yield self.reviewer_writing
|
||||
@ -2072,10 +2072,10 @@ class Note(models.Model):
|
||||
yield self.observer_writing
|
||||
yield self.observer_oral
|
||||
|
||||
def set_all(self, defender_writing: int, defender_oral: int, opponent_writing: int, opponent_oral: int,
|
||||
def set_all(self, reporter_writing: int, reporter_oral: int, opponent_writing: int, opponent_oral: int,
|
||||
reviewer_writing: int, reviewer_oral: int, observer_writing: int = 0, observer_oral: int = 0):
|
||||
self.defender_writing = defender_writing
|
||||
self.defender_oral = defender_oral
|
||||
self.reporter_writing = reporter_writing
|
||||
self.reporter_oral = reporter_oral
|
||||
self.opponent_writing = opponent_writing
|
||||
self.opponent_oral = opponent_oral
|
||||
self.reviewer_writing = reviewer_writing
|
||||
|
Reference in New Issue
Block a user