From 162423ec84a9a1999c0f42ed9b7c52c7abdf5f1e Mon Sep 17 00:00:00 2001 From: Christoph Urlacher Date: Sat, 2 Mar 2024 17:58:06 +0100 Subject: [PATCH] Combine places with equal points in leaderboard --- formula10/domain/points_model.py | 18 ++++++++++++++++++ formula10/templates/statistics.jinja | 2 +- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/formula10/domain/points_model.py b/formula10/domain/points_model.py index 90295c2..2062e82 100644 --- a/formula10/domain/points_model.py +++ b/formula10/domain/points_model.py @@ -158,9 +158,27 @@ class PointsModel(Model): return sum(self.points_by(user_name=user_name)) def users_sorted_by_points(self) -> List[User]: + """ + Returns the list of users, sorted by their points from race guesses (in descending order). + """ comparator: Callable[[User], int] = lambda user: self.total_points_by(user.name) return sorted(self.all_users(), key=comparator, reverse=True) + def user_standing(self) -> Dict[str, int]: + standing: Dict[str, int] = dict() + + position: int = 1 + last_points: int = 0 + for user in self.users_sorted_by_points(): + if self.total_points_by(user.name) < last_points: + position = position + 1 + + standing[user.name] = position + + last_points = self.total_points_by(user.name) + + return standing + def picks_count(self, user_name: str) -> int: # Treat standing + dnf picks separately return len(self.race_guesses_by(user_name=user_name)) * 2 diff --git a/formula10/templates/statistics.jinja b/formula10/templates/statistics.jinja index cfbccdf..f958b11 100644 --- a/formula10/templates/statistics.jinja +++ b/formula10/templates/statistics.jinja @@ -26,7 +26,7 @@ {% for user in points.users_sorted_by_points() %} - {{ loop.index }} + {{ points.user_standing()[user.name] }} {{ user.name }} {{ points.total_points_by(user.name) }} {{ points.picks_count(user.name) }}