2021-11-17 10:39:16 +01:00
|
|
|
from django.db import models
|
|
|
|
from datetime import date
|
|
|
|
import pendulum
|
|
|
|
from tools.models import Markdownizable
|
|
|
|
from location.models import Club
|
2021-12-07 10:22:07 +01:00
|
|
|
from objective.models import Skill
|
|
|
|
from django.db.models import Q, Count, Min
|
|
|
|
|
2021-11-17 10:39:16 +01:00
|
|
|
|
|
|
|
class Gymnast(Markdownizable):
|
|
|
|
"""Représente un gymnaste.
|
|
|
|
Un gymnaste peut être actif ou inactif.
|
|
|
|
"""
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
verbose_name = "Gymnast"
|
|
|
|
verbose_name_plural = "Gymnasts"
|
|
|
|
|
|
|
|
GENDER_CHOICES = ((0, "Male"), (1, "Female"))
|
|
|
|
|
|
|
|
last_name = models.CharField(max_length=40, null=False, blank=False)
|
|
|
|
first_name = models.CharField(max_length=25, null=False, blank=False)
|
|
|
|
birthdate = models.DateField(verbose_name="Date de naissance")
|
|
|
|
gender = models.PositiveSmallIntegerField(
|
|
|
|
choices=GENDER_CHOICES, verbose_name="Sexe"
|
|
|
|
)
|
|
|
|
is_active = models.BooleanField(default=1, verbose_name="Active")
|
|
|
|
club = models.ForeignKey(
|
|
|
|
Club, null=True, on_delete=models.SET_NULL, related_name="gymnast"
|
|
|
|
)
|
|
|
|
trainings_by_week = models.PositiveSmallIntegerField(verbose_name="# Training by week")
|
|
|
|
hours_by_week = models.PositiveSmallIntegerField(verbose_name="# Hours by week")
|
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
return u"%s, %s" % (self.last_name, self.first_name)
|
|
|
|
|
|
|
|
@property
|
|
|
|
def next_birthday_in_days(self):
|
|
|
|
now = pendulum.now()
|
|
|
|
return self.next_birthday.diff(now).in_days()
|
|
|
|
|
|
|
|
@property
|
|
|
|
def age(self):
|
|
|
|
""" Renvoie l'âge d'un gymnaste. """
|
|
|
|
today = date.today()
|
|
|
|
return (
|
|
|
|
today.year
|
|
|
|
- self.birthdate.year
|
|
|
|
- ((today.month, today.day) < (self.birthdate.month, self.birthdate.day))
|
|
|
|
)
|
|
|
|
|
|
|
|
@property
|
|
|
|
def next_age(self):
|
|
|
|
""" Renvoie l'âge prochain du gymnaste. """
|
2021-12-07 10:22:07 +01:00
|
|
|
return (self.age) + 1
|
|
|
|
|
|
|
|
def min_rank_skill(self):
|
|
|
|
tmp = Skill.objects.filter(known_by__gymnast=self.id).order_by("rank").values('rank')[:1]
|
|
|
|
|
|
|
|
if tmp:
|
|
|
|
min_rank = tmp[0]['rank']
|
|
|
|
else:
|
|
|
|
min_rank = 0
|
|
|
|
|
|
|
|
return min_rank
|
|
|
|
|
|
|
|
def max_rank_skill(self):
|
|
|
|
tmp = Skill.objects.filter(known_by__gymnast=self.id).order_by(
|
|
|
|
"-rank"
|
|
|
|
).values('rank')[:1]
|
|
|
|
if tmp:
|
|
|
|
max_rank = tmp[0]['rank']
|
|
|
|
else:
|
|
|
|
max_rank = 0
|
|
|
|
|
|
|
|
return max_rank
|
|
|
|
|
|
|
|
def known_skill_by_rank(self):
|
|
|
|
"""
|
|
|
|
Renvoie le nombre de Skill qu'un gymnast sait faire par rang
|
|
|
|
"""
|
|
|
|
nb_known_skill_by_rank = (
|
|
|
|
Skill.objects.values("rank")
|
|
|
|
.filter(known_by__gymnast=self.id)
|
|
|
|
.order_by("rank")
|
|
|
|
.annotate(nb_known_skill=Count("id"))
|
|
|
|
)
|
|
|
|
return nb_known_skill_by_rank
|
|
|
|
|
|
|
|
def max_level_skill(self):
|
|
|
|
tmp = Skill.objects.filter(known_by__gymnast=self.id).order_by(
|
|
|
|
"-level"
|
|
|
|
).values('level')[:1]
|
|
|
|
if tmp:
|
|
|
|
max_level = tmp[0]['level']
|
|
|
|
else:
|
|
|
|
max_level = 0
|
|
|
|
|
|
|
|
return max_level
|
|
|
|
|
|
|
|
def nb_known_skill_by_level(self):
|
|
|
|
nb_known_skill_by_level = (
|
|
|
|
Skill.objects.values("level")
|
|
|
|
.filter(known_by__gymnast=self.id)
|
|
|
|
.order_by("level")
|
|
|
|
.annotate(nb_known_skill=Count("id"))
|
|
|
|
)
|
|
|
|
return nb_known_skill_by_level
|