From 6ebbee2016b0232573ad1d322b4d4ca6287b3599 Mon Sep 17 00:00:00 2001 From: Karan Jayachandra Date: Mon, 2 Dec 2024 17:44:24 +0100 Subject: Added the guests with history and level --- src/match_up/utilities.py | 45 ++++++++++++++++++++++----------------------- 1 file changed, 22 insertions(+), 23 deletions(-) (limited to 'src/match_up/utilities.py') diff --git a/src/match_up/utilities.py b/src/match_up/utilities.py index db7c76a..9fc31fa 100644 --- a/src/match_up/utilities.py +++ b/src/match_up/utilities.py @@ -1,6 +1,6 @@ from typing import Tuple from pandas import read_csv -from random import shuffle, choice +from random import shuffle from random import randint, getrandbits from names import get_first_name, get_last_name from match_up.data import ( @@ -11,6 +11,8 @@ from match_up.data import ( MIN_LEVEL, MAX_LEVEL, PLAYER_PER_COURT, + GUESTS_PER_LEVEL, + GUEST_LEVELS, ) @@ -85,28 +87,6 @@ def _create_games(courts: dict, players: list[Player], levels: int) -> list[Game return games -def generate_guest_type(count: int, level: int, description: str): - base_id = level * 10000 - return [ - Player( - id=base_id + i, - first=description, - last=f"{i + 1}", - level=level, - status=True, - count=choice([0, 1000]), - ) - for i in range(count) - ] - - -def generate_guests(guests): - beginner_guests = generate_guest_type(guests[1], 1, "Beginner") - novice_guests = generate_guest_type(guests[3], 3, "Novice") - intermediate_guests = generate_guest_type(guests[5], 3, "Intermediate") - return beginner_guests + novice_guests + intermediate_guests - - def _textualize_guest(level, value) -> str: match level: case 1: @@ -120,6 +100,23 @@ def _textualize_guest(level, value) -> str: return f"{value} {text}" +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 + id = 1000 + unique_id + player = Player( + id=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() @@ -134,6 +131,7 @@ def _init_database_from_csv(session, csv_location: str) -> None: ) session.add(player) session.commit() + _init_guests(session) def _init_random_database(session, player_count: int = 80) -> None: @@ -148,3 +146,4 @@ def _init_random_database(session, player_count: int = 80) -> None: ) session.add(player) session.commit() + _init_guests(session) -- cgit v1.3.1 From beea33bc183837a3feceaf1b5127c2e21e16fc36 Mon Sep 17 00:00:00 2001 From: Karan Jayachandra Date: Mon, 2 Dec 2024 19:33:48 +0100 Subject: Added team based games --- src/match_up/controller.py | 58 +++++++++++++++++++++++++++----------- src/match_up/data.py | 7 ++++- src/match_up/model.py | 7 +---- src/match_up/routes.py | 5 ++-- src/match_up/templates/controls.j2 | 12 ++++++-- src/match_up/utilities.py | 43 +++++++++++++++------------- 6 files changed, 86 insertions(+), 46 deletions(-) (limited to 'src/match_up/utilities.py') diff --git a/src/match_up/controller.py b/src/match_up/controller.py index 0e08cae..585160f 100644 --- a/src/match_up/controller.py +++ b/src/match_up/controller.py @@ -2,7 +2,7 @@ from typing import Tuple from operator import attrgetter 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 +from match_up.utilities import _create_placeholders, _select_players, _create_games, _create_team_games class RoundGenerator: @@ -30,21 +30,44 @@ class RoundGenerator: return games def _create_active_games( - self, total_levels: int + self, total_levels: int, group_by_team: bool ) -> Tuple[list[Game], list[Player]]: - active_courts, _ = self.courts.separate_courts() - used_courts, _ = self._separate_courts(active_courts) + active_courts = self.courts.separate_courts()[0] + used_courts = self._separate_courts(active_courts)[0] required_player_count = len(used_courts) * PLAYER_PER_COURT active_players = self.players.get_players() - selected_players = _select_players(active_players, required_player_count) - games = _create_games(used_courts, selected_players, total_levels) - return games, selected_players + if group_by_team: + unique_team_id = {player.team for player in active_players} + grouped_players_by_team = {team_id: [] for team_id in unique_team_id} + for player in active_players: + team = player.team + grouped_players_by_team[team].append(player) + active_teams = {} + players_without_team = [] + for team_id in grouped_players_by_team: + if team_id == 0: + players_without_team += [player for player in grouped_players_by_team[team_id]] + else: + if len(grouped_players_by_team[team_id]) >= 4: + active_teams[team_id] = grouped_players_by_team[team_id] + else: + players_without_team += [player for player in grouped_players_by_team[team_id]] + + regular_courts = len(used_courts) - len(active_teams) + reg_courts = {A:N for (A,N) in [x for x in used_courts.items()][:regular_courts]} + team_courts = {A:N for (A,N) in [x for x in used_courts.items()][regular_courts:]} - 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")) + required_player_count = required_player_count - (4 * len(active_teams)) + selected_players_without_team = _select_players(players_without_team, required_player_count) + regular_games = _create_games(reg_courts, selected_players_without_team, total_levels) + + team_games, selected_players_with_team = _create_team_games(team_courts, active_teams) + + selected_players = selected_players_without_team + selected_players_with_team + games = regular_games + team_games + else: + selected_players = _select_players(active_players, required_player_count) + games = _create_games(used_courts, selected_players, total_levels) return games, selected_players def update_player_list(self, csv_location): @@ -55,10 +78,13 @@ class RoundGenerator: self.proposed_players = [] return self.games - def propose(self, levels: int) -> list[Game]: - proposal = self._generate_proposal(levels) - self.proposed_games = proposal[0] - self.proposed_players = proposal[1] + def propose(self, levels: int, group_by_team: bool) -> list[Game]: + inactive_games = self._create_inactive_games() + active_games, selected_players = self._create_active_games(levels, group_by_team) + games = active_games + inactive_games + games.sort(key=attrgetter("court")) + self.proposed_games = games + self.proposed_players = selected_players return self.proposed_games def confirm(self) -> list[Game]: diff --git a/src/match_up/data.py b/src/match_up/data.py index 636a5eb..d8996fe 100644 --- a/src/match_up/data.py +++ b/src/match_up/data.py @@ -18,15 +18,18 @@ class Player(BASE): first = Column("first", String) last = Column("last", String) level = Column("level", Integer) + team = Column("team", Integer) status = Column("status", Integer) count = Column("count", Integer) + def __init__( self, id: int, first: str = "", last: str = "", level: int = 0, + team: int = 0, status: bool = True, count: int = 0, ): @@ -34,12 +37,14 @@ class Player(BASE): self.first = first self.last = last self.status = status + self.team = team self.level = level self.count = count def __repr__(self): + team = f" of Team {self.team}" if self.team else "" status = "active" if self.status else "inactive" - return f"{self.first} {self.last} (Level {self.level}) is {status} and has played {self.count} games" + return f"{self.first} {self.last} (Level {self.level}){team} is {status} and has played {self.count} games" class DisplayPlayer: diff --git a/src/match_up/model.py b/src/match_up/model.py index 4ac8c54..52d72b2 100644 --- a/src/match_up/model.py +++ b/src/match_up/model.py @@ -5,13 +5,8 @@ from dataclasses import dataclass from importlib.resources import path from sqlalchemy.orm import sessionmaker from sqlalchemy import create_engine, not_ +from match_up.data import PLAYER_PER_COURT, BASE, Player, DisplayPlayer from match_up.utilities import _init_database_from_csv, _init_random_database -from match_up.data import ( - Player, - DisplayPlayer, - PLAYER_PER_COURT, - BASE, -) @dataclass diff --git a/src/match_up/routes.py b/src/match_up/routes.py index 8ae18ce..f9cd2fa 100644 --- a/src/match_up/routes.py +++ b/src/match_up/routes.py @@ -17,8 +17,9 @@ def get_controls(): @_app.route("/propose", methods=["POST"]) def get_random_games(): - levels = int(request.form["type"].split()[0]) - return render_template("games.j2", games=_rg.propose(levels), title="Proposal") + levels = int(request.form["levels"].split()[0]) + team_practice = request.form["team"] == "Teams" + return render_template("games.j2", games=_rg.propose(levels, team_practice), title="Proposal") @_app.route("/confirm", methods=["POST"]) diff --git a/src/match_up/templates/controls.j2 b/src/match_up/templates/controls.j2 index 95584f7..0183c97 100644 --- a/src/match_up/templates/controls.j2 +++ b/src/match_up/templates/controls.j2 @@ -9,7 +9,7 @@
- @@ -19,11 +19,19 @@
+
+
+ +
+
+ hx-include="[name='levels'], [name='team']">Generate
diff --git a/src/match_up/utilities.py b/src/match_up/utilities.py index 9fc31fa..dd9568c 100644 --- a/src/match_up/utilities.py +++ b/src/match_up/utilities.py @@ -1,13 +1,11 @@ +from math import floor from typing import Tuple -from pandas import read_csv from random import shuffle +from pandas import read_csv from random import randint, getrandbits from names import get_first_name, get_last_name +from match_up.data import Player, DisplayPlayer, Team, Game from match_up.data import ( - Player, - DisplayPlayer, - Team, - Game, MIN_LEVEL, MAX_LEVEL, PLAYER_PER_COURT, @@ -86,27 +84,27 @@ def _create_games(courts: dict, players: list[Player], levels: int) -> list[Game games.append(Game(court, team1, team2)) return games - -def _textualize_guest(level, value) -> str: - match level: - case 1: - text = "Beginners" - case 3: - text = "Novices" - case 5: - text = "Intermediates" - if value == 1: - text = text[:-1] - return f"{value} {text}" +def _create_team_games(courts: dict, teams: dict) -> tuple[list[Game], list[Player]]: + games = [] + selected_players = [] + for court, (_, players) in zip(courts, teams.items()): + selected_players.append(players[:3]) + 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, selected_players 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 - id = 1000 + unique_id player = Player( - id=id, + id=-unique_id, first="Guest", last=str(unique_id), level=level, @@ -135,12 +133,19 @@ def _init_database_from_csv(session, csv_location: str) -> None: 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, ) -- cgit v1.3.1 From b9967b20dddaed6673d2333edc7cdee735ed1395 Mon Sep 17 00:00:00 2001 From: Karan Jayachandra Date: Mon, 2 Dec 2024 19:43:33 +0100 Subject: Added a random selection even for teams --- src/match_up/controller.py | 15 ++++++--------- src/match_up/utilities.py | 8 +++++--- 2 files changed, 11 insertions(+), 12 deletions(-) (limited to 'src/match_up/utilities.py') diff --git a/src/match_up/controller.py b/src/match_up/controller.py index 585160f..a02dd04 100644 --- a/src/match_up/controller.py +++ b/src/match_up/controller.py @@ -2,7 +2,7 @@ from typing import Tuple from operator import attrgetter 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, _create_team_games +from match_up.utilities import _create_placeholders, _select_players, _create_shuffle_games, _create_team_games class RoundGenerator: @@ -45,21 +45,18 @@ class RoundGenerator: active_teams = {} players_without_team = [] for team_id in grouped_players_by_team: - if team_id == 0: + if team_id == 0 or len(grouped_players_by_team[team_id]) < 4: players_without_team += [player for player in grouped_players_by_team[team_id]] else: - if len(grouped_players_by_team[team_id]) >= 4: - active_teams[team_id] = grouped_players_by_team[team_id] - else: - players_without_team += [player for player in grouped_players_by_team[team_id]] + active_teams[team_id] = grouped_players_by_team[team_id] regular_courts = len(used_courts) - len(active_teams) reg_courts = {A:N for (A,N) in [x for x in used_courts.items()][:regular_courts]} team_courts = {A:N for (A,N) in [x for x in used_courts.items()][regular_courts:]} - required_player_count = required_player_count - (4 * len(active_teams)) + required_player_count = required_player_count - (PLAYER_PER_COURT * len(active_teams)) selected_players_without_team = _select_players(players_without_team, required_player_count) - regular_games = _create_games(reg_courts, selected_players_without_team, total_levels) + regular_games = _create_shuffle_games(reg_courts, selected_players_without_team, total_levels) team_games, selected_players_with_team = _create_team_games(team_courts, active_teams) @@ -67,7 +64,7 @@ class RoundGenerator: games = regular_games + team_games else: selected_players = _select_players(active_players, required_player_count) - games = _create_games(used_courts, selected_players, total_levels) + games = _create_shuffle_games(used_courts, selected_players, total_levels) return games, selected_players def update_player_list(self, csv_location): diff --git a/src/match_up/utilities.py b/src/match_up/utilities.py index dd9568c..7d7de08 100644 --- a/src/match_up/utilities.py +++ b/src/match_up/utilities.py @@ -2,7 +2,7 @@ from math import floor from typing import Tuple from random import shuffle from pandas import read_csv -from random import randint, getrandbits +from random import randint, getrandbits, sample from names import get_first_name, get_last_name from match_up.data import Player, DisplayPlayer, Team, Game from match_up.data import ( @@ -71,7 +71,7 @@ def _create_groups_of_four_players( return court_players -def _create_games(courts: dict, players: list[Player], levels: int) -> list[Game]: +def _create_shuffle_games(courts: dict, players: list[Player], levels: int) -> list[Game]: court_players = _create_groups_of_four_players(players, levels) games = [] for court, players in zip(courts, court_players): @@ -88,7 +88,9 @@ def _create_team_games(courts: dict, teams: dict) -> tuple[list[Game], list[Play games = [] selected_players = [] for court, (_, players) in zip(courts, teams.items()): - selected_players.append(players[:3]) + players = sample(players, PLAYER_PER_COURT) + selected_players.append(players) + players.sort(key=lambda x : x.level, reverse=True) team1 = Team( player1=DisplayPlayer(players[0]), player2=DisplayPlayer(players[3]) ) -- cgit v1.3.1 From ed182035cdd39659563b25ffef5387578db25799 Mon Sep 17 00:00:00 2001 From: Karan Jayachandra Date: Mon, 2 Dec 2024 19:54:11 +0100 Subject: Fixed issue of the database not loading the teams --- src/match_up/controller.py | 9 ++++++--- src/match_up/utilities.py | 1 + 2 files changed, 7 insertions(+), 3 deletions(-) (limited to 'src/match_up/utilities.py') diff --git a/src/match_up/controller.py b/src/match_up/controller.py index a02dd04..4c7119f 100644 --- a/src/match_up/controller.py +++ b/src/match_up/controller.py @@ -45,11 +45,14 @@ class RoundGenerator: active_teams = {} players_without_team = [] for team_id in grouped_players_by_team: - if team_id == 0 or len(grouped_players_by_team[team_id]) < 4: + if team_id == 0: players_without_team += [player for player in grouped_players_by_team[team_id]] else: - active_teams[team_id] = grouped_players_by_team[team_id] - + if len(grouped_players_by_team[team_id]) >= 4: + active_teams[team_id] = grouped_players_by_team[team_id] + else: + players_without_team += [player for player in grouped_players_by_team[team_id]] + regular_courts = len(used_courts) - len(active_teams) reg_courts = {A:N for (A,N) in [x for x in used_courts.items()][:regular_courts]} team_courts = {A:N for (A,N) in [x for x in used_courts.items()][regular_courts:]} diff --git a/src/match_up/utilities.py b/src/match_up/utilities.py index 7d7de08..fa82b58 100644 --- a/src/match_up/utilities.py +++ b/src/match_up/utilities.py @@ -126,6 +126,7 @@ def _init_database_from_csv(session, csv_location: str) -> None: first=entry["first"], last=entry["last"], level=entry["skill"], + team=entry["team"], status=False, count=0, ) -- cgit v1.3.1 From 662e0854a6c61503954aa659e1c932db69443a06 Mon Sep 17 00:00:00 2001 From: Karan Jayachandra Date: Mon, 2 Dec 2024 20:47:11 +0100 Subject: Fixed bug with team based games --- src/match_up/controller.py | 54 +++++++++++------------- src/match_up/data.py | 1 - src/match_up/model.py | 71 ++++++++++++++++++++++++++++++- src/match_up/routes.py | 4 +- src/match_up/utilities.py | 102 +++++++++++++++------------------------------ 5 files changed, 131 insertions(+), 101 deletions(-) (limited to 'src/match_up/utilities.py') diff --git a/src/match_up/controller.py b/src/match_up/controller.py index 4c7119f..b00bf6b 100644 --- a/src/match_up/controller.py +++ b/src/match_up/controller.py @@ -2,7 +2,14 @@ from typing import Tuple from operator import attrgetter 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_shuffle_games, _create_team_games +from match_up.utilities import ( + _create_placeholders, + _select_players, + _create_shuffle_games, + _create_team_games, + separate_teams_and_players, + split_courts, +) class RoundGenerator: @@ -37,33 +44,20 @@ class RoundGenerator: required_player_count = len(used_courts) * PLAYER_PER_COURT active_players = self.players.get_players() if group_by_team: - unique_team_id = {player.team for player in active_players} - grouped_players_by_team = {team_id: [] for team_id in unique_team_id} - for player in active_players: - team = player.team - grouped_players_by_team[team].append(player) - active_teams = {} - players_without_team = [] - for team_id in grouped_players_by_team: - if team_id == 0: - players_without_team += [player for player in grouped_players_by_team[team_id]] - else: - if len(grouped_players_by_team[team_id]) >= 4: - active_teams[team_id] = grouped_players_by_team[team_id] - else: - players_without_team += [player for player in grouped_players_by_team[team_id]] - - regular_courts = len(used_courts) - len(active_teams) - reg_courts = {A:N for (A,N) in [x for x in used_courts.items()][:regular_courts]} - team_courts = {A:N for (A,N) in [x for x in used_courts.items()][regular_courts:]} - - required_player_count = required_player_count - (PLAYER_PER_COURT * len(active_teams)) - selected_players_without_team = _select_players(players_without_team, required_player_count) - regular_games = _create_shuffle_games(reg_courts, selected_players_without_team, total_levels) - - team_games, selected_players_with_team = _create_team_games(team_courts, active_teams) - - selected_players = selected_players_without_team + selected_players_with_team + active_teams, team_less_players = separate_teams_and_players(active_players) + regular_court_count = len(used_courts) - len(active_teams) + regular_courts, team_courts = split_courts(used_courts, regular_court_count) + new_player_count = required_player_count - ( + PLAYER_PER_COURT * len(active_teams) + ) + regular_players = _select_players(team_less_players, new_player_count) + regular_games = _create_shuffle_games( + regular_courts, regular_players, total_levels + ) + team_games, selected_team_players = _create_team_games( + team_courts, active_teams + ) + selected_players = regular_players + selected_team_players games = regular_games + team_games else: selected_players = _select_players(active_players, required_player_count) @@ -80,7 +74,9 @@ class RoundGenerator: def propose(self, levels: int, group_by_team: bool) -> list[Game]: inactive_games = self._create_inactive_games() - active_games, selected_players = self._create_active_games(levels, group_by_team) + active_games, selected_players = self._create_active_games( + levels, group_by_team + ) games = active_games + inactive_games games.sort(key=attrgetter("court")) self.proposed_games = games diff --git a/src/match_up/data.py b/src/match_up/data.py index d8996fe..c00dde2 100644 --- a/src/match_up/data.py +++ b/src/match_up/data.py @@ -22,7 +22,6 @@ class Player(BASE): status = Column("status", Integer) count = Column("count", Integer) - def __init__( self, id: int, diff --git a/src/match_up/model.py b/src/match_up/model.py index 52d72b2..467310b 100644 --- a/src/match_up/model.py +++ b/src/match_up/model.py @@ -1,12 +1,23 @@ 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.data import PLAYER_PER_COURT, BASE, Player, DisplayPlayer -from match_up.utilities import _init_database_from_csv, _init_random_database +from names import get_first_name, get_last_name +from match_up.data import ( + MIN_LEVEL, + MAX_LEVEL, + PLAYER_PER_COURT, + BASE, + GUEST_LEVELS, + GUESTS_PER_LEVEL, + Player, + DisplayPlayer, +) @dataclass @@ -33,6 +44,62 @@ 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: def __init__(self, csv_location=None) -> None: diff --git a/src/match_up/routes.py b/src/match_up/routes.py index f9cd2fa..e5a3b99 100644 --- a/src/match_up/routes.py +++ b/src/match_up/routes.py @@ -19,7 +19,9 @@ def get_controls(): def get_random_games(): levels = int(request.form["levels"].split()[0]) team_practice = request.form["team"] == "Teams" - return render_template("games.j2", games=_rg.propose(levels, team_practice), title="Proposal") + return render_template( + "games.j2", games=_rg.propose(levels, team_practice), title="Proposal" + ) @_app.route("/confirm", methods=["POST"]) diff --git a/src/match_up/utilities.py b/src/match_up/utilities.py index fa82b58..7140a5f 100644 --- a/src/match_up/utilities.py +++ b/src/match_up/utilities.py @@ -1,17 +1,7 @@ -from math import floor from typing import Tuple -from random import shuffle -from pandas import read_csv -from random import randint, getrandbits, sample -from names import get_first_name, get_last_name +from random import shuffle, sample from match_up.data import Player, DisplayPlayer, Team, Game -from match_up.data import ( - MIN_LEVEL, - MAX_LEVEL, - PLAYER_PER_COURT, - GUESTS_PER_LEVEL, - GUEST_LEVELS, -) +from match_up.data import MAX_LEVEL, PLAYER_PER_COURT def _shuffle_two_lists(a: list, b: list) -> Tuple[list, list]: @@ -71,7 +61,9 @@ def _create_groups_of_four_players( return court_players -def _create_shuffle_games(courts: dict, players: list[Player], levels: int) -> list[Game]: +def _create_shuffle_games( + courts: dict, players: list[Player], levels: int +) -> list[Game]: court_players = _create_groups_of_four_players(players, levels) games = [] for court, players in zip(courts, court_players): @@ -84,13 +76,14 @@ def _create_shuffle_games(courts: dict, players: list[Player], levels: int) -> l games.append(Game(court, team1, team2)) return games + def _create_team_games(courts: dict, teams: dict) -> tuple[list[Game], list[Player]]: games = [] selected_players = [] for court, (_, players) in zip(courts, teams.items()): players = sample(players, PLAYER_PER_COURT) - selected_players.append(players) - players.sort(key=lambda x : x.level, reverse=True) + selected_players += players + players.sort(key=lambda x: x.level, reverse=True) team1 = Team( player1=DisplayPlayer(players[0]), player2=DisplayPlayer(players[3]) ) @@ -101,57 +94,30 @@ def _create_team_games(courts: dict, teams: dict) -> tuple[list[Game], list[Play return games, selected_players -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 +def separate_teams_and_players(players: list[Player]) -> Tuple[dict, list[Player]]: + unique_team_id = {player.team for player in players} + grouped_players_by_team = {team_id: [] for team_id in unique_team_id} + for player in players: + team = player.team + grouped_players_by_team[team].append(player) + active_teams = {} + players_without_team = [] + for team_id in grouped_players_by_team: + if team_id == 0: + players_without_team += [ + player for player in grouped_players_by_team[team_id] + ] 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) + if len(grouped_players_by_team[team_id]) >= 4: + active_teams[team_id] = grouped_players_by_team[team_id] + else: + players_without_team += [ + player for player in grouped_players_by_team[team_id] + ] + return active_teams, players_without_team + + +def split_courts(courts: dict, n) -> Tuple[dict, dict]: + first_half = {k: v for (k, v) in [x for x in courts.items()][:n]} + second_half = {k: v for (k, v) in [x for x in courts.items()][n:]} + return first_half, second_half -- cgit v1.3.1