From a6ca96d2e97db41b2f3ca11377b312ba65014dff Mon Sep 17 00:00:00 2001 From: Razmig Sarkissian Date: Tue, 19 Aug 2025 17:20:23 +0200 Subject: [PATCH] Add season year parameter for 2026 tournament rules --- tournaments/models/enums.py | 35 +++++++++++++++++-- tournaments/models/tournament.py | 22 ++++++++---- .../services/tournament_registration.py | 2 +- 3 files changed, 50 insertions(+), 9 deletions(-) diff --git a/tournaments/models/enums.py b/tournaments/models/enums.py index 6e67f8a..84950a1 100644 --- a/tournaments/models/enums.py +++ b/tournaments/models/enums.py @@ -13,9 +13,36 @@ class FederalCategory(models.IntegerChoices): UNLISTED = 3, '' @staticmethod - def female_in_male_assimilation_addition(rank: int) -> int: + def female_in_male_assimilation_addition(rank: int, season_year: None) -> int: if rank is None: return 0 + + if season_year == 2026: + if 1 <= rank <= 10: + return 400 + elif 11 <= rank <= 30: + return 1000 + elif 31 <= rank <= 60: + return 2000 + elif 61 <= rank <= 100: + return 3500 + elif 101 <= rank <= 200: + return 10000 + elif 201 <= rank <= 500: + return 15000 + elif 501 <= rank <= 1000: + return 25000 + elif 1001 <= rank <= 2000: + return 35000 + elif 2001 <= rank <= 3000: + return 45000 + elif 3001 <= rank <= 5000: + return 55000 + elif 5001 <= rank <= 10000: + return 70000 + else: + return 90000 + if 1 <= rank <= 10: return 400 elif 11 <= rank <= 30: @@ -88,7 +115,10 @@ class FederalLevelCategory(models.IntegerChoices): return "le " @staticmethod - def min_player_rank(level=None, category=None, age_category=None) -> int: + def min_player_rank(level=None, category=None, age_category=None, season_year=None) -> int: + if season_year == 2026 and category == FederalCategory.MIXED: + return 0 + if level == FederalLevelCategory.P25: if age_category in [FederalAgeCategory.SENIOR, FederalAgeCategory.A45, FederalAgeCategory.A55]: return 20000 if category == FederalCategory.MEN else 1000 @@ -111,6 +141,7 @@ class FederalLevelCategory(models.IntegerChoices): class FederalAgeCategory(models.IntegerChoices): UNLISTED = 0, '' + A09_10 = 100, 'U10' A11_12 = 120, 'U12' A13_14 = 140, 'U14' A15_16 = 160, 'U16' diff --git a/tournaments/models/tournament.py b/tournaments/models/tournament.py index 4a98cc5..b2aa542 100644 --- a/tournaments/models/tournament.py +++ b/tournaments/models/tournament.py @@ -1420,17 +1420,20 @@ class Tournament(BaseModel): if birth_year is None: return reasons if reasons else None - tournament_start_year = self.start_date.year - if self.start_date.month >= 9: # Check if tournament start month is September or later - tournament_start_year += 1 - + tournament_start_year = self.season_year() user_age = tournament_start_year - int(birth_year) # Check age category restrictions + if self.federal_age_category == FederalAgeCategory.A09_10 and user_age > 10: + reasons.append("Ce tournoi est réservé aux 10 ans et moins") if self.federal_age_category == FederalAgeCategory.A11_12 and user_age > 12: reasons.append("Ce tournoi est réservé aux 12 ans et moins") if self.federal_age_category == FederalAgeCategory.A13_14 and user_age > 14: reasons.append("Ce tournoi est réservé aux 14 ans et moins") + if self.federal_age_category == FederalAgeCategory.A15_16 and user_age < 11: + reasons.append("Ce tournoi est réservé aux 11 ans et plus") + if self.federal_age_category == FederalAgeCategory.A17_18 and user_age < 11: + reasons.append("Ce tournoi est réservé aux 11 ans et plus") if self.federal_age_category == FederalAgeCategory.A15_16 and user_age > 16: reasons.append("Ce tournoi est réservé aux 16 ans et moins") if self.federal_age_category == FederalAgeCategory.A17_18 and user_age > 18: @@ -1445,7 +1448,7 @@ class Tournament(BaseModel): addon = 0 computedRank = int(data.get("rank", 0)) if is_woman and self.federal_category == FederalCategory.MEN: - addon = FederalCategory.female_in_male_assimilation_addition(computedRank) + addon = FederalCategory.female_in_male_assimilation_addition(computedRank, tournament_start_year) computedRank = computedRank + addon if computedRank <= self.min_player_rank(): @@ -1455,7 +1458,14 @@ class Tournament(BaseModel): return reasons if reasons else None def min_player_rank(self): - return FederalLevelCategory.min_player_rank(self.federal_level_category, self.federal_category, self.federal_age_category) + return FederalLevelCategory.min_player_rank(self.federal_level_category, self.federal_category, self.federal_age_category, self.season_year()) + + def season_year(self): + local_date = self.local_start_date() + if local_date.month >= 9: # September or later + return local_date.year + 1 + else: + return local_date.year def local_registration_federal_limit(self): timezone = self.timezone() diff --git a/tournaments/services/tournament_registration.py b/tournaments/services/tournament_registration.py index 21fe47b..c46da48 100644 --- a/tournaments/services/tournament_registration.py +++ b/tournaments/services/tournament_registration.py @@ -563,7 +563,7 @@ class RegistrationCartManager: # Apply assimilation for women playing in men's tournaments if is_woman and tournament.federal_category == FederalCategory.MEN and rank_int is not None: - assimilation_addition = FederalCategory.female_in_male_assimilation_addition(rank_int) + assimilation_addition = FederalCategory.female_in_male_assimilation_addition(rank_int, tournament.season_year()) computed_rank = computed_rank + assimilation_addition print(f"_compute_rank_and_sex: {player_data.get('last_name')}, {sex}, {rank}, {computed_rank}")