|
|
|
|
@ -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, |
|
|
|
|
} |
|
|
|
|
|