from django.db import models from datetime import date import pendulum from tools.models import Markdownizable from location.models import Club from objective.models import Skill from django.db.models import Q, Count, Min 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. """ 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