Ultron/people/models.py

108 lines
3.2 KiB
Python

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