from django.db import models from tools.models import Markdownizable class Educative(Markdownizable): """ Classe `mère`. """ class Meta: verbose_name = "Educatif" verbose_name_plural = "Educatifs" ordering = ["label", "short_label"] # 'level', label = models.CharField(max_length=255, verbose_name="Long Name") short_label = models.CharField(max_length=255, verbose_name="Short Name") difficulty = models.DecimalField( max_digits=3, decimal_places=1, verbose_name="Difficulty" ) level = models.PositiveSmallIntegerField(verbose_name="Level", default=0) rank = models.PositiveSmallIntegerField(verbose_name="Rank", default=0) educatives = models.ManyToManyField( "self", related_name="educatives_of", blank=True, symmetrical=False ) prerequisites = models.ManyToManyField( "self", related_name="prerequisite_of", blank=True, symmetrical=False ) age_boy = models.PositiveSmallIntegerField( blank=True, null=True, verbose_name="Boy's age" ) age_girl = models.PositiveSmallIntegerField( blank=True, null=True, verbose_name="Girl's age" ) def __str__(self): return "%s - %s (level: %s | diff: %s)" % ( self.rank, self.label, self.level, self.difficulty, ) class TouchPosition(models.Model): """ Classe représentant les différentes position d'arrivée/départ (landing position) en trampoline. """ class Meta: verbose_name = "Landing" verbose_name_plural = "Landings" ordering = ["label", "short_label", "is_default", "allowed_in_competition"] label = models.CharField(max_length=30, verbose_name="Long label") short_label = models.CharField(max_length=15, verbose_name="Short label") allowed_in_competition = models.BooleanField(verbose_name="Allowed in competition") is_default = models.BooleanField(verbose_name="Défault ?") def __str__(self): return "%s" % (self.label) def get_default_position(): """ Renvoie la position d'arrivée/départ par définie par défaut si elle existe. Sinon, renvoie None. """ try: return TouchPosition.objects.get(default=True).id except: return None class Skill(Educative): """ Classe représentant une figure (aka un saut acrobatique). """ # SELECT * FROM `objective_skill` WHERE educative_ptr_id NOT IN (SELECT DISTINCT(from_educative_id) FROM `objective_educative_prerequisite`) # SELECT * FROM `objective_skill`, `objective_educative` WHERE `objective_educative`.id = `objective_skill`.educative_ptr_id class Meta: verbose_name = "Skill" verbose_name_plural = "Skills" POSITION_CHOICES = ( ("0", "None"), ("o", "Tuck"), # ("c", "Puck"), ("<", "Pike"), # ("L", "Half pike"), ("/", "Straight"), ("//", "Straddle"), ) ROTATION_CHOICES = ( (0, "None"), (1, "Frontward"), (2, "Backward"), ) position = models.CharField(max_length=2, choices=POSITION_CHOICES) departure = models.ForeignKey( TouchPosition, related_name="depart_of", default=get_default_position, verbose_name="Take-off position", on_delete=models.CASCADE, ) landing = models.ForeignKey( TouchPosition, related_name="landing_of", default=get_default_position, verbose_name="Landing position", on_delete=models.CASCADE, ) rotation_type = models.PositiveSmallIntegerField( choices=ROTATION_CHOICES, verbose_name="Type de rotation" ) rotation = models.PositiveSmallIntegerField(verbose_name="1/4 de rotation") twist = models.PositiveSmallIntegerField(verbose_name="1/2 Vrille") notation = models.CharField(max_length=25) simplified_notation = models.CharField( max_length=25, verbose_name="Notation simplifiée" ) is_competitive = models.BooleanField(default=False) # importance = models.PositiveSmallIntegerField(default = 1) def __str__(self): return "%s (%s)" % (self.short_label, self.notation)