You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
305 lines
12 KiB
305 lines
12 KiB
from django.db import models
|
|
|
|
class TournamentPayment(models.IntegerChoices):
|
|
FREE = 0, 'Gratuit'
|
|
UNIT = 1, 'Unité'
|
|
SUBSCRIPTION_UNIT = 2, 'Unité abonnement'
|
|
UNLIMITED = 3, 'Illimité'
|
|
|
|
class FederalCategory(models.IntegerChoices):
|
|
MEN = 0, 'Homme'
|
|
WOMEN = 1, 'Femme'
|
|
MIXED = 2, 'Mixte'
|
|
UNLISTED = 3, ''
|
|
|
|
@staticmethod
|
|
def female_in_male_assimilation_addition(rank: int) -> int:
|
|
if rank is None:
|
|
return 0
|
|
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
|
|
else:
|
|
return 50000
|
|
|
|
|
|
class FederalLevelCategory(models.IntegerChoices):
|
|
UNLISTED = 0, 'Animation'
|
|
P25 = 25, 'P25'
|
|
P100 = 100, 'P100'
|
|
P250 = 250, 'P250'
|
|
P500 = 500, 'P500'
|
|
P1000 = 1000, 'P1000'
|
|
P1500 = 1500, 'P1500'
|
|
P2000 = 2000, 'P2000'
|
|
CHPT = 1, 'Championnat'
|
|
|
|
def localized_word(self):
|
|
if self == FederalLevelCategory.UNLISTED:
|
|
return "animation"
|
|
elif self == FederalLevelCategory.CHPT:
|
|
return "championnat"
|
|
else:
|
|
return "tournoi"
|
|
|
|
def is_feminine_word(self):
|
|
if self == FederalLevelCategory.UNLISTED:
|
|
return True
|
|
else:
|
|
return False
|
|
|
|
def localized_prefix_at(self):
|
|
if self == FederalLevelCategory.UNLISTED:
|
|
return "à l'"
|
|
else:
|
|
return "au "
|
|
|
|
def localized_prefix_of(self):
|
|
if self == FederalLevelCategory.UNLISTED:
|
|
return "de l'"
|
|
else:
|
|
return "du "
|
|
|
|
def localized_prefix_this(self):
|
|
if self == FederalLevelCategory.UNLISTED:
|
|
return "cette"
|
|
else:
|
|
return "ce "
|
|
|
|
def localized_prefix_that(self):
|
|
if self == FederalLevelCategory.UNLISTED:
|
|
return "l'"
|
|
else:
|
|
return "le "
|
|
|
|
@staticmethod
|
|
def min_player_rank(level=None, category=None, age_category=None) -> int:
|
|
if level == FederalLevelCategory.P25:
|
|
if age_category in [FederalAgeCategory.SENIOR, FederalAgeCategory.A45, FederalAgeCategory.A55]:
|
|
return 20000 if category == FederalCategory.MEN else 1000
|
|
return 0
|
|
|
|
elif level == FederalLevelCategory.P100:
|
|
if age_category in [FederalAgeCategory.SENIOR, FederalAgeCategory.A45, FederalAgeCategory.A55]:
|
|
return 2000 if category == FederalCategory.MEN else 300
|
|
return 0
|
|
|
|
elif level == FederalLevelCategory.P250:
|
|
if age_category in [FederalAgeCategory.SENIOR, FederalAgeCategory.A45, FederalAgeCategory.A55]:
|
|
if category == FederalCategory.MIXED:
|
|
return 0
|
|
return 500 if category == FederalCategory.MEN else 100
|
|
return 0
|
|
|
|
return 0
|
|
|
|
|
|
class FederalAgeCategory(models.IntegerChoices):
|
|
UNLISTED = 0, ''
|
|
A11_12 = 120, 'U12'
|
|
A13_14 = 140, 'U14'
|
|
A15_16 = 160, 'U16'
|
|
A17_18 = 180, 'U18'
|
|
SENIOR = 200, 'Senior'
|
|
A45 = 450, '+45 ans'
|
|
A55 = 550, '+55 ans'
|
|
|
|
class FederalMatchCategory(models.IntegerChoices):
|
|
TWO_SETS = 0, 'Two sets'
|
|
TWO_SETS_SUPER_TIE = 1, 'Two sets super tie'
|
|
TWO_SETS_FOUR_GAME = 2, 'Two sets of four games'
|
|
NINE_GAMES = 3, 'Nine games'
|
|
SUPER_TIE = 4, 'Super Tie-Break'
|
|
MEGA_TIE = 5, 'Mega Tie-Break'
|
|
TWO_SETS_DECISIVE_POINT = 6, 'Two Sets with decisive point'
|
|
TWO_SETS_DECISIVE_POINT_SUPER_TIE = 7, 'Two Sets with decisive point and super tie-break'
|
|
TWO_SETS_FOUR_GAME_DECISIVE_POINT = 8, 'Two sets of four games with decisive point'
|
|
NINE_GAMES_DECISIVE_POINT = 9, 'Nine games with decisive point'
|
|
TWO_SETS_OF_SUPER_TIE = 10, 'Two sets of Super Tie-Break decisive point'
|
|
SINGLE_SET = 11, 'Single set'
|
|
SINGLE_SET_DECISIVE_POINT = 12, 'Single set with decisive point'
|
|
SINGLE_SET_OF_FOUR_GAMES = 13, 'Single set of four games'
|
|
SINGLE_SET_OF_FOUR_GAMES_DECISIVE_POINT = 14, 'Single set of four games with decisive point'
|
|
|
|
@property
|
|
def format_label_short(self):
|
|
format_mapping = {
|
|
self.TWO_SETS: "A1",
|
|
self.TWO_SETS_SUPER_TIE: "B1",
|
|
self.TWO_SETS_FOUR_GAME: "C1",
|
|
self.NINE_GAMES: "D1",
|
|
self.SUPER_TIE: "E",
|
|
self.TWO_SETS_OF_SUPER_TIE: "G",
|
|
self.MEGA_TIE: "F",
|
|
self.SINGLE_SET: "H1",
|
|
self.SINGLE_SET_DECISIVE_POINT: "H2",
|
|
self.TWO_SETS_DECISIVE_POINT: "A2",
|
|
self.TWO_SETS_DECISIVE_POINT_SUPER_TIE: "B2",
|
|
self.TWO_SETS_FOUR_GAME_DECISIVE_POINT: "C2",
|
|
self.NINE_GAMES_DECISIVE_POINT: "D2",
|
|
self.SINGLE_SET_OF_FOUR_GAMES: "I1"
|
|
}
|
|
return format_mapping.get(self, "")
|
|
|
|
def last_set_is_tie_break(value):
|
|
if value == FederalMatchCategory.TWO_SETS_FOUR_GAME or value == FederalMatchCategory.TWO_SETS_FOUR_GAME_DECISIVE_POINT or value == FederalMatchCategory.TWO_SETS_SUPER_TIE or value == FederalMatchCategory.SUPER_TIE or value == FederalMatchCategory.MEGA_TIE or value == FederalMatchCategory.TWO_SETS_DECISIVE_POINT_SUPER_TIE:
|
|
return True
|
|
else:
|
|
return False
|
|
|
|
def max_number_of_sets(value):
|
|
if value == FederalMatchCategory.SUPER_TIE or value == FederalMatchCategory.MEGA_TIE or value == FederalMatchCategory.NINE_GAMES or value == FederalMatchCategory.NINE_GAMES_DECISIVE_POINT or value == FederalMatchCategory.SINGLE_SET or value == FederalMatchCategory.SINGLE_SET_DECISIVE_POINT or value == FederalMatchCategory.SINGLE_SET_OF_FOUR_GAMES or value == FederalMatchCategory.SINGLE_SET_OF_FOUR_GAMES_DECISIVE_POINT:
|
|
return 1
|
|
else:
|
|
return 3
|
|
|
|
class ModelOperation(models.TextChoices):
|
|
POST = 'POST', 'POST'
|
|
PUT = 'PUT', 'PUT'
|
|
DELETE = 'DELETE', 'DELETE'
|
|
GRANT_ACCESS = 'GRANT_ACCESS', 'GRANT_ACCESS'
|
|
REVOKE_ACCESS = 'REVOKE_ACCESS', 'REVOKE_ACCESS'
|
|
|
|
class OnlineRegistrationStatus(models.IntegerChoices):
|
|
OPEN = 1, 'Open'
|
|
NOT_ENABLED = 2, 'Not Enabled'
|
|
NOT_STARTED = 3, 'Not Started'
|
|
ENDED = 4, 'Ended'
|
|
WAITING_LIST_POSSIBLE = 5, 'Waiting List Possible'
|
|
WAITING_LIST_FULL = 6, 'Waiting List Full'
|
|
IN_PROGRESS = 7, 'In Progress'
|
|
ENDED_WITH_RESULTS = 8, 'Ended with Results'
|
|
CANCELED = 9, 'Canceled'
|
|
|
|
def display_register_option(self) -> bool:
|
|
status_map = {
|
|
OnlineRegistrationStatus.OPEN: True,
|
|
OnlineRegistrationStatus.NOT_ENABLED: False,
|
|
OnlineRegistrationStatus.NOT_STARTED: False,
|
|
OnlineRegistrationStatus.ENDED: False,
|
|
OnlineRegistrationStatus.WAITING_LIST_POSSIBLE: True,
|
|
OnlineRegistrationStatus.WAITING_LIST_FULL: False,
|
|
OnlineRegistrationStatus.IN_PROGRESS: False,
|
|
OnlineRegistrationStatus.ENDED_WITH_RESULTS: False,
|
|
OnlineRegistrationStatus.CANCELED: False
|
|
}
|
|
return status_map.get(self, False)
|
|
|
|
def register_button_text(self) -> str:
|
|
if self == OnlineRegistrationStatus.OPEN:
|
|
return "S'inscrire"
|
|
elif self == OnlineRegistrationStatus.NOT_ENABLED:
|
|
return "Inscription désactivée"
|
|
elif self == OnlineRegistrationStatus.NOT_STARTED:
|
|
return "Ouverture des inscriptions à venir"
|
|
elif self == OnlineRegistrationStatus.ENDED:
|
|
return "Inscription terminée"
|
|
elif self == OnlineRegistrationStatus.WAITING_LIST_POSSIBLE:
|
|
return "S'inscrire en liste d'attente"
|
|
elif self == OnlineRegistrationStatus.WAITING_LIST_FULL:
|
|
return "Liste d'attente complète"
|
|
elif self == OnlineRegistrationStatus.IN_PROGRESS:
|
|
return "Tournoi en cours"
|
|
elif self == OnlineRegistrationStatus.ENDED_WITH_RESULTS:
|
|
return "Tournoi terminé"
|
|
elif self == OnlineRegistrationStatus.CANCELED:
|
|
return "Tournoi annulé"
|
|
return ""
|
|
|
|
def status_localized(self) -> str:
|
|
status_map = {
|
|
OnlineRegistrationStatus.OPEN: "Inscription ouverte",
|
|
OnlineRegistrationStatus.NOT_ENABLED: "Inscription désactivée",
|
|
OnlineRegistrationStatus.NOT_STARTED: "Ouverture des inscriptions à venir",
|
|
OnlineRegistrationStatus.ENDED: "Inscription terminée",
|
|
OnlineRegistrationStatus.WAITING_LIST_POSSIBLE: "Liste d'attente ouverte",
|
|
OnlineRegistrationStatus.WAITING_LIST_FULL: "Liste d'attente complète",
|
|
OnlineRegistrationStatus.IN_PROGRESS: "Tournoi en cours",
|
|
OnlineRegistrationStatus.ENDED_WITH_RESULTS: "Tournoi terminé",
|
|
OnlineRegistrationStatus.CANCELED: "Tournoi annulé"
|
|
}
|
|
return status_map.get(self, "")
|
|
|
|
def short_label(self) -> str:
|
|
"""Returns a short, concise label for the status box"""
|
|
label_map = {
|
|
OnlineRegistrationStatus.OPEN: "ouvert",
|
|
OnlineRegistrationStatus.NOT_ENABLED: "désactivé",
|
|
OnlineRegistrationStatus.NOT_STARTED: "à venir",
|
|
OnlineRegistrationStatus.ENDED: "clôturé",
|
|
OnlineRegistrationStatus.WAITING_LIST_POSSIBLE: "ouvert",
|
|
OnlineRegistrationStatus.WAITING_LIST_FULL: "complet",
|
|
OnlineRegistrationStatus.IN_PROGRESS: "en cours",
|
|
OnlineRegistrationStatus.ENDED_WITH_RESULTS: "résultats",
|
|
OnlineRegistrationStatus.CANCELED: "annulé"
|
|
}
|
|
return label_map.get(self, "")
|
|
|
|
def box_class(self) -> str:
|
|
"""Returns the CSS class for the status box"""
|
|
class_map = {
|
|
OnlineRegistrationStatus.OPEN: "light-green",
|
|
OnlineRegistrationStatus.NOT_ENABLED: "gray",
|
|
OnlineRegistrationStatus.NOT_STARTED: "light-green",
|
|
OnlineRegistrationStatus.ENDED: "gray",
|
|
OnlineRegistrationStatus.WAITING_LIST_POSSIBLE: "light-orange",
|
|
OnlineRegistrationStatus.WAITING_LIST_FULL: "light-red",
|
|
OnlineRegistrationStatus.IN_PROGRESS: "blue",
|
|
OnlineRegistrationStatus.ENDED_WITH_RESULTS: "dark-gray",
|
|
OnlineRegistrationStatus.CANCELED: "light-red",
|
|
}
|
|
return class_map.get(self, "gray")
|
|
|
|
def display_box(self) -> bool:
|
|
"""
|
|
Determines whether this status should display a status box
|
|
Returns True if the status should be displayed, False otherwise
|
|
"""
|
|
# List the statuses that should display a box
|
|
display_statuses = [
|
|
OnlineRegistrationStatus.OPEN,
|
|
OnlineRegistrationStatus.NOT_STARTED,
|
|
OnlineRegistrationStatus.WAITING_LIST_POSSIBLE,
|
|
OnlineRegistrationStatus.WAITING_LIST_FULL,
|
|
OnlineRegistrationStatus.CANCELED,
|
|
# You can add or remove statuses as needed
|
|
]
|
|
|
|
return self in display_statuses
|
|
|
|
class UserOrigin(models.IntegerChoices):
|
|
ADMIN = 0, 'Admin'
|
|
SITE = 1, 'Site'
|
|
APP = 2, 'App'
|
|
|
|
class UserRole(models.IntegerChoices):
|
|
JAP = 0, 'Juge-Arbitre'
|
|
CLUB_OWNER = 1, 'Club Owner'
|
|
PLAYER = 2, 'Player'
|
|
|
|
class RegistrationStatus(models.IntegerChoices):
|
|
WAITING = 0, 'Waiting'
|
|
PENDING = 1, 'Pending'
|
|
CONFIRMED = 2, 'Confirmed'
|
|
CANCELED = 3, 'Canceled'
|
|
|
|
class RegistrationPaymentMode(models.IntegerChoices):
|
|
DISABLED = 0, 'Disabled'
|
|
CORPORATE = 1, 'Corporate'
|
|
NO_FEE = 2, 'No Service Fee'
|
|
STRIPE = 3, 'Stripe'
|
|
|