from datetime import date from django.db import models from ultron.tools.models import Markdownizable from ultron.people.models import Gymnast from ultron.planning.models import Event from ultron.objective.models import Educative, Skill, Routine ROUTINE_CHOICE = ( (0, "Other"), (1, "L1"), (2, "L2"), (3, "L3"), (4, "L4"), (5, "L1S"), (6, "L2S"), (7, "L3S"), (8, "L4S"), (9, "Other"), ) CAN_DO_TYPE_CHOICES = ( (0, "No"), (1, "With help"), (2, "Without help"), (3, "Chained"), (4, "Masterised") ) class Chrono(models.Model): """ Représente les chronos (de chandelles ou de série) enregistrés pour un(e) gymnaste. """ CHRONO_TYPE_CHOICE = ( (0, "10 |"), (1, "L1"), (2, "L2"), (3, "L3"), (4, "L4"), (99, "Other"), ) SCORE_TYPE_CHOICE = ( (0, "Chrono"), (1, "ToF"), ) class Meta: verbose_name = "Chrono" verbose_name_plural = "Chronos" ordering = ["date", "gymnast"] gymnast = models.ForeignKey( Gymnast, verbose_name="gymnast", related_name="chronos", on_delete=models.CASCADE, ) chrono_type = models.PositiveSmallIntegerField( choices=CHRONO_TYPE_CHOICE, verbose_name="Routine type" ) score_type = models.PositiveSmallIntegerField( choices=SCORE_TYPE_CHOICE, verbose_name="Score type" ) score = models.DecimalField(max_digits=5, decimal_places=3) tof = models.DecimalField(max_digits=5, decimal_places=3, blank=True, null=True) date = models.DateField(default=date.today, verbose_name="Date") created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) def __str__(self): return "%s - %s (%s - %s)" % ( self.gymnast, self.score, self.date, self.chrono_type, ) @staticmethod def compute_tof(value): tof = round((value * 13) / 15, 3) * 1000 tof = tof - (tof % 5) return (tof / 1000) class ChronoDetails(models.Model): """ Class permettant d'enregistrer des détails d'un chrono : le temps de chaque saut. """ class Meta: verbose_name = "Chronos Details" verbose_name_plural = "Chronos Details" ordering = ["chrono", "order"] unique_together = ["chrono", "order"] chrono = models.ForeignKey(Chrono, on_delete=models.CASCADE, related_name="details") order = models.SmallIntegerField() value = models.DecimalField(max_digits=5, decimal_places=3) class Accident(Markdownizable): """ La classe `Accident` permet d'indiquer qu'un gymnaste a eu un accident, en liaison avec un skill ou non. """ class Meta: verbose_name = "Accident" verbose_name_plural = "Accidents" # unique_together = ("gymnast", "skill", "date") gymnast = models.ForeignKey( Gymnast, verbose_name="Gymnast", related_name="accident", on_delete=models.CASCADE, ) skill = models.ForeignKey( "objective.Skill", verbose_name="Skill", related_name="accident", on_delete=models.SET_NULL, default=None, blank=True, null=True, ) date = models.DateField(verbose_name="Date") nb_week_off = models.SmallIntegerField( blank=True, null=True, verbose_name="# week off" ) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) def __str__(self): return "%s(%s)" % ( self.gymnast, self.date, ) class LearnedSkill(models.Model): """ Représente la capacité d'un gymnaste à savori faire un skill de la ligne d'apprentissage. """ class Meta: verbose_name = "Learned Skill" verbose_name_plural = "Learned Skills" unique_together = ("gymnast", "skill", "date", "cando") gymnast = models.ForeignKey( Gymnast, verbose_name="gymnast", related_name="known_skills", on_delete=models.CASCADE, ) skill = models.ForeignKey( Skill, verbose_name="Skill", related_name="known_by", on_delete=models.CASCADE, ) cando = models.PositiveSmallIntegerField( choices=CAN_DO_TYPE_CHOICES, verbose_name="Can do type" ) date = models.DateField(default=date.today, verbose_name="Date") created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) class Plan(models.Model): """ Classe représentant les objectifs qu'un gymnaste devra savoir faire pour une date donnée. """ class Meta: verbose_name = "Plan" verbose_name_plural = "Plans" ordering = ["date", "educative", "gymnast"] unique_together = ("gymnast", "educative") gymnast = models.ForeignKey( "people.Gymnast", verbose_name="Gymnast", related_name="todo", on_delete=models.CASCADE, ) educative = models.ForeignKey( Educative, verbose_name="Educative", related_name="plan", on_delete=models.CASCADE, ) date = models.DateField(default=date.today, verbose_name="Date") cando = models.PositiveSmallIntegerField( choices=CAN_DO_TYPE_CHOICES, verbose_name="Can do type", default=3 ) is_done = models.BooleanField(default=0) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) def __str__(self): return "%s - %s - %s" % ( self.gymnast, self.educative.short_label, self.date, ) class Point(models.Model): """ Représente les points obtenus lors d'une compétition. """ ROUTINETYPE_CHOICE = ( (0, "Routine 1"), (1, "Routine 2"), (2, "Final") ) gymnast = models.ForeignKey( Gymnast, on_delete=models.CASCADE, default=None, related_name="points" ) event = models.ForeignKey(Event, on_delete=models.CASCADE, default=None) routine_type = models.PositiveSmallIntegerField(choices=ROUTINETYPE_CHOICE) point_execution = models.DecimalField(max_digits=5, decimal_places=3) point_difficulty = models.DecimalField(max_digits=3, decimal_places=1) point_time_of_flight = models.DecimalField(max_digits=5, decimal_places=3) point_horizontal_displacement = models.DecimalField(max_digits=4, decimal_places=3) penality = models.DecimalField(max_digits=3, decimal_places=1) total = models.DecimalField(max_digits=6, decimal_places=3) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) def __str__(self): return "%s - %s" % ( self.gymnast, self.total, ) class MindState(Markdownizable): """ Représente l'état d'esprit psychologique d'un gymnaste """ gymnast = models.ForeignKey( Gymnast, on_delete=models.CASCADE, default=None, related_name="mindstate" ) date = models.DateField(default=date.today, verbose_name="Date") event = models.ForeignKey( Event, on_delete=models.SET_NULL, default=None, blank=True, null=True, related_name="mindstate", ) score = models.PositiveSmallIntegerField(verbose_name="Score") created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) def __str__(self): return "%s - %s : %s" % (self.gymnast, self.date, self.score) class GymnastHasRoutine(models.Model): """ Classe représentant le lien entre les gymnastes et leurs séries. """ class Meta: verbose_name = "Gymnast Has Routine" verbose_name_plural = "Gymnast Has Routines" gymnast = models.ForeignKey( Gymnast, verbose_name="Gymnast", related_name="has_routine", on_delete=models.CASCADE, ) routine = models.ForeignKey( Routine, verbose_name="Routine", related_name="done_by_gymnast", on_delete=models.CASCADE, ) routine_type = models.PositiveSmallIntegerField( choices=ROUTINE_CHOICE, verbose_name="Type", default="1" ) datebegin = models.DateField(default=date.today, verbose_name="Date begin") dateend = models.DateField( default=date.today, verbose_name="Date end", null=True, blank=True ) def __str__(self): return "%s - %s : %s" % (self.gymnast, self.routine_type, self.routine) class NumberOfRoutineDone(models.Model): """ Classe permettant de suivre le nombre de séries faites par le gymnaste. """ class Meta: verbose_name = "Number of routine done" verbose_name_plural = "Number of routines done" gymnast = models.ForeignKey( Gymnast, verbose_name="Gymnast", related_name="number_of_routine_done", on_delete=models.CASCADE, ) routine = models.ForeignKey( Routine, verbose_name="Routine", related_name="number_of_try", on_delete=models.SET_NULL, null=True, blank=True, ) routine_type = models.PositiveSmallIntegerField( choices=ROUTINE_CHOICE, verbose_name="Type", default="1" ) number_of_try = models.PositiveSmallIntegerField(verbose_name="Number of try") number_of_successes = models.PositiveSmallIntegerField( verbose_name="number of successes" ) date = models.DateField(default=date.today, verbose_name="Date") def __str__(self): return "%s - %s (%s) : %s | %s" % ( self.gymnast, self.routine_type, self.routine, self.number_of_try, self.number_of_successes, ) class HeightWeight(models.Model): """ Classe permettant de suivre le poids et la taille d'un gymnaste """ class Meta: verbose_name = "Height & weight" verbose_name_plural = "Heights & weights" unique_together = ("gymnast", "date") gymnast = models.ForeignKey( Gymnast, verbose_name="Gymnast", related_name="height_weight", on_delete=models.CASCADE, ) height = models.DecimalField(max_digits=4, decimal_places=1, verbose_name="Height") hips_height = models.DecimalField(max_digits=4, decimal_places=1, verbose_name="Hips height") weight = models.DecimalField(max_digits=4, decimal_places=1, verbose_name="Weight") date = models.DateField(default=date.today, verbose_name="Date") def __str__(self): return "%s : %s/%s - %s" % (self.gymnast, self.height, self.hips_height, self.weight)