from django.db import models from datetime import date from django.db.models.deletion import CASCADE from tools.models import Markdownizable from people.models import Gymnast from planning.models import Event from objective.models import Skill, Routine class Chrono(models.Model): """ Représente les chronos (de chandelles ou de série) enregistrés pour un(e) gymnaste. """ ROUTINETYPE_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"] # unique_together = ("gymnast", "skill") gymnast = models.ForeignKey( Gymnast, verbose_name="gymnast", related_name="chronos", on_delete=models.CASCADE, ) type = models.PositiveSmallIntegerField( choices=ROUTINETYPE_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.type, ) 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" # ordering = ["date", "gymnast"] 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.CASCADE, 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. """ TYPE_CHOICES = ((0, "No"), (1, "With help"), (2, "Without help"), (3, "Chained")) class Meta: verbose_name = 'Learned Skill' verbose_name_plural = 'Learned Skills' unique_together = ('gymnast', 'skill', 'date') gymnast = models.ForeignKey( Gymnast, verbose_name='gymnast', related_name='can_do_skill', on_delete=models.CASCADE, ) skill = models.ForeignKey( Skill, verbose_name='Skill', related_name='done_by_gymnasts', on_delete=models.CASCADE, ) cando = models.PositiveSmallIntegerField( choices=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 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.CASCADE, 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" ROUTINETYPE_CHOICE = ( (1, "L1"), (2, "L2"), (3, "L3"), (4, "L4"), (5, "L1S"), (6, "L2S"), (7, "L3S"), (8, "L4S"), ) gymnast = models.ForeignKey( Gymnast, verbose_name="Gymnast", related_name="routines", on_delete=models.CASCADE, ) routine = models.ForeignKey( Routine, verbose_name="Routine", related_name="done_by", on_delete=models.CASCADE, ) routine_type = models.PositiveSmallIntegerField( choices=ROUTINETYPE_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)