From 600b6afff3066d5fc9c4eca659f969322e670a77 Mon Sep 17 00:00:00 2001 From: Karan Jayachandra Date: Tue, 15 Oct 2024 12:07:42 +0200 Subject: Cleaned up the code significantly --- model.py | 185 +++++++++++++++------------------------------------------------ 1 file changed, 42 insertions(+), 143 deletions(-) (limited to 'model.py') diff --git a/model.py b/model.py index bfaa9d5..c0b9dd3 100644 --- a/model.py +++ b/model.py @@ -1,89 +1,20 @@ -from math import floor from csv import reader +from typing import Tuple from pathlib import Path -from random import sample -from operator import attrgetter from dataclasses import dataclass -from typing import Tuple - - -@dataclass -class CourtList: - total: int - - def __post_init__(self) -> None: - self.courts = {i + 1: True for i in range(self.total)} - - def get_court_status(self, court_number: int) -> bool: - return self.courts[court_number] - - def toggle_court_status(self, court_number: int) -> None: - current_status = self.courts[court_number] - self.courts[court_number] = not current_status - return not current_status - - def separate_courts(self) -> Tuple[dict, dict]: - active_courts = {k: v for k, v in self.courts.items() if v} - inactive_courts = {k: v for k, v in self.courts.items() if not v} - return active_courts, inactive_courts @dataclass class Player: name: str skill: int = 0 - status: bool = True - - -def create_player_from_row(row: list[str]) -> Player: - return Player(name=row[0], skill=row[1], status=(row[2] == "True")) - - -class PlayerList: - - def __init__(self, location: Path = "players.csv"): - with open(location, newline="") as file: - data_reader = reader(file) - next(data_reader, None) - players = [create_player_from_row(row) for row in data_reader] - players.sort(key=attrgetter("name")) - self.players = players - - def get_player(self, player_request: str): - players = [player for player in self.players if player.name == player_request] - players.sort(key=attrgetter("name")) - return players - - def get_active_players(self): - players = [player for player in self.players if player.status] - players.sort(key=attrgetter("name")) - return players - - def toggle_player(self, player_request: Player): - self.players = [ - ( - Player( - name=player.name, - skill=player.skill, - status=not player.status, - ) - if player.name == player_request - else player - ) - for player in self.players - ] - - def __str__(self): - display_string = "" - for player in self.players: - display_string += player.__str__() + "\n" - return display_string + status: bool = False @dataclass class Team: - player1: Player - player2: Player + player1: str + player2: str @dataclass @@ -93,85 +24,53 @@ class Game: team2: Team -DUMMY_PLAYER = Player(name="-") -DUMMY_TEAM = Team(player1=DUMMY_PLAYER, player2=DUMMY_PLAYER) - - -def create_dummy_games(courts: dict): - return [Game(court, DUMMY_TEAM, DUMMY_TEAM) for court, _ in courts.items()] +@dataclass +class CourtList: + total: int + def __post_init__(self) -> None: + self.courts = {i + 1: True for i in range(self.total)} -RESERVED_PLAYER = Player(name="Reserved") -RESERVED_TEAM = Team(player1=RESERVED_PLAYER, player2=RESERVED_PLAYER) + def get_court_status(self, court_number: int) -> bool: + return self.courts[court_number] + def toggle_court_status(self, court_number: int) -> None: + new_status = not self.courts[court_number] + self.courts[court_number] = new_status + return new_status -def create_reserved_games(courts: dict): - return [Game(court, RESERVED_TEAM, RESERVED_TEAM) for court, _ in courts.items()] + def get_courts(self) -> dict: + return self.courts + def separate_courts(self) -> Tuple[dict, dict]: + active_courts = {k: v for k, v in self.courts.items() if v} + inactive_courts = {k: v for k, v in self.courts.items() if not v} + return active_courts, inactive_courts -PLAYER_PER_COURT = 4 +@dataclass +class PlayerList: + location: Path -def create_game(court: int, players: list[Player]): - team1 = Team(player1=players[0], player2=players[3]) - team2 = Team(player1=players[1], player2=players[2]) - return Game(court, team1, team2) + def __post_init__(self) -> None: + with open(self.location, newline="") as file: + pointer = reader(file) + next(pointer, None) + players = {id: Player(row[0], row[1]) for id, row in enumerate(pointer)} + self.players = players + def get_player_status(self, player_number: int) -> bool: + return self.players[player_number].status -def create_possible_games(courts: dict, players: list[Player]): - count = len(players) - clumped_players = [ - players[i : i + PLAYER_PER_COURT] for i in range(0, count, PLAYER_PER_COURT) - ] - games = [create_game(court, clump) for court, clump in zip(courts, clumped_players)] - return games + def toggle_player_status(self, player_number: int) -> Tuple[bool, str]: + new_status = not self.players[player_number].status + self.players[player_number].status = new_status + return new_status, self.players[player_number].name + def get_players(self) -> dict: + return self.players -@dataclass -class GameList: - - def clear(self, court_list: CourtList): - active_courts, inactive_courts = court_list.separate_courts() - dummy_games = create_dummy_games(active_courts) - reserved_games = create_reserved_games(inactive_courts) - games = dummy_games + reserved_games - games.sort(key=attrgetter("court")) - self.games = games - - def create_random_games(self, courts: CourtList, player_list: PlayerList): - active_players = player_list.get_active_players() - active_courts, inactive_courts = courts.separate_courts() - possible_games = floor(len(active_players) / PLAYER_PER_COURT) - if possible_games > len(active_courts): - possible_games = len(active_courts) - current_players = sample(active_players, possible_games * PLAYER_PER_COURT) - active_games = create_possible_games( - dict(list(active_courts.items())[:possible_games]), current_players - ) - dummy_games = create_dummy_games( - dict(list(active_courts.items())[possible_games:]) - ) - reserved_games = create_reserved_games(inactive_courts) - games = active_games + dummy_games + reserved_games - games.sort(key=attrgetter("court")) - self.games = games - - def create_skilled_games(self, courts: CourtList, player_list: PlayerList): - active_players = player_list.get_active_players() - active_courts, inactive_courts = courts.separate_courts() - possible_games = floor(len(active_players) / PLAYER_PER_COURT) - if possible_games > len(active_courts): - possible_games = len(active_courts) - current_players = sample(active_players, possible_games * PLAYER_PER_COURT) - current_players.sort(key=attrgetter("skill")) - - active_games = create_possible_games( - dict(list(active_courts.items())[:possible_games]), current_players - ) - dummy_games = create_dummy_games( - dict(list(active_courts.items())[possible_games:]) - ) - reserved_games = create_reserved_games(inactive_courts) - games = active_games + dummy_games + reserved_games - games.sort(key=attrgetter("court")) - self.games = games + def separate_players(self) -> Tuple[dict, dict]: + active_players = {k: v for k, v in self.players.items() if v.status} + inactive_players = {k: v for k, v in self.players.items() if not v.status} + return active_players, inactive_players -- cgit v1.3.1