Add initial (untested) race guess points calculation
This commit is contained in:
@ -1,19 +1,16 @@
|
||||
from typing import List, Callable, Dict, overload
|
||||
from typing import List, Callable
|
||||
|
||||
from formula10.domain.domain_model import Model
|
||||
from formula10.domain.model.driver import NONE_DRIVER, Driver
|
||||
from formula10.domain.model.driver import Driver
|
||||
from formula10.domain.model.race import Race
|
||||
from formula10.domain.model.race_guess import RaceGuess
|
||||
from formula10.domain.model.race_result import RaceResult
|
||||
from formula10.domain.model.season_guess import SeasonGuess
|
||||
from formula10.domain.model.team import NONE_TEAM, Team
|
||||
from formula10.domain.model.user import User
|
||||
from formula10.database.validation import find_first_else_none, find_multiple_strict, find_single_strict, find_single_or_none_strict, race_has_started
|
||||
from formula10.database.validation import find_first_else_none, find_multiple_strict, race_has_started
|
||||
|
||||
|
||||
class TemplateModel(Model):
|
||||
"""
|
||||
This class bundles all data required from inside a template.
|
||||
This class bundles all data + functionality required from inside a template.
|
||||
"""
|
||||
|
||||
active_user: User | None = None
|
||||
@ -23,6 +20,8 @@ class TemplateModel(Model):
|
||||
_wdc_gained_excluded_abbrs: List[str] = ["RIC"]
|
||||
|
||||
def __init__(self, *, active_user_name: str | None, active_result_race_name: str | None):
|
||||
Model.__init__(self)
|
||||
|
||||
if active_user_name is not None:
|
||||
self.active_user = self.user_by(user_name=active_user_name, ignore=["Everyone"])
|
||||
|
||||
@ -47,126 +46,6 @@ class TemplateModel(Model):
|
||||
|
||||
return self.all_users()
|
||||
|
||||
@overload
|
||||
def user_by(self, *, user_name: str) -> User:
|
||||
"""
|
||||
Tries to obtain the user object for a specific username.
|
||||
"""
|
||||
return self.user_by(user_name=user_name)
|
||||
|
||||
@overload
|
||||
def user_by(self, *, user_name: str, ignore: List[str]) -> User | None:
|
||||
"""
|
||||
Tries to obtain the user object for a specific username, but ignores certain usernames.
|
||||
"""
|
||||
return self.user_by(user_name=user_name, ignore=ignore)
|
||||
|
||||
def user_by(self, *, user_name: str, ignore: List[str] | None = None) -> User | None:
|
||||
if ignore is None:
|
||||
ignore = []
|
||||
|
||||
if len(ignore) > 0 and user_name in ignore:
|
||||
return None
|
||||
|
||||
predicate: Callable[[User], bool] = lambda user: user.name == user_name
|
||||
return find_single_strict(predicate, self.all_users())
|
||||
|
||||
def race_result_by(self, *, race_name: str) -> RaceResult | None:
|
||||
"""
|
||||
Tries to obtain the race result corresponding to a race name.
|
||||
"""
|
||||
predicate: Callable[[RaceResult], bool] = lambda result: result.race.name == race_name
|
||||
return find_single_or_none_strict(predicate, self.all_race_results())
|
||||
|
||||
@overload
|
||||
def race_guesses_by(self, *, user_name: str) -> List[RaceGuess]:
|
||||
"""
|
||||
Returns a list of all race guesses made by a specific user.
|
||||
"""
|
||||
return self.race_guesses_by(user_name=user_name)
|
||||
|
||||
@overload
|
||||
def race_guesses_by(self, *, race_name: str) -> List[RaceGuess]:
|
||||
"""
|
||||
Returns a list of all race guesses made for a specific race.
|
||||
"""
|
||||
return self.race_guesses_by(race_name=race_name)
|
||||
|
||||
@overload
|
||||
def race_guesses_by(self, *, user_name: str, race_name: str) -> RaceGuess | None:
|
||||
"""
|
||||
Returns a single race guess by a specific user for a specific race, or None, if this guess doesn't exist.
|
||||
"""
|
||||
return self.race_guesses_by(user_name=user_name, race_name=race_name)
|
||||
|
||||
@overload
|
||||
def race_guesses_by(self) -> Dict[str, Dict[str, RaceGuess]]:
|
||||
"""
|
||||
Returns a dictionary that maps race-ids to user-id - guess dictionaries.
|
||||
"""
|
||||
return self.race_guesses_by()
|
||||
|
||||
def race_guesses_by(self, *, user_name: str | None = None, race_name: str | None = None) -> RaceGuess | List[RaceGuess] | Dict[str, Dict[str, RaceGuess]] | None:
|
||||
# List of all guesses by a single user
|
||||
if user_name is not None and race_name is None:
|
||||
predicate: Callable[[RaceGuess], bool] = lambda guess: guess.user.name == user_name
|
||||
return find_multiple_strict(predicate, self.all_race_guesses())
|
||||
|
||||
# List of all guesses for a single race
|
||||
if user_name is None and race_name is not None:
|
||||
predicate: Callable[[RaceGuess], bool] = lambda guess: guess.race.name == race_name
|
||||
return find_multiple_strict(predicate, self.all_race_guesses())
|
||||
|
||||
# Guess for a single race by a single user
|
||||
if user_name is not None and race_name is not None:
|
||||
predicate: Callable[[RaceGuess], bool] = lambda guess: guess.user.name == user_name and guess.race.name == race_name
|
||||
return find_single_or_none_strict(predicate, self.all_race_guesses())
|
||||
|
||||
# Dict with all guesses
|
||||
if user_name is None and race_name is None:
|
||||
guesses_by: Dict[str, Dict[str, RaceGuess]] = dict()
|
||||
guess: RaceGuess
|
||||
|
||||
for guess in self.all_race_guesses():
|
||||
if guess.race.name not in guesses_by:
|
||||
guesses_by[guess.race.name] = dict()
|
||||
|
||||
guesses_by[guess.race.name][guess.user.name] = guess
|
||||
|
||||
return guesses_by
|
||||
|
||||
raise Exception("race_guesses_by encountered illegal combination of arguments")
|
||||
|
||||
@overload
|
||||
def season_guesses_by(self, *, user_name: str) -> SeasonGuess:
|
||||
"""
|
||||
Returns the season guess made by a specific user.
|
||||
"""
|
||||
return self.season_guesses_by(user_name=user_name)
|
||||
|
||||
@overload
|
||||
def season_guesses_by(self) -> Dict[str, SeasonGuess]:
|
||||
"""
|
||||
Returns a dictionary of season guesses mapped to usernames.
|
||||
"""
|
||||
return self.season_guesses_by()
|
||||
|
||||
def season_guesses_by(self, *, user_name: str | None = None) -> SeasonGuess | Dict[str, SeasonGuess] | None:
|
||||
if user_name is not None:
|
||||
predicate: Callable[[SeasonGuess], bool] = lambda guess: guess.user.name == user_name
|
||||
return find_single_or_none_strict(predicate, self.all_season_guesses())
|
||||
|
||||
if user_name is None:
|
||||
guesses_by: Dict[str, SeasonGuess] = dict()
|
||||
guess: SeasonGuess
|
||||
|
||||
for guess in self.all_season_guesses():
|
||||
guesses_by[guess.user.name] = guess
|
||||
|
||||
return guesses_by
|
||||
|
||||
raise Exception("season_guesses_by encountered illegal combination of arguments")
|
||||
|
||||
def first_race_without_result(self) -> Race | None:
|
||||
"""
|
||||
Returns the first race-object with no associated race result.
|
||||
@ -200,48 +79,9 @@ class TemplateModel(Model):
|
||||
else:
|
||||
return self.all_races()[0].name_sanitized
|
||||
|
||||
def none_team(self) -> Team:
|
||||
return NONE_TEAM
|
||||
|
||||
def all_drivers_or_active_result_standing_drivers(self) -> List[Driver]:
|
||||
return self.active_result.ordered_standing_list() if self.active_result is not None else self.all_drivers(include_none=False)
|
||||
|
||||
def drivers_for_wdc_gained(self) -> List[Driver]:
|
||||
predicate: Callable[[Driver], bool] = lambda driver: driver.abbr not in self._wdc_gained_excluded_abbrs
|
||||
return find_multiple_strict(predicate, self.all_drivers(include_none=False))
|
||||
|
||||
def none_driver(self) -> Driver:
|
||||
return NONE_DRIVER
|
||||
|
||||
@overload
|
||||
def drivers_by(self, *, team_name: str) -> List[Driver]:
|
||||
"""
|
||||
Returns a list of all drivers driving for a certain team.
|
||||
"""
|
||||
return self.drivers_by(team_name=team_name)
|
||||
|
||||
@overload
|
||||
def drivers_by(self) -> Dict[str, List[Driver]]:
|
||||
"""
|
||||
Returns a dictionary of drivers mapped to team names.
|
||||
"""
|
||||
return self.drivers_by()
|
||||
|
||||
def drivers_by(self, *, team_name: str | None = None) -> List[Driver] | Dict[str, List[Driver]]:
|
||||
if team_name is not None:
|
||||
predicate: Callable[[Driver], bool] = lambda driver: driver.team.name == team_name
|
||||
return find_multiple_strict(predicate, self.all_drivers(include_none=False), 2)
|
||||
|
||||
if team_name is None:
|
||||
drivers_by: Dict[str, List[Driver]] = dict()
|
||||
driver: Driver
|
||||
team: Team
|
||||
|
||||
for team in self.all_teams(include_none=False):
|
||||
drivers_by[team.name] = []
|
||||
for driver in self.all_drivers(include_none=False):
|
||||
drivers_by[driver.team.name] += [driver]
|
||||
|
||||
return drivers_by
|
||||
|
||||
raise Exception("drivers_by encountered illegal combination of arguments")
|
||||
|
Reference in New Issue
Block a user