Ultron/ultron/followup/models.py

292 lines
8.6 KiB
Python

from django.db import models
from datetime import date
from django.db.models.deletion import CASCADE
from ultron.tools.models import Markdownizable
from ultron.people.models import Gymnast
from ultron.planning.models import Event
from ultron.objective.models import Skill, Routine
ROUTINE_CHOICE = (
(0, "Other"),
(1, "L1"),
(2, "L2"),
(3, "L3"),
(4, "L4"),
(5, "L1S"),
(6, "L2S"),
(7, "L3S"),
(8, "L4S"),
)
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"
# 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.
"""
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", "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=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.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"
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")
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" % (self.gymnast, self.height, self.weight)