diff options
Diffstat (limited to 'src/match_up/controller.py')
| -rw-r--r-- | src/match_up/controller.py | 58 |
1 files changed, 42 insertions, 16 deletions
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]: |
