From 194a7c8ba33c26e277866970447f062d7784a938 Mon Sep 17 00:00:00 2001 From: Raz Date: Mon, 10 Mar 2025 10:41:45 +0100 Subject: [PATCH] fix pbl stuff --- tournaments/models/group_stage.py | 2 +- tournaments/models/match.py | 36 ++++++++----- tournaments/models/team_registration.py | 12 ++--- tournaments/models/tournament.py | 17 +++++- .../static/tournaments/css/broadcast.css | 54 +++++++++++++++++++ tournaments/static/tournaments/css/style.css | 37 ++++++++++--- .../broadcast/broadcasted_group_stage.html | 17 +++--- .../broadcast/broadcasted_match.html | 10 +++- .../tournaments/group_stage_cell.html | 8 ++- .../templates/tournaments/match_cell.html | 8 +-- 10 files changed, 151 insertions(+), 50 deletions(-) diff --git a/tournaments/models/group_stage.py b/tournaments/models/group_stage.py index b1a6488..11a4b81 100644 --- a/tournaments/models/group_stage.py +++ b/tournaments/models/group_stage.py @@ -135,7 +135,7 @@ class GroupStage(models.Model): def has_at_least_one_started_match(self): for match in self.match_set.all(): - if match.start_date is not None and match.start_date <= timezone.now(): + if match.start_date is not None and match.start_date <= timezone.now() and match.confirmed is True: return True return False diff --git a/tournaments/models/match.py b/tournaments/models/match.py index baca94b..e69aa67 100644 --- a/tournaments/models/match.py +++ b/tournaments/models/match.py @@ -180,37 +180,45 @@ class Match(models.Model): if len(team_scores) == 0: if (self.round and self.round.parent is None and self.round.tournament.round_set.filter(parent__isnull=True, group_stage_loser_bracket=False).count() - 1 == self.round.index): - names = ["Qualifié", ''] + names = ["Qualifié"] team = self.default_live_team(names) teams.append(team) - names = ["Qualifié", ''] + names = ["Qualifié"] team = self.default_live_team(names) teams.append(team) return teams if (self.group_stage): - names = ["Équipe de poule", ''] + names = ["Équipe de poule"] team = self.default_live_team(names) teams.append(team) - names = ["Équipe de poule", ''] + names = ["Équipe de poule"] team = self.default_live_team(names) teams.append(team) return teams elif self.round and self.round.parent: if loser_top_match: - names = [f"Perdant {loser_top_match.computed_name()}", ''] + names = [f"Perdant {loser_top_match.computed_name()}"] team = self.default_live_team(names) teams.append(team) if loser_bottom_match: - names = [f"Perdant {loser_bottom_match.computed_name()}", ''] + names = [f"Perdant {loser_bottom_match.computed_name()}"] + team = self.default_live_team(names) + teams.append(team) + if previous_top_match: + names = [f"Gagnant {previous_top_match.computed_name()}"] + team = self.default_live_team(names) + teams.append(team) + if previous_bottom_match: + names = [f"Gagnant {previous_bottom_match.computed_name()}"] team = self.default_live_team(names) teams.append(team) elif self.round and self.round.parent is None: if previous_top_match: - names = [f"Gagnant {previous_top_match.computed_name()}", ''] + names = [f"Gagnant {previous_top_match.computed_name()}"] team = self.default_live_team(names) teams.append(team) if previous_bottom_match: - names = [f"Gagnant {previous_bottom_match.computed_name()}", ''] + names = [f"Gagnant {previous_bottom_match.computed_name()}"] team = self.default_live_team(names) teams.append(team) elif len(team_scores) == 1: @@ -218,33 +226,33 @@ class Match(models.Model): existing_team = team_scores[0].live_team(self) if (self.group_stage): teams.append(existing_team) - names = ["Équipe de poule", ''] + names = ["Équipe de poule"] team = self.default_live_team(names) teams.append(team) elif self.round: if loser_top_match and loser_top_match.disabled == False and loser_top_match.end_date is None: - names = [f"Perdant {loser_top_match.computed_name()}", ''] + names = [f"Perdant {loser_top_match.computed_name()}"] team = self.default_live_team(names) teams.append(team) teams.append(existing_team) elif loser_bottom_match: - names = [f"Perdant {loser_bottom_match.computed_name()}", ''] + names = [f"Perdant {loser_bottom_match.computed_name()}"] team = self.default_live_team(names) teams.append(existing_team) teams.append(team) elif previous_top_match and previous_top_match.disabled == False and previous_top_match.end_date is None: - names = [f"Gagnant {previous_top_match.computed_name()}", ''] + names = [f"Gagnant {previous_top_match.computed_name()}"] team = self.default_live_team(names) teams.append(team) teams.append(existing_team) elif previous_bottom_match: - names = [f"Gagnant {previous_bottom_match.computed_name()}", ''] + names = [f"Gagnant {previous_bottom_match.computed_name()}"] team = self.default_live_team(names) teams.append(existing_team) teams.append(team) elif (self.round.parent is None and self.round.tournament.round_set.filter(parent__isnull=True, group_stage_loser_bracket=False).count() - 1 == self.round.index): match_index_within_round = self.index - (int(2 ** self.round.index) - 1) - names = ["Qualifié", ''] + names = ["Qualifié"] team = self.default_live_team(names) if match_index_within_round < int(2 ** self.round.index) / 2: teams.append(existing_team) diff --git a/tournaments/models/team_registration.py b/tournaments/models/team_registration.py index 3adf067..6fcca5b 100644 --- a/tournaments/models/team_registration.py +++ b/tournaments/models/team_registration.py @@ -40,27 +40,27 @@ class TeamRegistration(models.Model): def player_names_as_list(self): players = list(self.playerregistration_set.all()) if len(players) == 0: - return ['', ''] + return [] elif len(players) == 1: - return [players[0].name(), ''] + return [players[0].name()] else: return [pr.name() for pr in players] def team_names(self): if self.name: - return [self.name, ''] #add an empty line if it's a team name + return [self.name] #add an empty line if it's a team name else: return self.player_names_as_list() def shortened_team_names(self): if self.name: - return [self.name, ''] #add an empty line if it's a team name + return [self.name] #add an empty line if it's a team name else: players = list(self.playerregistration_set.all()) if len(players) == 0: - return ['', ''] + return [] elif len(players) == 1: - return [players[0].shortened_name(), ''] + return [players[0].shortened_name()] else: return [pr.shortened_name() for pr in players] diff --git a/tournaments/models/tournament.py b/tournaments/models/tournament.py index 28ee3b8..25e4805 100644 --- a/tournaments/models/tournament.py +++ b/tournaments/models/tournament.py @@ -678,6 +678,12 @@ class Tournament(models.Model): if previous_round: # print('previous_round') matches.extend(previous_round.get_matches_recursive(True)) + + previous_previous_round = self.round_for_index(current_round.index + 2) + if previous_previous_round: + previous_previous_matches = previous_previous_round.get_matches_recursive(True) + previous_previous_matches = [m for m in previous_previous_matches if m.end_date is None] + matches.extend(previous_previous_matches) else: # print('group_stages') group_stages = [gs.live_group_stages() for gs in self.last_group_stage_step()] @@ -786,7 +792,16 @@ class Tournament(models.Model): group_stages.sort(key=lambda gs: (gs.index, gs.start_date is None, gs.start_date)) for group_stage in group_stages: matches.extend(group_stage.match_set.all()) - matches = [m for m in matches if m.should_appear()] + + if len(matches) > 16: + # if more than 16 groupstage matches + now = timezone.now() + future_threshold = now + timedelta(hours=1) + past_threshold = now - timedelta(hours=1) + matches = [m for m in matches if m.should_appear() and + (m.start_date is None or m.start_date <= future_threshold) and # Not starting in more than 1h + (m.end_date is None or m.end_date >= past_threshold)] # Not finished for more than 1h + matches = matches[:16] matches.sort(key=lambda m: (m.start_date is None, m.end_date is not None, m.start_date, m.index)) group_stage_loser_bracket = list(self.round_set.filter(parent=None, group_stage_loser_bracket=True).all()) diff --git a/tournaments/static/tournaments/css/broadcast.css b/tournaments/static/tournaments/css/broadcast.css index ffd1f78..5171712 100644 --- a/tournaments/static/tournaments/css/broadcast.css +++ b/tournaments/static/tournaments/css/broadcast.css @@ -25,3 +25,57 @@ body { .bold { font-family: "Montserrat-Bold"; } + +.player { + position: relative; + flex: 1; + display: flex; + flex-direction: column; + min-height: 2.8em; /* This ensures minimum height for 2 lines */ + justify-content: center; + overflow: hidden; +} + +/* Add this if you want empty lines to take up space */ +.player div { + min-height: 1.4em; /* Height for single line */ +} + +/* For single player teams */ +.player.single-player .bold { + max-height: 2.8em; /* Adjust based on your needs */ + line-height: 1.4em; + overflow: hidden; + position: relative; + text-overflow: ellipsis; +} + +/* For two player teams */ +.player.two-players .bold { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.flex { + display: flex; + align-items: center; +} + +.flex-left { + flex: 1; + text-align: left; + justify-content: center; + min-height: 4em; + padding-right: 5px; +} + +.flex-right { + flex: initial; + text-align: right; + justify-content: center; +} + +.center { + align-items: center; +} diff --git a/tournaments/static/tournaments/css/style.css b/tournaments/static/tournaments/css/style.css index 035357a..80bcd9c 100644 --- a/tournaments/static/tournaments/css/style.css +++ b/tournaments/static/tournaments/css/style.css @@ -323,9 +323,34 @@ tr { } .player { + position: relative; flex: 1; display: flex; flex-direction: column; + min-height: 2.8em; /* This ensures minimum height for 2 lines */ + justify-content: center; + overflow: hidden; +} + +/* Add this if you want empty lines to take up space */ +.player div { + min-height: 1.4em; /* Height for single line */ +} + +/* For single player teams */ +.player.single-player .semibold { + max-height: 2.8em; /* Adjust based on your needs */ + line-height: 1.4em; + overflow: hidden; + position: relative; + text-overflow: ellipsis; +} + +/* For two player teams */ +.player.two-players .semibold { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; } .scores { @@ -344,7 +369,6 @@ tr { font-size: 1.3em; vertical-align: middle; text-align: center; - padding: 0px 5px; /* width: 30px; */ } @@ -718,14 +742,15 @@ h-margin { .flex-left { flex: 1; text-align: left; - padding: 5px 0px; + justify-content: center; + min-height: 4em; + padding-right: 5px; } .flex-right { flex: initial; text-align: right; - vertical-align: middle; - padding: 5px 0px; + justify-content: center; } #header { @@ -838,10 +863,6 @@ h-margin { background-color: #90ee90; /* Light green color */ } -.player { - position: relative; /* Ensures the overlay is positioned within this block */ -} - .overlay-text { position: absolute; top: 50%; diff --git a/tournaments/templates/tournaments/broadcast/broadcasted_group_stage.html b/tournaments/templates/tournaments/broadcast/broadcasted_group_stage.html index 48d7c68..0d35253 100644 --- a/tournaments/templates/tournaments/broadcast/broadcasted_group_stage.html +++ b/tournaments/templates/tournaments/broadcast/broadcasted_group_stage.html @@ -8,7 +8,10 @@
-
+