From d9a5358080a24f88645c72995fb714ab3ee8f8ed Mon Sep 17 00:00:00 2001 From: Razmig Sarkissian Date: Thu, 16 May 2024 22:34:16 +0200 Subject: [PATCH] fix issue on new page team --- .../0050_alter_tournament_team_sorting.py | 18 +++ tournaments/models/__init__.py | 2 +- tournaments/models/group_stage.py | 2 +- tournaments/models/team_registration.py | 19 +--- tournaments/models/tournament.py | 104 ++++++++++++++++-- 5 files changed, 121 insertions(+), 24 deletions(-) create mode 100644 tournaments/migrations/0050_alter_tournament_team_sorting.py diff --git a/tournaments/migrations/0050_alter_tournament_team_sorting.py b/tournaments/migrations/0050_alter_tournament_team_sorting.py new file mode 100644 index 0000000..307dc65 --- /dev/null +++ b/tournaments/migrations/0050_alter_tournament_team_sorting.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.11 on 2024-05-16 17:20 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('tournaments', '0049_purchase_revocation_date'), + ] + + operations = [ + migrations.AlterField( + model_name='tournament', + name='team_sorting', + field=models.IntegerField(choices=[(1, 'Rank'), (2, 'Inscription Date')], default=2), + ), + ] diff --git a/tournaments/models/__init__.py b/tournaments/models/__init__.py index e5188cc..299dcde 100644 --- a/tournaments/models/__init__.py +++ b/tournaments/models/__init__.py @@ -5,7 +5,7 @@ from .date_interval import DateInterval from .enums import TournamentPayment, FederalCategory, FederalLevelCategory, FederalAgeCategory, FederalMatchCategory from .player_enums import PlayerSexType, PlayerDataSource, PlayerPaymentType from .event import Event -from .tournament import Tournament, TeamSummon +from .tournament import Tournament, TeamSummon, TeamSortingType, TeamList, TeamListDisplay from .group_stage import GroupStage from .round import Round from .match import Match, LiveMatch diff --git a/tournaments/models/group_stage.py b/tournaments/models/group_stage.py index d335dff..9880ec5 100644 --- a/tournaments/models/group_stage.py +++ b/tournaments/models/group_stage.py @@ -21,7 +21,7 @@ class GroupStage(models.Model): if self.name: return self.name else: - return f"Poule {self.index}" + return f"Poule {self.index + 1}" def next_match(self, player_registration): matches = self.matches_for_registration(player_registration).filter(end_date__isnull=False).order_by('start_date') diff --git a/tournaments/models/team_registration.py b/tournaments/models/team_registration.py index 5e5504f..0f0de87 100644 --- a/tournaments/models/team_registration.py +++ b/tournaments/models/team_registration.py @@ -70,21 +70,12 @@ class TeamRegistration(models.Model): return self.group_stage.name() else: return "--" - for player in top_two_players: - rank = player.rank if player.rank is not None else 0 - weight += rank - return weight def is_valid_for_summon(self): return len(self.playerregistration_set.all()) > 0 - def is_valid_for_display(self): - return len(self.playerregistration_set.all()) > 0 and self.walk_out is False - - def base_start_stage(self): - if self.group_stage_position is not None: - return "Poule" - if self.bracket_position is not None: - return "Tableau" - - return "Attente" + def initial_weight(self): + if self.locked_weight is None: + return self.weight + else: + return self.locked_weight diff --git a/tournaments/models/tournament.py b/tournaments/models/tournament.py index ec5c00c..66d7673 100644 --- a/tournaments/models/tournament.py +++ b/tournaments/models/tournament.py @@ -1,9 +1,18 @@ from django.db import models +from typing import TYPE_CHECKING +if TYPE_CHECKING: + from tournaments.models import group_stage + from . import Event, TournamentPayment, FederalMatchCategory, FederalCategory, FederalLevelCategory, FederalAgeCategory import uuid from django.utils import timezone, formats from datetime import datetime + +class TeamSortingType(models.IntegerChoices): + RANK = 1, 'Rank' + INSCRIPTION_DATE = 2, 'Inscription Date' + class Tournament(models.Model): id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=True) event = models.ForeignKey(Event, blank=True, null=True, on_delete=models.CASCADE) @@ -21,7 +30,7 @@ class Tournament(models.Model): rank_source_date = models.DateTimeField(null=True, blank=True) day_duration = models.IntegerField(default=0) team_count = models.IntegerField(default=0) - team_sorting = models.IntegerField(default=0) + team_sorting = models.IntegerField(default=TeamSortingType.INSCRIPTION_DATE, choices=TeamSortingType.choices) federal_category = models.IntegerField(default=FederalCategory.MEN, choices=FederalCategory.choices) # optional ? federal_level_category = models.IntegerField(default=FederalLevelCategory.P100, choices=FederalLevelCategory.choices) federal_age_category = models.IntegerField(default=FederalAgeCategory.SENIOR, choices=FederalAgeCategory.choices) @@ -83,17 +92,75 @@ class Tournament(models.Model): return summons def teams(self): + bracket_teams = [] + group_stage_teams = [] + waiting_teams = [] teams = [] + wildcard_bracket = [] + wildcard_group_stage = [] + complete_teams = [] for team_registration in self.teamregistration_set.all(): - if team_registration.is_valid_for_display(): + if team_registration.walk_out is False: names = team_registration.team_names() weight = team_registration.weight - stage = team_registration.base_start_stage() - team = Team(names, weight, stage, team_registration.logo) + initial_weight = team_registration.initial_weight() + date = team_registration.registration_date + team = TeamList(names, weight, date, initial_weight, team_registration.logo) teams.append(team) + if team_registration.wild_card_bracket: + wildcard_bracket.append(team) + elif team_registration.wild_card_group_stage: + wildcard_group_stage.append(team) + else: + complete_teams.append(team) + + seeds_count = min(self.team_count, len(teams)) - self.group_stage_count * self.teams_per_group_stage - len(wildcard_bracket) + group_stage_members_count = self.group_stage_count * self.teams_per_group_stage - len(wildcard_group_stage) + if group_stage_members_count < 0: + group_stage_members_count = 0 + if seeds_count < 0: + seeds_count = 0 + + if self.team_sorting == TeamSortingType.INSCRIPTION_DATE: + complete_teams.sort(key=lambda s: (s.date, s.initial_weight)) + else: + complete_teams.sort(key=lambda s: (s.initial_weight, s.date)) - teams.sort(key=lambda s: s.weight) - return teams + selected_teams = complete_teams[:self.team_count] + selected_teams.sort(key=lambda s: s.initial_weight) + bracket_teams = selected_teams[:seeds_count] + wildcard_bracket + group_stage_teams = selected_teams[-group_stage_members_count:] + wildcard_group_stage + + waiting_list_count = len(complete_teams) - self.team_count + if waiting_list_count < 0: + waiting_list_count = 0 + + waiting_teams = complete_teams[-waiting_list_count:] + if self.team_sorting == TeamSortingType.INSCRIPTION_DATE: + waiting_teams.sort(key=lambda s: (s.date, s.initial_weight)) + else: + waiting_teams.sort(key=lambda s: (s.initial_weight, s.date)) + + bracket_teams.sort(key=lambda s: s.weight) + group_stage_teams.sort(key=lambda s: s.weight) + + final_bracket_teams = [] + for team in bracket_teams: + display_team = TeamListDisplay(team.names, team.weight, team.date, team.initial_weight, "Tableau", team.image) + final_bracket_teams.append(display_team) + + final_group_stage_teams = [] + for team in group_stage_teams: + display_team = TeamListDisplay(team.names, team.weight, team.date, team.initial_weight, "Poule", team.image) + final_group_stage_teams.append(display_team) + + final_waiting_teams = [] + for team in waiting_teams: + display_team = TeamListDisplay(team.names, team.weight, team.date, team.initial_weight, "Attente", team.image) + final_waiting_teams.append(display_team) + + final_teams = final_bracket_teams + final_group_stage_teams + final_waiting_teams + return final_teams def match_groups(self, broadcasted, group_stage_id, round_id): @@ -391,17 +458,38 @@ class TeamSummon: "image": self.image, } -class Team: - def __init__(self, names, weight, stage, image): +class TeamList: + def __init__(self, names, weight, date, initial_weight, image): self.names = names + self.date = date + self.weight = weight + self.initial_weight = initial_weight + self.image = image + + def to_dict(self): + return { + "names": self.names, + "date": self.date, + "weight": self.weight, + "initial_weight": self.initial_weight, + "image": self.image, + } + +class TeamListDisplay: + def __init__(self, names, weight, date, initial_weight, stage, image): + self.names = names + self.date = date self.weight = weight + self.initial_weight = initial_weight self.stage = stage self.image = image def to_dict(self): return { "names": self.names, + "date": self.date, "weight": self.weight, + "initial_weight": self.initial_weight, "stage": self.stage, "image": self.image, }