summaryrefslogtreecommitdiff
path: root/src/match_up/model.py
diff options
context:
space:
mode:
authorKaran Jayachandra <mail@karanjayachandra.com>2024-12-02 19:50:15 +0000
committerKaran Jayachandra <mail@karanjayachandra.com>2024-12-02 19:50:15 +0000
commitfd03b6dd91be67b96356827a2ce4b7728d2e25ea (patch)
tree8d9cf47a6bbac47fe9eeffbc0d92a1eef4323572 /src/match_up/model.py
parent7b7f8cdef5f035ccdab714059c1a6c54b80c4ba3 (diff)
parent662e0854a6c61503954aa659e1c932db69443a06 (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.py100
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))