From 765fe232ac9fded73387d5cb9ba9b0a07f05b4e4 Mon Sep 17 00:00:00 2001 From: Karan Jayachandra Date: Fri, 15 Nov 2024 16:54:29 +0100 Subject: Added the history and reset functionality --- src/match_up/controller.py | 112 +++++++++++++-------------------------------- 1 file changed, 32 insertions(+), 80 deletions(-) (limited to 'src/match_up/controller.py') diff --git a/src/match_up/controller.py b/src/match_up/controller.py index aa72b12..8e89ffd 100644 --- a/src/match_up/controller.py +++ b/src/match_up/controller.py @@ -1,78 +1,18 @@ from typing import Tuple from operator import attrgetter -from dataclasses import dataclass, field -from match_up.utilities import sample_list -from match_up.model import ( - Team, - Game, - Player, - DisplayPlayer, - PlayerList, - CourtList, - MAX_LEVEL, - PLAYER_PER_COURT, -) +from match_up.data import Game, PLAYER_PER_COURT +from match_up.model import Player, PlayerList, CourtList +from match_up.utilities import _create_placeholders, _select_players, _create_games -def _create_placeholders(courts: dict, name: str) -> list[Game]: - dummy_player = Player(first=name) - dummy_team = Team( - player1=DisplayPlayer(dummy_player), player2=DisplayPlayer(dummy_player) - ) - games = [Game(court, dummy_team, dummy_team) for court in courts] - return games - - -def _normalize_skill(level: int, new_max: int) -> int: - new_level = round((new_max - 1) * (level / MAX_LEVEL)) + 1 - return new_level - - -def _select_players(players: list[Player], count: int) -> dict: - identifiers = [player.id for player in players] - play_count = [player.count for player in players] - ids = sample_list(identifiers, play_count, count) - selected_players = [player for player in players if player.id in ids] - return selected_players - - -def _create_groups_of_four_players( - players: list[Player], new_max: int -) -> list[list[Player]]: - identifiers = [player.id for player in players] - player_levels = [_normalize_skill(player.level, new_max) for player in players] - identifiers = sample_list(identifiers, player_levels) - court_players = [] - for i in range(0, len(players), PLAYER_PER_COURT): - court_ids = identifiers[i : i + PLAYER_PER_COURT] - selected_players = [player for player in players if player.id in court_ids] - court_players.append(selected_players) - return court_players - - -def _create_games(courts: dict, players: list[Player], levels: int): - court_players = _create_groups_of_four_players(players, levels) - games = [] - for court, players in zip(courts, court_players): - team1 = Team( - player1=DisplayPlayer(players[0]), player2=DisplayPlayer(players[3]) - ) - team2 = Team( - player1=DisplayPlayer(players[1]), player2=DisplayPlayer(players[2]) - ) - games.append(Game(court, team1, team2)) - return games - - -@dataclass class RoundGenerator: - courts: CourtList = field(default_factory=lambda: CourtList()) - players: PlayerList = field(default_factory=lambda: PlayerList()) - round: int = 0 - proposal: tuple = tuple() + proposed_games: list[Game] = [] + proposed_players: list[Player] = [] - def __post_init__(self) -> None: - self.games = _create_placeholders(self.courts.get_courts(), "---") + def __init__(self) -> None: + self.courts = CourtList() + self.players = PlayerList() + self.reset() def _separate_courts(self, courts: dict) -> Tuple[dict, dict]: possible_games = min(len(courts), self.players.get_possible_game_count()) @@ -89,7 +29,9 @@ class RoundGenerator: games = reserved_games + blank_games return games - def _create_active_games(self, total_levels: int): + def _create_active_games( + self, total_levels: int + ) -> Tuple[list[Game], list[Player]]: active_courts, _ = self.courts.separate_courts() used_courts, _ = self._separate_courts(active_courts) required_player_count = len(used_courts) * PLAYER_PER_COURT @@ -98,28 +40,38 @@ class RoundGenerator: games = _create_games(used_courts, selected_players, total_levels) return games, selected_players - def _generate_proposal(self, total_levels: int) -> Tuple[list[Game], dict]: + def _generate_proposal(self, total_levels: int) -> Tuple[list[Game], list[Player]]: inactive_games = self._create_inactive_games() active_games, selected_players = self._create_active_games(total_levels) games = active_games + inactive_games games.sort(key=attrgetter("court")) return games, selected_players + def update_player_list(self, csv_location): + self.players = PlayerList(csv_location) + def clear(self) -> list[Game]: - self.proposal = tuple() + self.proposed_games = [] + self.proposed_players = [] return self.games def propose(self, levels: int) -> list[Game]: - self.proposal = self._generate_proposal(levels) - return self.proposal[0] + proposal = self._generate_proposal(levels) + self.proposed_games = proposal[0] + self.proposed_players = proposal[1] + return self.proposed_games def confirm(self) -> list[Game]: - proposed_games, proposed_players = self.proposal - if self.games == proposed_games or len(proposed_games) == 0: + if len(self.proposed_games) == 0: return self.games - self.games = proposed_games - identifiers = [player.id for player in proposed_players] + self.games = self.proposed_games + identifiers = [int(player.id) for player in self.proposed_players] self.players.increment_game_count(identifiers) - self.proposal = tuple() self.round += 1 - return self.games + return self.clear() + + def reset(self): + self.round = 0 + self.games = _create_placeholders(self.courts.get_courts(), "---") + self.players.reset_game_count() + return self.games -- cgit v1.3.1