fix issue on new page team

clubs
Razmig Sarkissian 2 years ago
parent 96362c2b5c
commit d9a5358080
  1. 18
      tournaments/migrations/0050_alter_tournament_team_sorting.py
  2. 2
      tournaments/models/__init__.py
  3. 2
      tournaments/models/group_stage.py
  4. 19
      tournaments/models/team_registration.py
  5. 104
      tournaments/models/tournament.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),
),
]

@ -5,7 +5,7 @@ from .date_interval import DateInterval
from .enums import TournamentPayment, FederalCategory, FederalLevelCategory, FederalAgeCategory, FederalMatchCategory from .enums import TournamentPayment, FederalCategory, FederalLevelCategory, FederalAgeCategory, FederalMatchCategory
from .player_enums import PlayerSexType, PlayerDataSource, PlayerPaymentType from .player_enums import PlayerSexType, PlayerDataSource, PlayerPaymentType
from .event import Event from .event import Event
from .tournament import Tournament, TeamSummon from .tournament import Tournament, TeamSummon, TeamSortingType, TeamList, TeamListDisplay
from .group_stage import GroupStage from .group_stage import GroupStage
from .round import Round from .round import Round
from .match import Match, LiveMatch from .match import Match, LiveMatch

@ -21,7 +21,7 @@ class GroupStage(models.Model):
if self.name: if self.name:
return self.name return self.name
else: else:
return f"Poule {self.index}" return f"Poule {self.index + 1}"
def next_match(self, player_registration): def next_match(self, player_registration):
matches = self.matches_for_registration(player_registration).filter(end_date__isnull=False).order_by('start_date') matches = self.matches_for_registration(player_registration).filter(end_date__isnull=False).order_by('start_date')

@ -70,21 +70,12 @@ class TeamRegistration(models.Model):
return self.group_stage.name() return self.group_stage.name()
else: else:
return "--" 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): def is_valid_for_summon(self):
return len(self.playerregistration_set.all()) > 0 return len(self.playerregistration_set.all()) > 0
def is_valid_for_display(self): def initial_weight(self):
return len(self.playerregistration_set.all()) > 0 and self.walk_out is False if self.locked_weight is None:
return self.weight
def base_start_stage(self): else:
if self.group_stage_position is not None: return self.locked_weight
return "Poule"
if self.bracket_position is not None:
return "Tableau"
return "Attente"

@ -1,9 +1,18 @@
from django.db import models 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 from . import Event, TournamentPayment, FederalMatchCategory, FederalCategory, FederalLevelCategory, FederalAgeCategory
import uuid import uuid
from django.utils import timezone, formats from django.utils import timezone, formats
from datetime import datetime from datetime import datetime
class TeamSortingType(models.IntegerChoices):
RANK = 1, 'Rank'
INSCRIPTION_DATE = 2, 'Inscription Date'
class Tournament(models.Model): class Tournament(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=True) id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=True)
event = models.ForeignKey(Event, blank=True, null=True, on_delete=models.CASCADE) 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) rank_source_date = models.DateTimeField(null=True, blank=True)
day_duration = models.IntegerField(default=0) day_duration = models.IntegerField(default=0)
team_count = 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_category = models.IntegerField(default=FederalCategory.MEN, choices=FederalCategory.choices) # optional ?
federal_level_category = models.IntegerField(default=FederalLevelCategory.P100, choices=FederalLevelCategory.choices) federal_level_category = models.IntegerField(default=FederalLevelCategory.P100, choices=FederalLevelCategory.choices)
federal_age_category = models.IntegerField(default=FederalAgeCategory.SENIOR, choices=FederalAgeCategory.choices) federal_age_category = models.IntegerField(default=FederalAgeCategory.SENIOR, choices=FederalAgeCategory.choices)
@ -83,17 +92,75 @@ class Tournament(models.Model):
return summons return summons
def teams(self): def teams(self):
bracket_teams = []
group_stage_teams = []
waiting_teams = []
teams = [] teams = []
wildcard_bracket = []
wildcard_group_stage = []
complete_teams = []
for team_registration in self.teamregistration_set.all(): 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() names = team_registration.team_names()
weight = team_registration.weight weight = team_registration.weight
stage = team_registration.base_start_stage() initial_weight = team_registration.initial_weight()
team = Team(names, weight, stage, team_registration.logo) date = team_registration.registration_date
team = TeamList(names, weight, date, initial_weight, team_registration.logo)
teams.append(team) 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) selected_teams = complete_teams[:self.team_count]
return teams 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): def match_groups(self, broadcasted, group_stage_id, round_id):
@ -391,17 +458,38 @@ class TeamSummon:
"image": self.image, "image": self.image,
} }
class Team: class TeamList:
def __init__(self, names, weight, stage, image): def __init__(self, names, weight, date, initial_weight, image):
self.names = names 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.weight = weight
self.initial_weight = initial_weight
self.stage = stage self.stage = stage
self.image = image self.image = image
def to_dict(self): def to_dict(self):
return { return {
"names": self.names, "names": self.names,
"date": self.date,
"weight": self.weight, "weight": self.weight,
"initial_weight": self.initial_weight,
"stage": self.stage, "stage": self.stage,
"image": self.image, "image": self.image,
} }

Loading…
Cancel
Save