[WIP] Improvement based on Fred's advies.

This commit is contained in:
Trullemans Gregory 2020-03-11 13:54:24 +01:00
parent e84733b3b5
commit ec5f2bd44d
5 changed files with 124 additions and 98 deletions

View File

@ -40,7 +40,12 @@ Ce paramètre permet de construire des séries pour une gymnaste bien précis en
## Localisations
Ce module permet de gérer les localisations et les clubs. (plus d'informations à venir)
## Compétitions
Ce module permet de gérer les compétitions. (plus d'informations à venir)
## Personnes
Ce module permet de gérer les personnes. (plus d'informations à venir)

View File

@ -25,7 +25,7 @@ class Country(models.Model):
class Place(models.Model):
"""
Classe représentant un lieu. En plus de l'adresse, un lieu est spécifié par un nombre
Représente un lieu. En plus de l'adresse, un lieu est spécifié par un nombre
de kilomètres et une durée de trajet. Pour faciliter les filtres, un lieu peut être
actif ou non.
"""
@ -51,7 +51,7 @@ class Place(models.Model):
class Club(models.Model):
"""
Classe représentant un club. Un club est associé à un lieu. Pour faciliter les filtres,
Représente un club. Un club est associé à un lieu. Pour faciliter les filtres,
un club peut être actif ou non.
.. todo:: Un club peut avoir plusieurs salle et une salle peut-être louée par plusieurs clubs... M2M ?

View File

@ -17,24 +17,24 @@ class Educative(Markdownizable):
verbose_name_plural = "Educatifs"
ordering = ["longLabel", "shortLabel"] # 'level',
longLabel = models.CharField(max_length=255, verbose_name="Long Name")
shortLabel = models.CharField(max_length=255, verbose_name="Short Name")
longLabel = models.CharField(max_length = 255, verbose_name = "Long Name")
shortLabel = models.CharField(max_length = 255, verbose_name = "Short Name")
difficulty = models.DecimalField(
max_digits=3, decimal_places=1, verbose_name="Difficulty"
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)
level = models.PositiveSmallIntegerField(verbose_name = "Level", default = 0)
rank = models.PositiveSmallIntegerField(verbose_name = "Rank", default = 0)
educative = models.ManyToManyField(
"self", related_name="educativeOf", blank=True, symmetrical=False
"self", related_name = "educativeOf", blank = True, symmetrical = False
)
prerequisite = models.ManyToManyField(
"self", related_name="prerequisiteOf", blank=True, symmetrical=False
"self", related_name = "prerequisiteOf", blank = True, symmetrical = False
)
ageBoy = models.PositiveSmallIntegerField(
blank=True, null=True, verbose_name="Boy's age"
blank = True, null = True, verbose_name = "Boy's age"
)
ageGirl = models.PositiveSmallIntegerField(
blank=True, null=True, verbose_name="Girl's age"
blank = True, null = True, verbose_name = "Girl's age"
)
def __str__(self):
@ -56,10 +56,10 @@ class TouchPosition(models.Model):
verbose_name_plural = "Landings"
ordering = ["longLabel", "shortLabel", "default", "competition"]
longLabel = models.CharField(max_length=30, verbose_name="Nom long")
shortLabel = models.CharField(max_length=15, verbose_name="Nom court")
competition = models.BooleanField(verbose_name="Compétition")
default = models.BooleanField(verbose_name="Défaut")
longLabel = models.CharField(max_length = 30, verbose_name = "Nom long")
shortLabel = models.CharField(max_length = 15, verbose_name = "Nom court")
competition = models.BooleanField(verbose_name = "Compétition")
default = models.BooleanField(verbose_name = "Défaut")
def __str__(self):
return "%s" % (self.longLabel)
@ -104,29 +104,29 @@ class Skill(Educative):
(2, "Backward"),
)
position = models.CharField(max_length=2, choices=POSITION_CHOICES)
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,
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,
related_name = "landing_of",
default = get_default_position,
verbose_name = "Landing position",
on_delete = models.CASCADE,
)
rotationType = models.PositiveSmallIntegerField(
choices=ROTATION_CHOICES, verbose_name="Type de rotation"
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)
simplyNotation = models.CharField(max_length=25, verbose_name="Notation simplifiée")
is_competitive = models.BooleanField(default=False)
rotation = models.PositiveSmallIntegerField(verbose_name = "1/4 de rotation")
twist = models.PositiveSmallIntegerField(verbose_name = "1/2 Vrille")
notation = models.CharField(max_length = 25)
simplyNotation = models.CharField(max_length = 25, verbose_name = "Notation simplifiée")
is_competitive = models.BooleanField(default = False)
# importance = models.PositiveSmallIntegerField(default = 1)
def __str__(self):
@ -144,9 +144,9 @@ class Routine(Educative):
active = models.BooleanField()
jumps = models.ManyToManyField(
Skill, through="Routine_Skill", verbose_name="routine"
Skill, through = "Routine_Skill", verbose_name = "routine"
) # ceci n'est pas un vrai champ
is_competitive = models.BooleanField(default=False)
is_competitive = models.BooleanField(default = False)
def __str__(self):
return "%s (%s)" % (self.shortLabel, self.shortLabel)
@ -216,10 +216,10 @@ class Routine_Skill(models.Model):
ordering = ("rank",)
routine = models.ForeignKey(
Routine, on_delete=models.CASCADE, default=None, related_name="skill_links"
Routine, on_delete = models.CASCADE, default = None, related_name = "skill_links"
)
skill = models.ForeignKey(
Skill, on_delete=models.CASCADE, default=None, related_name="routine_links"
Skill, on_delete = models.CASCADE, default = None, related_name = "routine_links"
)
rank = models.PositiveSmallIntegerField()
@ -247,13 +247,13 @@ class Chrono(models.Model):
(99, "Other"),
)
routine = models.ForeignKey(Routine, on_delete=models.CASCADE, default=None)
routine_type = models.PositiveSmallIntegerField(choices=ROUTINETYPE_CHOICE)
routine = models.ForeignKey(Routine, on_delete = models.CASCADE, default = None)
routine_type = models.PositiveSmallIntegerField(choices = ROUTINETYPE_CHOICE)
gymnast = models.ForeignKey(
"people.gymnast", on_delete=models.CASCADE, default=None
"people.gymnast", on_delete = models.CASCADE, default = None
)
date = models.DateField(default=date.today, verbose_name="Date")
score = models.DecimalField(max_digits=5, decimal_places=2)
date = models.DateField(default = date.today, verbose_name = "Date")
score = models.DecimalField(max_digits = 5, decimal_places = 2)
def __str__(self):
return "%s le %s : %s pour %s" % (
@ -278,13 +278,13 @@ class Evaluation(models.Model):
Classe permettant l'évaluation des éducatifs.
"""
date = models.DateField(default=date.today, verbose_name="Date")
value = models.PositiveSmallIntegerField(default=0)
date = models.DateField(default = date.today, verbose_name = "Date")
value = models.PositiveSmallIntegerField(default = 0)
educative = models.ForeignKey(
Educative,
related_name="depart_of",
verbose_name="Take-off position",
on_delete=models.CASCADE,
related_name = "depart_of",
verbose_name = "Take-off position",
on_delete = models.CASCADE,
)
type_of_evaluator = models.BooleanField(default=0)
evaluator = models.ForeignKey(User, null=True, on_delete=models.SET_NULL)
type_of_evaluator = models.BooleanField(default = 0)
evaluator = models.ForeignKey(User, null = True, on_delete = models.SET_NULL)

View File

@ -349,16 +349,7 @@ def random_skill(request, number=None):
return render(request, "judge_training_diff.html", context)
def __construct_routine(skill_list, routine):
""" """
pass
# routine.append(random(skill_list))
# if len(routine) < 10:
# __construct_routine(skill_list, routine)
def suggest_routine(
request,
def __construct_routine(
routine_length,
total_difficulty_score=None,
competition=True,
@ -369,10 +360,10 @@ def suggest_routine(
""" Construit et propose des séries.
Args:
routine_length (int): nombre de sauts que doit contenir la série.
total_difficulty_score (int): score de difficulté total souhaité de la série.
competition (bool): indique si la série doit pouvoir être utilisée en compétition.
logic (bool): indique si la série doit suivre certaines règles de logique (sportive).
routine_length (int): nombre de sauts qui compose la série.
total_difficulty_score (int): score total de difficulté souhaité de la série.
competition (bool): indique si la série doit respecter les règles de compétition.
logic (bool): indique si la série doit suivre les règles de logique (sportive).
gymnast (gymnast): gymnaste.
last_jump (skill): dernier saut sélectionné pour la série.
@ -382,41 +373,42 @@ def suggest_routine(
current_routine = []
if last_jump:
skill_list = Skill.objects.filter(
departure=last_jump.landing, difficulty__lte=total_difficulty_score
)
if logic and last_jump.landing == "Debout":
skill_list = skill_list.exclude(rotationType=last_jump.rotationType)
else:
skill_list = Skill.objects.filter(departure__longLabel="Debout")
skill_list = Skill.objects.all()
if competition:
skill_list = skill_list.filter(is_competitive=True)
# if last_jump:
# skill_list = Skill.objects.filter(
# departure = last_jump.landing, difficulty__lte = total_difficulty_score
# )
# if logic and last_jump.landing == "Debout":
# skill_list = skill_list.exclude(rotationType = last_jump.rotationType)
# else:
# skill_list = Skill.objects.filter(departure__longLabel = "Debout")
if logic and total_difficulty_score:
min_difficulty_score = math.ceil(max(0, ((total_difficulty_score / 10) - 5)))
# if competition:
# skill_list = skill_list.filter(is_competitive = True)
if total_difficulty_score <= 65:
max_difficulty_score = math.ceil(total_difficulty_score / 5) + 1
elif total_difficulty_score <= 120:
max_difficulty_score = math.ceil(total_difficulty_score / 10) + 7
else:
max_difficulty_score = math.ceil(total_difficulty_score / 15) + 11
# if logic and total_difficulty_score:
# min_difficulty_score = math.ceil(max(0, ((total_difficulty_score / 10) - 5)))
skill_list = skill_list.filter(
difficulty__gte=min_difficulty_score, difficulty__lte=max_difficulty_score
)
# if total_difficulty_score <= 65:
# max_difficulty_score = math.ceil(total_difficulty_score / 5) + 1
# elif total_difficulty_score <= 120:
# max_difficulty_score = math.ceil(total_difficulty_score / 10) + 7
# else:
# max_difficulty_score = math.ceil(total_difficulty_score / 15) + 11
if gymnast:
# skill_list = skill_list.filter(can_do__ blablabla)
pass
# skill_list = skill_list.filter(
# difficulty__gte = min_difficulty_score,
# difficulty__lte = max_difficulty_score
# )
# if gymnast:
# skill_list = skill_list.filter(can_do__gymnast = gymnast)
for skill in skill_list:
current_routine.append(skill)
current_routine.append(
self.suggest_routine(
request,
total_difficulty_score - skill.difficulty,
max_difficulty_score,
routine_length - 1,
@ -444,6 +436,42 @@ def suggest_routine(
# n = len(val)
# print(knapSack(W, wt, val, n))
return current_routine
def suggest_routine(
request,
routine_length,
total_difficulty_score=None,
competition=True,
logic=True,
gymnast=None,
last_jump=None,
):
""" Construit et propose des séries.
Args:
routine_length (int): nombre de sauts qui compose la série.
total_difficulty_score (int): score total de difficulté souhaité de la série.
competition (bool): indique si la série doit respecter les règles de compétition.
logic (bool): indique si la série doit suivre les règles de logique (sportive).
gymnast (gymnast): gymnaste.
last_jump (skill): dernier saut sélectionné pour la série.
Returns:
??? (list): liste des séries correspondantes aux criètres.
"""
current_routine = suggest_routine(
routine_length,
total_difficulty_score,
competition,
logic,
gymnast,
last_jump
)
print(current_routine)
@login_required
def chrono_listing(request, gymnastid=None, routineid=None):

View File

@ -95,8 +95,7 @@ class Gymnast(Markdownizable):
Soit le jour/mois pour cette année
Soit le jour/mois pour l'année prochaine.
Examples:
>>> "en supposant qu'on soit le 23/05/2019 :-)"
Examples: en supposant qu'on soit le 23/05/2019
>>> from datetime import date
>>> gregg = People(name='Tru', firstname='Gregg', birthdate=date(1982, 2, 5)
>>> gregg.next_birthday()
@ -120,9 +119,7 @@ class Gymnast(Markdownizable):
@property
def age(self):
"""
Renvoie l'âge d'un gymnaste.
"""
""" Renvoie l'âge d'un gymnaste. """
today = date.today()
return (
today.year
@ -132,16 +129,12 @@ class Gymnast(Markdownizable):
@property
def nextAge(self):
"""
Renvoie l'âge prochain du gymnaste.
"""
""" Renvoie l'âge prochain du gymnaste. """
return (self.age) + 1
@property
def known_skills(self):
"""
Renvoie la liste des objectifs qu'un gymnaste sait faire.
"""
""" Renvoie la liste des objectifs qu'un gymnaste sait faire. """
return CanDoRelation.objects.filter(gymnast=self.id)
@property
@ -189,7 +182,7 @@ class Accident(Markdownizable):
class CanDoRelation(models.Model):
"""
Classe représentant les objectifs qu'un gymnaste sait faire (à partir d'une date donnée).
Représente les objectifs qu'un gymnaste sait faire (à partir d'une date donnée).
"""
class Meta:
@ -206,7 +199,7 @@ class CanDoRelation(models.Model):
# QUESTIONS
# ---------
#
# 1) Cela ne dervait pas être deux relation ManyToMany dans chacune des tables GYMNAST et EDUCATIVE (ou SKILL) ?
# 1) Cela ne dervait pas être deux relations ManyToMany dans chacune des tables GYMNAST et EDUCATIVE (ou SKILL) ?
# Un élève saura faire plusieurs figures.
# Et une figure pourra savoir être faite par plusieurs élèves... Donc, ?
#