diff --git a/jarvis/objective/admin.py b/jarvis/objective/admin.py index dfc07f3..287696c 100644 --- a/jarvis/objective/admin.py +++ b/jarvis/objective/admin.py @@ -9,10 +9,10 @@ from django_admin_listfilter_dropdown.filters import ( from .models import ( TouchPosition, Skill, - Passe, + # Passe, Routine, RoutineSkill, - TrainingProgram, + # TrainingProgram, PrerequisiteClosure, ) @@ -194,57 +194,57 @@ class PrerequisiteClosureAdmin(admin.ModelAdmin): ) -@admin.register(Passe) -class PasseAdmin(admin.ModelAdmin): - model = Passe +# @admin.register(Passe) +# class PasseAdmin(admin.ModelAdmin): +# model = Passe - fields = ( - "label", - "educatives", - "regexp", - "number_of_skill", - "difficulty", - "informations", - ) +# fields = ( +# "label", +# "educatives", +# "regexp", +# "number_of_skill", +# "difficulty", +# "informations", +# ) - list_display = ("label", "regexp", "number_of_skill", "difficulty") - list_filter = ( - ("number_of_skill", DropdownFilter), - ("difficulty", DropdownFilter), - ) - filter_horizontal = ("educatives",) +# list_display = ("label", "regexp", "number_of_skill", "difficulty") +# list_filter = ( +# ("number_of_skill", DropdownFilter), +# ("difficulty", DropdownFilter), +# ) +# filter_horizontal = ("educatives",) - class Media: - js = ( - "js/core/jquery-3.6.0.min.js", - "js/admin/passe.js", - ) +# class Media: +# js = ( +# "js/core/jquery-3.6.0.min.js", +# "js/admin/passe.js", +# ) -@admin.register(TrainingProgram) -class TrainingProgramAdmin(admin.ModelAdmin): - model = TrainingProgram +# @admin.register(TrainingProgram) +# class TrainingProgramAdmin(admin.ModelAdmin): +# model = TrainingProgram - fields = ( - "gymnast", - "date", - "rank", - "passe", - "repetition", - "number_of_skill", - "difficulty", - # "score", - ) - list_display = ( - "date", - "gymnast", - "passe", - "rank", - "repetition", - "number_of_skill", - "difficulty", - ) - list_filter = ( - ("gymnast", RelatedDropdownFilter), - ("date", DropdownFilter), - ) +# fields = ( +# "gymnast", +# "date", +# "rank", +# "passe", +# "repetition", +# "number_of_skill", +# "difficulty", +# # "score", +# ) +# list_display = ( +# "date", +# "gymnast", +# "passe", +# "rank", +# "repetition", +# "number_of_skill", +# "difficulty", +# ) +# list_filter = ( +# ("gymnast", RelatedDropdownFilter), +# ("date", DropdownFilter), +# ) diff --git a/jarvis/objective/forms.py b/jarvis/objective/forms.py index 4efb751..b271b79 100644 --- a/jarvis/objective/forms.py +++ b/jarvis/objective/forms.py @@ -9,7 +9,7 @@ from .models import ( Skill, Routine, RoutineSkill, - Passe, + # Passe, ) @@ -74,87 +74,87 @@ class CombinationSkillForm(forms.ModelForm): } -class PasseForm(forms.ModelForm): +# class PasseForm(forms.ModelForm): - educatives = forms.ModelMultipleChoiceField( - required=False, - queryset=Educative.objects.all(), - widget=FilteredSelectMultiple("Educatives", is_stacked=False), - # widget=customFilteredSelectMultiple(verbose_name='test2',is_stacked=False) - ) +# educatives = forms.ModelMultipleChoiceField( +# required=False, +# queryset=Educative.objects.all(), +# widget=FilteredSelectMultiple("Educatives", is_stacked=False), +# # widget=customFilteredSelectMultiple(verbose_name='test2',is_stacked=False) +# ) - class Media: - css = { - "all": ["admin/css/widgets.css"], - } - # Adding this javascript is crucial - js = ["/admin/jsi18n/"] +# class Media: +# css = { +# "all": ["admin/css/widgets.css"], +# } +# # Adding this javascript is crucial +# js = ["/admin/jsi18n/"] - class Meta: - model = Passe - fields = ("label", "regexp", "educatives", "informations") +# class Meta: +# model = Passe +# fields = ("label", "regexp", "educatives", "informations") - widgets = { - "label": forms.TextInput( - attrs={ - "class": "form-control", - "placeholder": "Label (not mandatory)", - "maxlength": 30, - } - ), - "regexp": forms.TextInput( - attrs={"class": "form-control", "placeholder": "[2-8]"} - ), - "informations": forms.Textarea( - attrs={ - "class": "form-control", - "placeholder": "Informations about the passe…", # pylint: disable=line-too-long - } - ), - } +# widgets = { +# "label": forms.TextInput( +# attrs={ +# "class": "form-control", +# "placeholder": "Label (not mandatory)", +# "maxlength": 30, +# } +# ), +# "regexp": forms.TextInput( +# attrs={"class": "form-control", "placeholder": "[2-8]"} +# ), +# "informations": forms.Textarea( +# attrs={ +# "class": "form-control", +# "placeholder": "Informations about the passe…", # pylint: disable=line-too-long +# } +# ), +# } - def clean_regexp(self): - """Vérifie que la regexp entrée par l'utilisateur est valide.""" - regexp = self.cleaned_data["regexp"] - if not Passe.is_valid_regexp(regexp): - raise ValidationError("Entered regexp not valid.") +# def clean_regexp(self): +# """Vérifie que la regexp entrée par l'utilisateur est valide.""" +# regexp = self.cleaned_data["regexp"] +# if not Passe.is_valid_regexp(regexp): +# raise ValidationError("Entered regexp not valid.") - return regexp +# return regexp - def clean(self): - """Vérifie le contenu des champs `educatives` par rapport à la valeur de `regexp`. Si - `regexp` est définie par : - - valeurs de ROUTINE_TYPE_CHOICE il faut que Educatives soit VIDE - - avec [x-y] - - [x-y] " Educatives soit NON VIDE - - WC " il y ait 2+ Educatives - - x| " il y ait 1! Educatives - """ - cleaned_data = super().clean() - regexp = ["regexp"] +# def clean(self): +# """Vérifie le contenu des champs `educatives` par rapport à la valeur de `regexp`. Si +# `regexp` est définie par : +# - valeurs de ROUTINE_TYPE_CHOICE il faut que Educatives soit VIDE +# - avec [x-y] +# - [x-y] " Educatives soit NON VIDE +# - WC " il y ait 2+ Educatives +# - x| " il y ait 1! Educatives +# """ +# cleaned_data = super().clean() +# regexp = ["regexp"] - if regexp is not None: - arguments = regexp.split(" ") - educatives = cleaned_data["educatives"] +# if regexp is not None: +# arguments = regexp.split(" ") +# educatives = cleaned_data["educatives"] - if Passe.is_valid_routine_type(arguments[0]) and educatives is not None: - raise ValidationError( - "Educatives must be empty with the entered Regexp." - ) +# if Passe.is_valid_routine_type(arguments[0]) and educatives is not None: +# raise ValidationError( +# "Educatives must be empty with the entered Regexp." +# ) - if Passe.is_valid_subset(arguments[0]) and educatives is None: - raise ValidationError( - "Educatives can't be empty with the entered Regexp." - ) +# if Passe.is_valid_subset(arguments[0]) and educatives is None: +# raise ValidationError( +# "Educatives can't be empty with the entered Regexp." +# ) - if re.match(r"[1-9]+\|", arguments[0]) and len(educatives) != 1: - raise ValidationError( - "One and only one Educatives allowed with the entered Regexp." - ) +# if re.match(r"[1-9]+\|", arguments[0]) and len(educatives) != 1: +# raise ValidationError( +# "One and only one Educatives allowed with the entered Regexp." +# ) - if arguments[0] == "WC" and (educatives is None or len(educatives) < 2): - raise ValidationError( - "At least two Educatives with the entered Regexp." - ) +# if arguments[0] == "WC" and (educatives is None or len(educatives) < 2): +# raise ValidationError( +# "At least two Educatives with the entered Regexp." +# ) - return cleaned_data +# return cleaned_data diff --git a/jarvis/objective/migrations/0022_alter_trainingprogram_unique_together_and_more.py b/jarvis/objective/migrations/0022_alter_trainingprogram_unique_together_and_more.py new file mode 100644 index 0000000..f21f833 --- /dev/null +++ b/jarvis/objective/migrations/0022_alter_trainingprogram_unique_together_and_more.py @@ -0,0 +1,31 @@ +# Generated by Django 4.2 on 2024-03-13 11:38 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ("objective", "0021_alter_passe_educatives"), + ] + + operations = [ + migrations.AlterUniqueTogether( + name="trainingprogram", + unique_together=None, + ), + migrations.RemoveField( + model_name="trainingprogram", + name="gymnast", + ), + migrations.RemoveField( + model_name="trainingprogram", + name="passe", + ), + migrations.DeleteModel( + name="Passe", + ), + migrations.DeleteModel( + name="TrainingProgram", + ), + ] diff --git a/jarvis/objective/models.py b/jarvis/objective/models.py index 714b5c5..eacdd0b 100644 --- a/jarvis/objective/models.py +++ b/jarvis/objective/models.py @@ -466,299 +466,281 @@ class RoutineSkill(models.Model): return f"{self.rank} - {self.routine.short_label} : {self.skill.short_label}" -class Passe(Markdownizable): - """Classe représentant les passages (à faire pendant un entraînement).""" +# class TrainingRound(Markdownizable): +# """Classe représentant les passages (à faire pendant un entraînement).""" - class Meta: - ordering = [ - "label", - ] +# class Meta: +# ordering = [ +# "label", +# ] - label = models.CharField(max_length=30) - educatives = models.ManyToManyField( - Educative, related_name="passes", blank=True, symmetrical=False - ) - regexp = models.CharField(max_length=50, null=True, blank=True) - number_of_skill = models.PositiveSmallIntegerField(default=0) - difficulty = models.DecimalField(max_digits=4, decimal_places=1, default=0.0) - # TODO: number_of_skill doit être calculé correctement dans tous les cas. - - def save(self, *args, **kwargs): - """Sauve les informations de la personne et initialise les champs nettoyés. - On part du principe que self.regexp est correct. - """ - self.difficulty = 0 - self.number_of_skill = 0 - super().save(*args, **kwargs) - # print("Dans le save") - - if self.educatives.count() == 0: - # print("educative is none") - present = False - operation_list = self.regexp.split(" ") - for item in ROUTINE_TYPE_CHOICE: - if item[1] == operation_list[0]: - present = True - break - - if present and len(operation_list) == 2: - # print("present") - content = operation_list[1].replace("[", "").replace("]", "") - ranks = content.split("-") - - if ranks[0] == "": - self.number_of_skill += int(ranks[1]) - elif ranks[1] == "": - self.number_of_skill += (10 - int(ranks[0])) + 1 - else: - self.number_of_skill += (int(ranks[1]) - int(ranks[0])) + 1 - else: - self.number_of_skill += 10 - - else: - for educative in self.educatives.all(): - is_skill = False - try: - educative = Routine.objects.get(pk=educative) - except Routine.DoesNotExist: - educative = Skill.objects.get(pk=educative) - is_skill = True - - if is_skill: - self.difficulty += educative.difficulty - self.number_of_skill += 1 - else: - if self.regexp is not None: - regexp = self.regexp.replace("[", "").replace("]", "") - position = regexp.find("-") - - start = regexp[:position] - if start == "": - start = 0 - else: - start = int(start) - - end = regexp[position + 1 :] - if end == "": - end = educative.jumps.all().count() - else: - end = int(end) - - self.number_of_skill += end - (start - 1) - list_of_skill = educative.skill_links.filter( - rank__gte=start, rank__lte=end - ) - # .aggregate(total=Sum("value")) - tmp_difficulty = 0 - for routine_skill in list_of_skill: - tmp_difficulty += routine_skill.skill.difficulty - self.difficulty += tmp_difficulty - - else: - self.number_of_skill += educative.jumps.all().count() - self.difficulty += educative.difficulty - - super().save(*args, **kwargs) - - def __str__(self): - return f"{self.label} ({self.number_of_skill} | {self.difficulty})" - - @staticmethod - def is_valid_regexp_one_arg(arg): - """Vérifie une regexp avec un paramètre.""" - if arg == "WC": - return True - - if re.match(r"[1-9]+\|", arg): - return True - - if not Passe.is_valid_dot(arg): - return False - - value = arg.replace(".", "") - is_valid_routine = Passe.is_valid_routine_type(value) - - if is_valid_routine: - return True - - return Passe.is_valid_subset(arg) - - @staticmethod - def is_valid_regexp_two_args(arg1, arg2): - """Vérifie une regexp avec deux paramètres.""" - if not Passe.is_valid_dot(arg1): - return False - - value = arg1.replace(".", "") - is_valid_routine = Passe.is_valid_routine_type(value) - - if is_valid_routine: - return Passe.is_valid_subset(arg2) - - return False - - @staticmethod - def is_valid_dot(pattern): - """Reçoit une chaine de caratère et vérifie que si elle contient un point (.), il se trouve - soit à la première position soit à la dernière position. - """ - if len(re.findall("\.", pattern)) > 1: - return False - - if re.search("\.", pattern): - last_place = len(pattern) - 1 - if pattern[0] != "." and pattern[last_place] != ".": - return False - - return True - - @staticmethod - def is_valid_routine_type(routine_type): - """Recoit une chaine de caractère et vérifie si elle est présente dans la liste - ROUTINE_TYPE_CHOICE (Educative vide !) - """ - is_valid = False - for item in ROUTINE_TYPE_CHOICE: - if item[1] == routine_type: - is_valid = True - break - - return is_valid - - @staticmethod - def is_valid_subset(subset): - """Reçoit la description d'un subset sous forme de string et vérifie qu'elle est conforme. - - Format attendu : [X-Y] - X ou Y peuvent être vide mais pas en même temps. - X est un entier >= 2 - Y est un entier >= 2 OU Y > X si X est non vide - - Exemples : - - [2-8] True - - [-5] True - - [3-] True - - [8-2] False - - [4--8] False - - [-] False - - [1-] False - - [-1] False - - [4] False - - [6-6] False - """ - if re.match(r"^\[(([2-9]+\-{1})|([2-9]+\-{1}[2-9]+)|(\-{1}[2-9]+))\]$", subset): - value = subset.replace("[", "").replace("]", "") - ranks = value.split("-") - - if ranks[0] == "" or ranks[1] == "": - return True - - if int(ranks[0]) < int(ranks[1]): - return True - - return False - - @staticmethod - def is_valid_regexp(regexp): - """Vérifie le champ regexp - - Exemples : - - Q1R1 True - - Q1R2 [2-8] True - - Q2R1 [-5] True - - SF [6-] True - - FS [3-7] True - - Q1R1. True - - .Q1R2 True - - Q1R1. [-4] True - - .Q1R2 [4-] True - - .FS [3-7] True - - [2-8] True - - [-5] True - - WC True - - 1| True - """ - argument_list = regexp.split(" ") - - if len(argument_list) >= 3: - return False - - if len(argument_list) == 2: - return Passe.is_valid_regexp_two_args(argument_list[0], argument_list[1]) - else: - return Passe.is_valid_regexp_one_arg(argument_list[0]) - - return False - - -class TrainingProgram(Seasonisable, Markdownizable): - """Classe représentant ????? - - TODO: - - renommer (supprimer/remettre) TrainingProgram en TrainingPasse - - supprimer Seasonisable - - supprimer Markdownizable - - supprimer le champ Gymnast - - supprimer score - - supprimer rank ??? (--> dans la M2M) - - supprimer difficulty ??? (--> dans la M2M) - """ - - class Meta: - verbose_name = "Training Program" - verbose_name_plural = "Trainings Programs" - ordering = [ - "rank", - ] - unique_together = ["date", "gymnast", "rank"] - - gymnast = models.ForeignKey("people.Gymnast", on_delete=models.CASCADE) # TO DELETE - passe = models.ForeignKey(Passe, on_delete=models.CASCADE) - repetition = models.PositiveSmallIntegerField(default=1) - number_of_skill = models.PositiveSmallIntegerField(default=0) - difficulty = models.DecimalField(max_digits=4, decimal_places=1, default=0.0) - rank = models.PositiveSmallIntegerField(default=1) # TO DELETE - score = models.PositiveSmallIntegerField(blank=True, null=True) # TO DELETE - updated_at = models.DateTimeField(auto_now=True) - - def __str__(self): - return ( - f"{self.gymnast} {self.date} - {self.rank} : {self.passe} {self.repetition}" - ) - - def save(self, *args, **kwargs): - """Sauve les informations de la personne et initialise les champs nettoyés.""" - super().save(*args, **kwargs) - self.difficulty = self.passe.difficulty * self.repetition - self.number_of_skill = self.passe.number_of_skill * self.repetition - super().save(*args, **kwargs) - - -# class TrainingPasseLink(models.Model): -# """Modèle M2M entre Training et TrainingPasse.""" - -# training = models.ForeignKey( -# Training, -# on_delete=models.CASCADE, -# default=None, -# related_name="program_passe_links", +# label = models.CharField(max_length=30) +# educatives = models.ManyToManyField( +# Educative, related_name="passes", blank=True, symmetrical=False # ) -# program_passe = models.ForeignKey( -# TrainingPasse, -# on_delete=models.CASCADE, -# default=None, -# related_name="training_links", -# ) -# rank = models.PositiveSmallIntegerField(default=1) +# regexp = models.CharField(max_length=50, null=True, blank=True) # number_of_skill = models.PositiveSmallIntegerField(default=0) # difficulty = models.DecimalField(max_digits=4, decimal_places=1, default=0.0) -# score = models.PositiveSmallIntegerField(blank=True, null=True) +# # TODO: number_of_skill doit être calculé correctement dans tous les cas. + +# def save(self, *args, **kwargs): +# """Sauve les informations de la personne et initialise les champs nettoyés. +# On part du principe que self.regexp est correct. +# """ +# self.difficulty = 0 +# self.number_of_skill = 0 +# super().save(*args, **kwargs) +# # print("Dans le save") + +# if self.educatives.count() == 0: +# # print("educative is none") +# present = False +# operation_list = self.regexp.split(" ") +# for item in ROUTINE_TYPE_CHOICE: +# if item[1] == operation_list[0]: +# present = True +# break + +# if present and len(operation_list) == 2: +# # print("present") +# content = operation_list[1].replace("[", "").replace("]", "") +# ranks = content.split("-") + +# if ranks[0] == "": +# self.number_of_skill += int(ranks[1]) +# elif ranks[1] == "": +# self.number_of_skill += (10 - int(ranks[0])) + 1 +# else: +# self.number_of_skill += (int(ranks[1]) - int(ranks[0])) + 1 +# else: +# self.number_of_skill += 10 + +# else: +# for educative in self.educatives.all(): +# is_skill = False +# try: +# educative = Routine.objects.get(pk=educative) +# except Routine.DoesNotExist: +# educative = Skill.objects.get(pk=educative) +# is_skill = True + +# if is_skill: +# self.difficulty += educative.difficulty +# self.number_of_skill += 1 +# else: +# if self.regexp is not None: +# regexp = self.regexp.replace("[", "").replace("]", "") +# position = regexp.find("-") + +# start = regexp[:position] +# if start == "": +# start = 0 +# else: +# start = int(start) + +# end = regexp[position + 1 :] +# if end == "": +# end = educative.jumps.all().count() +# else: +# end = int(end) + +# self.number_of_skill += end - (start - 1) +# list_of_skill = educative.skill_links.filter( +# rank__gte=start, rank__lte=end +# ) +# # .aggregate(total=Sum("value")) +# tmp_difficulty = 0 +# for routine_skill in list_of_skill: +# tmp_difficulty += routine_skill.skill.difficulty +# self.difficulty += tmp_difficulty + +# else: +# self.number_of_skill += educative.jumps.all().count() +# self.difficulty += educative.difficulty + +# super().save(*args, **kwargs) + +# def __str__(self): +# return f"{self.label} ({self.number_of_skill} | {self.difficulty})" + +# @staticmethod +# def is_valid_regexp_one_arg(arg): +# """Vérifie une regexp avec un paramètre.""" +# if arg == "WC": +# return True + +# if re.match(r"[1-9]+\|", arg): +# return True + +# if not TrainingRound.is_valid_dot(arg): +# return False + +# value = arg.replace(".", "") +# is_valid_routine = TrainingRound.is_valid_routine_type(value) + +# if is_valid_routine: +# return True + +# return TrainingRound.is_valid_subset(arg) + +# @staticmethod +# def is_valid_regexp_two_args(arg1, arg2): +# """Vérifie une regexp avec deux paramètres.""" +# if not TrainingRound.is_valid_dot(arg1): +# return False + +# value = arg1.replace(".", "") +# is_valid_routine = TrainingRound.is_valid_routine_type(value) + +# if is_valid_routine: +# return TrainingRound.is_valid_subset(arg2) + +# return False + +# @staticmethod +# def is_valid_dot(pattern): +# """Reçoit une chaine de caratère et vérifie que si elle contient un point (.), il se trouve +# soit à la première position soit à la dernière position. +# """ +# if len(re.findall("\.", pattern)) > 1: +# return False + +# if re.search("\.", pattern): +# last_place = len(pattern) - 1 +# if pattern[0] != "." and pattern[last_place] != ".": +# return False + +# return True + +# @staticmethod +# def is_valid_routine_type(routine_type): +# """Recoit une chaine de caractère et vérifie si elle est présente dans la liste +# ROUTINE_TYPE_CHOICE (Educative vide !) +# """ +# is_valid = False +# for item in ROUTINE_TYPE_CHOICE: +# if item[1] == routine_type: +# is_valid = True +# break + +# return is_valid + +# @staticmethod +# def is_valid_subset(subset): +# """Reçoit la description d'un subset sous forme de string et vérifie qu'elle est conforme. + +# Format attendu : [X-Y] +# X ou Y peuvent être vide mais pas en même temps. +# X est un entier >= 2 +# Y est un entier >= 2 OU Y > X si X est non vide + +# Exemples : +# - [2-8] True +# - [-5] True +# - [3-] True +# - [8-2] False +# - [4--8] False +# - [-] False +# - [1-] False +# - [-1] False +# - [4] False +# - [6-6] False +# """ +# if re.match(r"^\[(([2-9]+\-{1})|([2-9]+\-{1}[2-9]+)|(\-{1}[2-9]+))\]$", subset): +# value = subset.replace("[", "").replace("]", "") +# ranks = value.split("-") + +# if ranks[0] == "" or ranks[1] == "": +# return True + +# if int(ranks[0]) < int(ranks[1]): +# return True + +# return False + +# @staticmethod +# def is_valid_regexp(regexp): +# """Vérifie le champ regexp + +# Exemples : +# - Q1R1 True +# - Q1R2 [2-8] True +# - Q2R1 [-5] True +# - SF [6-] True +# - FS [3-7] True +# - Q1R1. True +# - .Q1R2 True +# - Q1R1. [-4] True +# - .Q1R2 [4-] True +# - .FS [3-7] True +# - [2-8] True +# - [-5] True +# - WC True +# - 1| True +# """ +# argument_list = regexp.split(" ") + +# if len(argument_list) >= 3: +# return False + +# if len(argument_list) == 2: +# return TrainingRound.is_valid_regexp_two_args( +# argument_list[0], argument_list[1] +# ) +# else: +# return TrainingRound.is_valid_regexp_one_arg(argument_list[0]) + +# return False -# class Training(Seasonisable, Markdownizable): +# class GymnastTraining(Seasonisable, Markdownizable): # """Classe représentant un entraînement.""" +# label = models.CharField() # gymnast = models.ForeignKey("people.Gymnast", on_delete=models.CASCADE) +# training_rounds = models.ManyToManyField( +# TrainingRound, through="GymnastTrainingRound", verbose_name="trainings" +# ) # difficulty = models.DecimalField(max_digits=4, decimal_places=1, default=0.0) # number_of_skill = models.PositiveSmallIntegerField(default=0) # score = models.PositiveSmallIntegerField(default=1) + +# def __str__(self): +# return f"Training on {self.date} for {self.gymnast}: {self.number_of_skill} | {self.difficulty}" + + +# class GymnastTrainingRound(Markdownizable): +# """Classe représentant un passage.""" + +# class Meta: +# verbose_name = "Gymnast Training Round" +# verbose_name_plural = "Gymnast Training Rounds" +# ordering = [ +# "rank", +# ] +# unique_together = ["gymnast_training", "rank"] + +# gymnast_training = models.ForeignKey( +# GymnastTraining, +# on_delete=models.CASCADE, +# related_name="training_rounds", +# ) +# training_round = models.ForeignKey(TrainingRound, on_delete=models.CASCADE) +# repetition = models.PositiveSmallIntegerField(default=1) +# rank = models.PositiveSmallIntegerField(default=1) +# updated_at = models.DateTimeField(auto_now=True) +# number_of_skill = models.PositiveSmallIntegerField(default=0) +# score = models.PositiveSmallIntegerField(blank=True, null=True) +# difficulty = models.DecimalField(max_digits=4, decimal_places=1, default=0.0) + +# def __str__(self): +# return ( +# f"{self.gymnast} {self.date} - {self.rank} : {self.passe} {self.repetition}" +# ) + +# def save(self, *args, **kwargs): +# """Sauve les informations de la personne et initialise les champs nettoyés.""" +# super().save(*args, **kwargs) +# self.difficulty = self.round.difficulty * self.repetition +# self.number_of_skill = self.round.number_of_skill * self.repetition +# super().save(*args, **kwargs) diff --git a/jarvis/objective/urls.py b/jarvis/objective/urls.py index d3c550e..93492a3 100644 --- a/jarvis/objective/urls.py +++ b/jarvis/objective/urls.py @@ -92,33 +92,33 @@ urlpatterns = [ # # PASSES # - path( - r"passe//gymnast//date//", - views.passe_details, - name="passe_details", - ), - path(r"passe/", views.passe_listing, name="passe_listing"), - path( - r"passe/add/", - views.passe_create_or_update, - name="passe_create", - ), - path( - r"passe/edit//", - views.passe_create_or_update, - name="passe_update", - ), + # path( + # r"passe//gymnast//date//", + # views.passe_details, + # name="passe_details", + # ), + # path(r"passe/", views.passe_listing, name="passe_listing"), + # path( + # r"passe/add/", + # views.passe_create_or_update, + # name="passe_create", + # ), + # path( + # r"passe/edit//", + # views.passe_create_or_update, + # name="passe_update", + # ), # # TRAININGPROGRAM # - path( - r"trainingprogram/detail/date//gymnast//", - views.trainingprogram_details, - name="trainingprogram_details", - ), - path( - r"trainingprogram/switch_trainingprogram_line/", - views.switch_trainingprogram_line, - name="switch_trainingprogram_line", - ), + # path( + # r"trainingprogram/detail/date//gymnast//", + # views.trainingprogram_details, + # name="trainingprogram_details", + # ), + # path( + # r"trainingprogram/switch_trainingprogram_line/", + # views.switch_trainingprogram_line, + # name="switch_trainingprogram_line", + # ), ] diff --git a/jarvis/objective/views.py b/jarvis/objective/views.py index c0824ea..7e91f5b 100644 --- a/jarvis/objective/views.py +++ b/jarvis/objective/views.py @@ -13,17 +13,17 @@ from jarvis.followup.models import GymnastHasRoutine from .forms import ( SkillForm, - PasseForm, + # PasseForm, CombinationForm, CombinationSkillForm, ) from .models import ( Skill, - Passe, + # Passe, Routine, Educative, RoutineSkill, - TrainingProgram, + # TrainingProgram, PrerequisiteClosure, ) @@ -512,189 +512,189 @@ def unlink_skill_from_combination(request): return HttpResponse(200) -@login_required -@require_http_methods(["GET"]) -def passe_listing(request): - """Liste des passages.""" - passe_listing = Passe.objects.all() - context = {"passe_listing": passe_listing} - return render(request, "passes/list.html", context) +# @login_required +# @require_http_methods(["GET"]) +# def passe_listing(request): +# """Liste des passages.""" +# passe_listing = Passe.objects.all() +# context = {"passe_listing": passe_listing} +# return render(request, "passes/list.html", context) -@login_required -@require_http_methods(["GET"]) -def passe_details(request, passe_id, gymnast_id, date): - """Détails d'un passage.""" +# @login_required +# @require_http_methods(["GET"]) +# def passe_details(request, passe_id, gymnast_id, date): +# """Détails d'un passage.""" - is_skill = False - passe = get_object_or_404(Passe, pk=passe_id) - educative_list = passe.educatives.all() - # TODO: décryptage de la regexp - regexp = passe.regexp - routine = None - skill_link_list = None +# is_skill = False +# passe = get_object_or_404(Passe, pk=passe_id) +# educative_list = passe.educatives.all() +# # TODO: décryptage de la regexp +# regexp = passe.regexp +# routine = None +# skill_link_list = None - if regexp is not None: - operation_list = regexp.split(" ") - routine_type = None +# if regexp is not None: +# operation_list = regexp.split(" ") +# routine_type = None - for item in ROUTINE_TYPE_CHOICE: - if item[1] == operation_list[0]: - routine_type = item[0] - break +# for item in ROUTINE_TYPE_CHOICE: +# if item[1] == operation_list[0]: +# routine_type = item[0] +# break - if routine_type is not None: - # Récupération de la série - ghr = GymnastHasRoutine.objects.filter( - gymnast=gymnast_id, - date_begin__lte=date, - # date_end__gte=date, - routine_type=routine_type, - ) +# if routine_type is not None: +# # Récupération de la série +# ghr = GymnastHasRoutine.objects.filter( +# gymnast=gymnast_id, +# date_begin__lte=date, +# # date_end__gte=date, +# routine_type=routine_type, +# ) - print(ghr.query) +# print(ghr.query) - if ghr.count() > 1: - print("Plus d'une série trouvée...") +# if ghr.count() > 1: +# print("Plus d'une série trouvée...") - print(ghr) +# print(ghr) - routine = ghr.first().routine - skill_link_list = routine.skill_links.all() - if len(operation_list) == 2: - content = operation_list[1].replace("[", "").replace("]", "") - ranks = content.split("-") +# routine = ghr.first().routine +# skill_link_list = routine.skill_links.all() +# if len(operation_list) == 2: +# content = operation_list[1].replace("[", "").replace("]", "") +# ranks = content.split("-") - if ranks[0] != "": - skill_link_list = skill_link_list.filter(rank__gte=ranks[0]) +# if ranks[0] != "": +# skill_link_list = skill_link_list.filter(rank__gte=ranks[0]) - if ranks[1] != "": - skill_link_list = skill_link_list.filter(rank__lte=ranks[1]) +# if ranks[1] != "": +# skill_link_list = skill_link_list.filter(rank__lte=ranks[1]) - number_of_educative = skill_link_list.count() - print(number_of_educative) +# number_of_educative = skill_link_list.count() +# print(number_of_educative) - else: - number_of_educative = educative_list.count() +# else: +# number_of_educative = educative_list.count() - context = { - "passe": passe, - "is_skill": is_skill, - "educative_list": educative_list, - "routine": routine, - "skill_link_list": skill_link_list, - "difficulty": passe.difficulty, - "number_of_skill": passe.number_of_skill, - "number_of_educative": number_of_educative, - } - return render(request, "passes/details.html", context) +# context = { +# "passe": passe, +# "is_skill": is_skill, +# "educative_list": educative_list, +# "routine": routine, +# "skill_link_list": skill_link_list, +# "difficulty": passe.difficulty, +# "number_of_skill": passe.number_of_skill, +# "number_of_educative": number_of_educative, +# } +# return render(request, "passes/details.html", context) -@login_required -@require_http_methods(["GET", "POST"]) -def passe_create_or_update(request, passe_id=None): - """Création d'un passage. +# @login_required +# @require_http_methods(["GET", "POST"]) +# def passe_create_or_update(request, passe_id=None): +# """Création d'un passage. - Args: - passe_id (int) identifiant d'un object de classe . - """ - if passe_id: - passe = get_object_or_404(Passe, pk=passe_id) - else: - passe = None +# Args: +# passe_id (int) identifiant d'un object de classe . +# """ +# if passe_id: +# passe = get_object_or_404(Passe, pk=passe_id) +# else: +# passe = None - if request.method == "POST": - form = PasseForm(request.POST, instance=passe) +# if request.method == "POST": +# form = PasseForm(request.POST, instance=passe) - if form.is_valid(): - passe = form.save() - return HttpResponseRedirect(reverse("passe_details", args=(passe.pk,))) +# if form.is_valid(): +# passe = form.save() +# return HttpResponseRedirect(reverse("passe_details", args=(passe.pk,))) - return render(request, "passes/create.html", {"form": form}) +# return render(request, "passes/create.html", {"form": form}) - form = PasseForm(instance=passe) - context = {"form": form, "passe_id": passe_id} - return render(request, "passes/create.html", context) +# form = PasseForm(instance=passe) +# context = {"form": form, "passe_id": passe_id} +# return render(request, "passes/create.html", context) -@login_required -@require_http_methods(["GET"]) -def trainingprogram_details(request, date=None, gymnast_id=None): - """Détails d'un entraînement.""" +# @login_required +# @require_http_methods(["GET"]) +# def trainingprogram_details(request, date=None, gymnast_id=None): +# """Détails d'un entraînement.""" - gymnast = None - trainingprogram_id = None - if trainingprogram_id is not None: - trainingprogram = get_object_or_404(TrainingProgram, pk=trainingprogram_id) - trainingprogram_list = None - else: - trainingprogram = None - trainingprogram_list = TrainingProgram.objects.all() - parsed_date = pendulum.parse(date).date() - if date is not None: - trainingprogram_list = trainingprogram_list.filter(date=parsed_date) +# gymnast = None +# trainingprogram_id = None +# if trainingprogram_id is not None: +# trainingprogram = get_object_or_404(TrainingProgram, pk=trainingprogram_id) +# trainingprogram_list = None +# else: +# trainingprogram = None +# trainingprogram_list = TrainingProgram.objects.all() +# parsed_date = pendulum.parse(date).date() +# if date is not None: +# trainingprogram_list = trainingprogram_list.filter(date=parsed_date) - if gymnast_id is not None: - gymnast = get_object_or_404(Gymnast, pk=gymnast_id) - trainingprogram_list = trainingprogram_list.filter(gymnast=gymnast_id) +# if gymnast_id is not None: +# gymnast = get_object_or_404(Gymnast, pk=gymnast_id) +# trainingprogram_list = trainingprogram_list.filter(gymnast=gymnast_id) - difficulty = 0 - number_of_skill = 0 - for trainingprogram in trainingprogram_list: - difficulty += trainingprogram.difficulty - number_of_skill += trainingprogram.number_of_skill +# difficulty = 0 +# number_of_skill = 0 +# for trainingprogram in trainingprogram_list: +# difficulty += trainingprogram.difficulty +# number_of_skill += trainingprogram.number_of_skill - context = { - "gymnast": gymnast, - "date": parsed_date, - "difficulty": difficulty, - "number_of_skill": number_of_skill, - "trainingprogram": trainingprogram, - "trainingprogram_list": trainingprogram_list, - } - return render(request, "trainingprograms/details.html", context) +# context = { +# "gymnast": gymnast, +# "date": parsed_date, +# "difficulty": difficulty, +# "number_of_skill": number_of_skill, +# "trainingprogram": trainingprogram, +# "trainingprogram_list": trainingprogram_list, +# } +# return render(request, "trainingprograms/details.html", context) -@require_http_methods(["POST"]) -def switch_trainingprogram_line(request): - """ - Recoit dans request deux identifiants de trainingprogram qu'il faut échanger () : - - tp_id (int) identifiant d'une instance de TraiingProgram - - direction (str) la direction du changement (0: haut, 1: bas) +# @require_http_methods(["POST"]) +# def switch_trainingprogram_line(request): +# """ +# Recoit dans request deux identifiants de trainingprogram qu'il faut échanger () : +# - tp_id (int) identifiant d'une instance de TraiingProgram +# - direction (str) la direction du changement (0: haut, 1: bas) - J'utilise `32767` comme valeur intermédiaire pour le `rank` car c'est la limite supérieure d'un - PositiveSmallIntegerField. - """ - try: - target_trainingprogram_id = request.POST.get("tpid", None) - direction = int(request.POST.get("direction", 0)) +# J'utilise `32767` comme valeur intermédiaire pour le `rank` car c'est la limite supérieure d'un +# PositiveSmallIntegerField. +# """ +# try: +# target_trainingprogram_id = request.POST.get("tpid", None) +# direction = int(request.POST.get("direction", 0)) - target_trainingprogram = get_object_or_404( - TrainingProgram, pk=target_trainingprogram_id - ) +# target_trainingprogram = get_object_or_404( +# TrainingProgram, pk=target_trainingprogram_id +# ) - if direction == 0: - source_trainingprogram = ( - TrainingProgram.objects.filter(rank__lt=target_trainingprogram.rank) - .order_by("-id") - .first() - ) - else: - source_trainingprogram = ( - TrainingProgram.objects.filter(rank__gt=target_trainingprogram.rank) - .order_by("id") - .first() - ) +# if direction == 0: +# source_trainingprogram = ( +# TrainingProgram.objects.filter(rank__lt=target_trainingprogram.rank) +# .order_by("-id") +# .first() +# ) +# else: +# source_trainingprogram = ( +# TrainingProgram.objects.filter(rank__gt=target_trainingprogram.rank) +# .order_by("id") +# .first() +# ) - saved_source_rank = source_trainingprogram.rank - saved_target_rank = target_trainingprogram.rank - source_trainingprogram.rank = 32767 - source_trainingprogram.save() - target_trainingprogram.rank = saved_source_rank - target_trainingprogram.save() - source_trainingprogram.rank = saved_target_rank - source_trainingprogram.save() +# saved_source_rank = source_trainingprogram.rank +# saved_target_rank = target_trainingprogram.rank +# source_trainingprogram.rank = 32767 +# source_trainingprogram.save() +# target_trainingprogram.rank = saved_source_rank +# target_trainingprogram.save() +# source_trainingprogram.rank = saved_target_rank +# source_trainingprogram.save() - return HttpResponse(200) - except Exception: - return HttpResponse(409) +# return HttpResponse(200) +# except Exception: +# return HttpResponse(409) diff --git a/jarvis/people/migrations/0012_alter_gymnast_options.py b/jarvis/people/migrations/0012_alter_gymnast_options.py new file mode 100644 index 0000000..485648a --- /dev/null +++ b/jarvis/people/migrations/0012_alter_gymnast_options.py @@ -0,0 +1,21 @@ +# Generated by Django 4.2 on 2024-03-13 11:38 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ("people", "0011_gymnast_trainers"), + ] + + operations = [ + migrations.AlterModelOptions( + name="gymnast", + options={ + "ordering": ["first_name", "last_name"], + "verbose_name": "Gymnast", + "verbose_name_plural": "Gymnasts", + }, + ), + ] diff --git a/jarvis/people/views.py b/jarvis/people/views.py index dee4fcc..87be0d3 100644 --- a/jarvis/people/views.py +++ b/jarvis/people/views.py @@ -20,7 +20,8 @@ import pendulum from jarvis.followup.models import Event from jarvis.followup.forms import GymnastHasRoutineForm -from jarvis.objective.models import TrainingProgram + +# from jarvis.objective.models import TrainingProgram from jarvis.followup.models import ( Note, Plan, @@ -257,12 +258,12 @@ def gymnast_display_scores_chrono(request, gymnast_id): ).order_by("date") base_queryset = chrono_list.values("date").annotate(score_avg=Avg("tof")) today = pendulum.now().date() - date_list = ( - TrainingProgram.objects.filter(gymnast=gymnast_id, date__gte=today) - .values_list("date", flat=True) - .order_by("date") - .distinct() - ) + # date_list = ( + # TrainingProgram.objects.filter(gymnast=gymnast_id, date__gte=today) + # .values_list("date", flat=True) + # .order_by("date") + # .distinct() + # ) context = { "intensity_list": intensity_list, @@ -271,7 +272,7 @@ def gymnast_display_scores_chrono(request, gymnast_id): "chrono_r1": base_queryset.filter(chrono_type=1), "chrono_r2": base_queryset.filter(chrono_type=2), "chrono_rf": base_queryset.filter(chrono_type=3), - "date_list": date_list, + # "date_list": date_list, "gymnast_id": gymnast_id, } return render(request, "gymnasts/tabs/tab_intensity_and_chronos.html", context)