diff options
| author | Karan Jayachandra <mail@karanjayachandra.com> | 2024-12-02 19:50:15 +0000 |
|---|---|---|
| committer | Karan Jayachandra <mail@karanjayachandra.com> | 2024-12-02 19:50:15 +0000 |
| commit | fd03b6dd91be67b96356827a2ce4b7728d2e25ea (patch) | |
| tree | 8d9cf47a6bbac47fe9eeffbc0d92a1eef4323572 /src/match_up/model.py | |
| parent | 7b7f8cdef5f035ccdab714059c1a6c54b80c4ba3 (diff) | |
| parent | 662e0854a6c61503954aa659e1c932db69443a06 (diff) | |
Merge branch 'develop' into 'main'
Develop
See merge request KaranJayachandra/match_up!12
Diffstat (limited to 'src/match_up/model.py')
| -rw-r--r-- | src/match_up/model.py | 100 |
1 files changed, 71 insertions, 29 deletions
diff --git a/src/match_up/model.py b/src/match_up/model.py index c42823b..467310b 100644 --- a/src/match_up/model.py +++ b/src/match_up/model.py @@ -1,21 +1,22 @@ from math import floor from typing import Tuple from os.path import isfile +from pandas import read_csv from dataclasses import dataclass from importlib.resources import path +from random import getrandbits, randint from sqlalchemy.orm import sessionmaker from sqlalchemy import create_engine, not_ -from match_up.utilities import ( - generate_guests, - _init_database_from_csv, - _init_random_database, - _textualize_guest, -) +from names import get_first_name, get_last_name from match_up.data import ( - Player, - DisplayPlayer, + MIN_LEVEL, + MAX_LEVEL, PLAYER_PER_COURT, BASE, + GUEST_LEVELS, + GUESTS_PER_LEVEL, + Player, + DisplayPlayer, ) @@ -43,8 +44,63 @@ class CourtList: return active_courts, inactive_courts +def _init_guests(session) -> None: + for level_id, level in enumerate(GUEST_LEVELS): + for player_id in range(GUESTS_PER_LEVEL): + unique_id = (level_id * GUESTS_PER_LEVEL) + player_id + 1 + player = Player( + id=-unique_id, + first="Guest", + last=str(unique_id), + level=level, + status=False, + count=0, + ) + session.add(player) + session.commit() + + +def _init_database_from_csv(session, csv_location: str) -> None: + data = read_csv(csv_location) + session.query(Player).delete() + for _, entry in data.iterrows(): + player = Player( + id=entry["id"], + first=entry["first"], + last=entry["last"], + level=entry["skill"], + team=entry["team"], + status=False, + count=0, + ) + session.add(player) + session.commit() + _init_guests(session) + + +def _init_random_database(session, player_count: int = 80) -> None: + total_teams = 5 + players_per_team = 5 + for i in range(player_count): + if i < total_teams * players_per_team: + team = floor(i / players_per_team) + 1 + else: + team = 0 + player = Player( + id=i, + first=get_first_name(), + last=get_last_name(), + level=randint(MIN_LEVEL, MAX_LEVEL), + team=team, + status=bool(getrandbits(1)), + count=0, + ) + session.add(player) + session.commit() + _init_guests(session) + + class PlayerList: - guest_count: dict = {1: 0, 3: 0, 5: 0} def __init__(self, csv_location=None) -> None: with path("match_up", "players.db") as p: @@ -64,16 +120,6 @@ class PlayerList: BASE.metadata.create_all(bind=engine) self.session = sessionmaker(bind=engine)() - def increment_guests(self, level: int): - self.guest_count[level] = self.guest_count[level] + 1 - return _textualize_guest(level, self.guest_count[level]) - - def decrement_guests(self, level: int): - if self.guest_count[level] == 0: - return 0 - self.guest_count[level] = self.guest_count[level] - 1 - return _textualize_guest(level, self.guest_count[level]) - def get_player_status(self, id: int) -> bool: return self.session.query(Player).filter(Player.id == id).first().status @@ -83,14 +129,17 @@ class PlayerList: self.session.commit() return DisplayPlayer(player) - def get_all_players(self) -> list[DisplayPlayer]: + def get_all_players(self) -> Tuple[list[DisplayPlayer], list[DisplayPlayer]]: all_players = [ DisplayPlayer(p) for p in self.session.query(Player) .order_by(Player.first, Player.last) .all() ] - return all_players + regulars = [player for player in all_players if player.first != "Guest"] + guests = [player for player in all_players if player.first == "Guest"] + guests.sort(key=lambda x: int(x.last)) + return regulars, guests def get_possible_game_count(self) -> int: total_players = len(self.get_players()) @@ -104,14 +153,7 @@ class PlayerList: .filter(not_(Player.status == 0)) .all() ) - guests = generate_guests(self.guest_count) - return active_players + guests - - def get_guests(self): - return { - level: _textualize_guest(level, self.guest_count[level]) - for level in self.guest_count - } + return active_players def increment_game_count(self, player_ids: list[int]): players = self.session.query(Player).filter(Player.id.in_(player_ids)) |
