Ultron/ultron/followup/models.py

368 lines
11 KiB
Python

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"), # TODO: delete !!!
(1, "R1"),
(2, "R2"),
(3, "R3"),
(4, "R4"),
(5, "R1S"),
(6, "R2S"),
(7, "R3S"),
(8, "R4S"),
(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, "Routine 1"),
(2, "Routine 2"),
(3, "Routine 3"),
(4, "Routine 4"),
(9, "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 = (
(1, "Routine 1"),
(2, "Routine 2"),
(3, "Final") # Routine 3
)
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, verbose_name="Execution")
point_difficulty = models.DecimalField(max_digits=3, decimal_places=1, verbose_name="Difficulty")
point_time_of_flight = models.DecimalField(max_digits=5, decimal_places=3, verbose_name="ToF")
point_horizontal_displacement = models.DecimalField(max_digits=4, decimal_places=3, verbose_name="HD")
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, verbose_name="Created")
updated_at = models.DateTimeField(auto_now=True, verbose_name="Updated")
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"
# unique_together()
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(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", default=0)
number_of_successes = models.PositiveSmallIntegerField(
verbose_name="number of successes", default=0
)
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)