Skip to content
Snippets Groups Projects
Commit 6ed9572e authored by Martin Mareš's avatar Martin Mareš
Browse files

mo.score: Neúspěšní řešitelé nepotřebují jednoznačné pořadí

U neúspěšných řešitelů třídíme primárně podle bodů, sekundárně podle
jména, a jmenovce pak případně podle ročníku.

Také jsem do class Score přidal flagy, zda jsou definovaní vítězové
a úspěšní řešitelé.
parent 7a7b732a
No related branches found
No related tags found
1 merge request!36Vylepšení výsledkové listiny
...@@ -83,6 +83,8 @@ class Score: ...@@ -83,6 +83,8 @@ class Score:
round: db.Round round: db.Round
contest: Optional[db.Contest] contest: Optional[db.Contest]
part_states: List[db.PartState] part_states: List[db.PartState]
want_successful: bool
want_winners: bool
# Řádky výsledkovky # Řádky výsledkovky
_results: Dict[int, ScoreResult] _results: Dict[int, ScoreResult]
...@@ -104,6 +106,8 @@ class Score: ...@@ -104,6 +106,8 @@ class Score:
self.round = round self.round = round
self.contest = contest self.contest = contest
self.part_states = part_states self.part_states = part_states
self.want_successful = round.score_successful_limit is not None
self.want_winners = round.score_winner_limit is not None
# Příprava subquery na účastníky (contest_subq obsahuje master_contest_id) # Příprava subquery na účastníky (contest_subq obsahuje master_contest_id)
sess = db.get_session() sess = db.get_session()
...@@ -187,14 +191,8 @@ class Score: ...@@ -187,14 +191,8 @@ class Score:
def _mark_winners(self): def _mark_winners(self):
for result in self._results.values(): for result in self._results.values():
total_points = result.get_total_points() total_points = result.get_total_points()
result.winner = ( result.winner = self.want_winners and total_points >= self.round.score_winner_limit
self.round.score_winner_limit is not None result.successful = self.want_successful and total_points >= self.round.score_successful_limit
and total_points >= self.round.score_winner_limit
)
result.successful = (
self.round.score_successful_limit is not None
and total_points >= self.round.score_successful_limit
)
def _load_prev_round(self, step: int) -> bool: def _load_prev_round(self, step: int) -> bool:
"""Načtení úloh a řešení předchozího kola, pokud takové existuje.""" """Načtení úloh a řešení předchozího kola, pokud takové existuje."""
...@@ -338,8 +336,12 @@ class Score: ...@@ -338,8 +336,12 @@ class Score:
points_from_max = list(sorted(sol_points.values())) points_from_max = list(sorted(sol_points.values()))
points_from_difficult = [sol_points[task_id] for task_id in tasks_by_difficulty] points_from_difficult = [sol_points[task_id] for task_id in tasks_by_difficulty]
if result.successful or not self.want_successful:
# Primárně podle počtu získaných bodů, sekundárně podle bodů od maxima, terciárně podle bodů od nejobtížnější # Primárně podle počtu získaných bodů, sekundárně podle bodů od maxima, terciárně podle bodů od nejobtížnější
result._order_key.extend((total_points, points_from_max, points_from_difficult)) result._order_key.extend((total_points, points_from_max, points_from_difficult))
else:
# Neúspěšné řešitele třídíme podle počtu získaných bodů, sekundárně podle jména
result._order_key.extend((total_points, result.user.name_sort_key()))
# Otestujeme, jestli teď existují sdílená místa # Otestujeme, jestli teď existují sdílená místa
if not self._exists_same_order_key(): if not self._exists_same_order_key():
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment