diff --git a/tournaments/migrations/0052_teamregistration_final_ranking_and_more.py b/tournaments/migrations/0052_teamregistration_final_ranking_and_more.py new file mode 100644 index 0000000..fe5c680 --- /dev/null +++ b/tournaments/migrations/0052_teamregistration_final_ranking_and_more.py @@ -0,0 +1,23 @@ +# Generated by Django 4.2.11 on 2024-05-21 16:10 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('tournaments', '0051_club_court_count_alter_tournament_court_count'), + ] + + operations = [ + migrations.AddField( + model_name='teamregistration', + name='final_ranking', + field=models.IntegerField(blank=True, null=True), + ), + migrations.AddField( + model_name='teamregistration', + name='points_earned', + field=models.IntegerField(blank=True, null=True), + ), + ] diff --git a/tournaments/models/__init__.py b/tournaments/models/__init__.py index 299dcde..5a67590 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, TeamSortingType, TeamList, TeamListDisplay +from .tournament import Tournament, TeamSummon, TeamSortingType, TeamList from .group_stage import GroupStage from .round import Round from .match import Match, LiveMatch diff --git a/tournaments/models/match.py b/tournaments/models/match.py index e1bfe8e..8433a17 100644 --- a/tournaments/models/match.py +++ b/tournaments/models/match.py @@ -90,6 +90,8 @@ class Match(models.Model): def started(self): if self.start_date: return timezone.now() > self.start_date + elif self.end_date: + return True else: return False diff --git a/tournaments/models/team_registration.py b/tournaments/models/team_registration.py index 0f0de87..9410361 100644 --- a/tournaments/models/team_registration.py +++ b/tournaments/models/team_registration.py @@ -27,6 +27,10 @@ class TeamRegistration(models.Model): confirmation_date = models.DateTimeField(null=True, blank=True) qualified = models.BooleanField(default=False) + final_ranking = models.IntegerField(null=True, blank=True) + points_earned = models.IntegerField(null=True, blank=True) + + def __str__(self): if self.name: return f"{self.name}: {self.player_names()}" diff --git a/tournaments/models/tournament.py b/tournaments/models/tournament.py index 3b43029..a24d05c 100644 --- a/tournaments/models/tournament.py +++ b/tournaments/models/tournament.py @@ -91,6 +91,19 @@ class Tournament(models.Model): summons.sort(key=lambda s: s.weight) return summons + def rankings(self): + rankings = [] + for team_registration in self.teamregistration_set.all(): + if team_registration.walk_out is False and team_registration.final_ranking is not None: + names = team_registration.team_names() + ranking = team_registration.final_ranking + points = team_registration.points_earned + team = TeamRanking(names, ranking, points, team_registration.logo) + rankings.append(team) + + rankings.sort(key=lambda s: s.ranking) + return rankings + def teams(self): bracket_teams = [] group_stage_teams = [] @@ -144,22 +157,16 @@ class Tournament(models.Model): 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) + team.set_stage("Tableau") - 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) + team.set_stage("Poule") - 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) + team.set_stage("Liste d'attente") - final_teams = final_bracket_teams + final_group_stage_teams + final_waiting_teams + final_teams = bracket_teams + group_stage_teams + waiting_teams return final_teams def match_groups(self, broadcasted, group_stage_id, round_id): @@ -342,6 +349,12 @@ class Tournament(models.Model): matches.sort(key=lambda m: m.start_date, reverse=True) return matches + def display_rankings(self): + return True + # if self.end_date is not None: + # return True + # return False + def display_teams(self): if self.end_date is not None: return True @@ -469,6 +482,10 @@ class TeamList: self.weight = weight self.initial_weight = initial_weight self.image = image + self.stage = "" + + def set_stage(self, stage): + self.stage = stage def to_dict(self): return { @@ -477,23 +494,28 @@ class TeamList: "weight": self.weight, "initial_weight": self.initial_weight, "image": self.image, + "stage": self.stage, } -class TeamListDisplay: - def __init__(self, names, weight, date, initial_weight, stage, image): +class TeamRanking: + def __init__(self, names, ranking, points, image): self.names = names - self.date = date - self.weight = weight - self.initial_weight = initial_weight - self.stage = stage + self.ranking = ranking + self.points = points self.image = image + def ranking_display(self): + return f"{self.ranking + 1}" + + def points_earned_display(self): + if self.points is None: + return "" + return f"+{self.points} pts" + def to_dict(self): return { "names": self.names, - "date": self.date, - "weight": self.weight, - "initial_weight": self.initial_weight, - "stage": self.stage, + "ranking": self.ranking_display(), + "points": self.points_earned_display(), "image": self.image, } diff --git a/tournaments/templates/tournaments/navigation_tournament.html b/tournaments/templates/tournaments/navigation_tournament.html index f637f3b..1d0735d 100644 --- a/tournaments/templates/tournaments/navigation_tournament.html +++ b/tournaments/templates/tournaments/navigation_tournament.html @@ -15,4 +15,8 @@ Équipes {% endif %} + {% if tournament.display_rankings %} + Classement + {% endif %} + diff --git a/tournaments/templates/tournaments/ranking_row.html b/tournaments/templates/tournaments/ranking_row.html new file mode 100644 index 0000000..07ff653 --- /dev/null +++ b/tournaments/templates/tournaments/ranking_row.html @@ -0,0 +1,13 @@ +{% load static %} + +
+ +
+ {% for name in ranking.names %} +
{{ name }}
+ {% endfor %} +
+ +
{{ ranking.ranking }}
+
{{ ranking.points }}
+
diff --git a/tournaments/templates/tournaments/rankings.html b/tournaments/templates/tournaments/rankings.html new file mode 100644 index 0000000..cde72d3 --- /dev/null +++ b/tournaments/templates/tournaments/rankings.html @@ -0,0 +1,35 @@ +{% extends 'tournaments/base.html' %} + +{% block head_title %}Classement{% endblock %} +{% block first_title %}{{ tournament.display_name }}{% endblock %} +{% block second_title %}Classement{% endblock %} + +{% if tournament.display_rankings %} + +{% block content %} + +{% load static %} + + {% include 'tournaments/navigation_tournament.html' %} + + {% if rankings %} + +
+ +
+
+ {% for ranking in rankings %} + + {% include 'tournaments/ranking_row.html' %} + + {% endfor %} + +
+
+ +
+ + {% endif %} + +{% endblock %} +{% endif %} diff --git a/tournaments/urls.py b/tournaments/urls.py index c356146..d507ab3 100644 --- a/tournaments/urls.py +++ b/tournaments/urls.py @@ -10,6 +10,7 @@ urlpatterns = [ include([ path('', views.tournament, name='tournament'), path('teams/', views.tournament_teams, name='tournament-teams'), + path('rankings/', views.tournament_rankings, name='tournament-rankings'), path('summons/', views.tournament_summons, name='tournament-summons'), path('broadcast/summons/', views.tournament_broadcasted_summons, name='broadcasted-summons'), path('summons/json/', views.tournament_summons_json, name='tournament-summons-json'), diff --git a/tournaments/views.py b/tournaments/views.py index 2af29a7..3cd7939 100644 --- a/tournaments/views.py +++ b/tournaments/views.py @@ -97,6 +97,16 @@ def tournament(request, tournament_id): 'match_groups': match_groups, }) +def tournament_rankings(request, tournament_id): + + tournament = get_object_or_404(Tournament, pk=tournament_id) + rankings = tournament.rankings() + + return render(request, 'tournaments/rankings.html', { + 'tournament': tournament, + 'rankings': rankings, + }) + def tournament_teams(request, tournament_id): tournament = get_object_or_404(Tournament, pk=tournament_id)