aboutsummaryrefslogtreecommitdiff
path: root/src/match_up/controller.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/match_up/controller.py')
-rw-r--r--src/match_up/controller.py58
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]: