diff --git a/jarvis/core/templates/base.html b/jarvis/core/templates/base.html index bbc33ef..48e7e97 100644 --- a/jarvis/core/templates/base.html +++ b/jarvis/core/templates/base.html @@ -87,7 +87,7 @@ {% submenuitem 'competition_routine_listing' 'CR' 'Competition Routine' %} {% submenuitem 'routine_listing' 'R' 'Routine' %} {% submenuitem 'educative_combination_listing' 'E' 'Educative' %} - {% submenuitem 'combination_list' 'C' 'Combination' %} + {% submenuitem 'combination_listing' 'C' 'Combination' %} diff --git a/jarvis/objective/admin.py b/jarvis/objective/admin.py index 96fb0bd..a0aaf96 100644 --- a/jarvis/objective/admin.py +++ b/jarvis/objective/admin.py @@ -12,6 +12,7 @@ from .models import ( Passe, Routine, RoutineSkill, + TrainingProgram, PrerequisiteClosure, ) @@ -191,7 +192,30 @@ class PrerequisiteClosureAdmin(admin.ModelAdmin): class PasseAdmin(admin.ModelAdmin): model = Passe - list_display = ("label", "repetition") + fields = ( + "label", + "educatives", + "regexp", + "number_of_skill", + "difficulty", + "informations", + ) + + list_display = ("label", "number_of_skill", "difficulty") + list_filter = ( + ("number_of_skill", DropdownFilter), + ("difficulty", DropdownFilter), + ) + + +class TrainingProgramAdmin(admin.ModelAdmin): + model = TrainingProgram + + list_display = ("date", "gymnast", "passe", "rank") + list_filter = ( + ("gymnast", RelatedDropdownFilter), + ("date", DropdownFilter), + ) admin.site.register(Skill, SkillAdmin) @@ -199,4 +223,5 @@ admin.site.register(Passe, PasseAdmin) admin.site.register(Routine, RoutineAdmin) admin.site.register(RoutineSkill, RoutineSkillAdmin) admin.site.register(TouchPosition, TouchPositionAdmin) +admin.site.register(TrainingProgram, TrainingProgramAdmin) admin.site.register(PrerequisiteClosure, PrerequisiteClosureAdmin) diff --git a/jarvis/objective/forms.py b/jarvis/objective/forms.py index 0e26731..5f72522 100644 --- a/jarvis/objective/forms.py +++ b/jarvis/objective/forms.py @@ -69,7 +69,7 @@ class CombinationSkillForm(forms.ModelForm): class PasseForm(forms.ModelForm): class Meta: model = Passe - fields = ("label", "educative", "repetition", "regexp", "informations") + fields = ("label", "educatives", "regexp", "informations") widgets = { "label": forms.TextInput( attrs={ @@ -78,15 +78,6 @@ class PasseForm(forms.ModelForm): "maxlength": 30, } ), - "repetition": forms.NumberInput( - attrs={ - "class": "form-control", - "placeholder": "x", - "min": "0", - "max": "1000", - "step": "1", - } - ), "regexp": forms.TextInput( attrs={"class": "form-control", "placeholder": "[2-8]"} ), @@ -96,7 +87,7 @@ class PasseForm(forms.ModelForm): "placeholder": "Informations about the passe…", # pylint: disable=line-too-long } ), - "educative": forms.HiddenInput(), + "educatives": forms.HiddenInput(), } educative_related = forms.CharField( @@ -109,3 +100,13 @@ class PasseForm(forms.ModelForm): } ), ) + + # "repetition": forms.NumberInput( + # attrs={ + # "class": "form-control", + # "placeholder": "x", + # "min": "0", + # "max": "1000", + # "step": "1", + # } + # ), diff --git a/jarvis/objective/migrations/0017_passe.py b/jarvis/objective/migrations/0017_passe.py deleted file mode 100644 index 1b0ef98..0000000 --- a/jarvis/objective/migrations/0017_passe.py +++ /dev/null @@ -1,52 +0,0 @@ -# Generated by Django 4.2 on 2024-02-25 18:38 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ("objective", "0016_routine_is_routine"), - ] - - operations = [ - migrations.CreateModel( - name="Passe", - fields=[ - ( - "id", - models.BigAutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ( - "informations", - models.TextField( - blank=True, - help_text="Only MarkDown is authorized", - null=True, - verbose_name="Comments", - ), - ), - ("label", models.CharField(blank=True, max_length=30, null=True)), - ("repetition", models.PositiveSmallIntegerField(default=1)), - ("regexp", models.CharField(blank=True, max_length=50, null=True)), - ("number_of_skill", models.PositiveSmallIntegerField()), - ("difficulty", models.DecimalField(decimal_places=1, max_digits=4)), - ( - "educative", - models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - to="objective.educative", - ), - ), - ], - options={ - "abstract": False, - }, - ), - ] diff --git a/jarvis/objective/models.py b/jarvis/objective/models.py index 0ca9d7d..a09fee6 100644 --- a/jarvis/objective/models.py +++ b/jarvis/objective/models.py @@ -1,7 +1,11 @@ from django.db import models from django.db.models import Q -from jarvis.tools.models import Markdownizable, max_even_if_none +from jarvis.tools.models import ( + Markdownizable, + Seasonisable, + max_even_if_none, +) class Educative(Markdownizable): @@ -462,67 +466,80 @@ class Passe(Markdownizable): """Classe représentant les passages (à faire pendant un entraînement).""" label = models.CharField(max_length=30, null=True, blank=True) - # educative = models.ManyToManyField(Educative, on_delete=models.CASCADE) - educative = models.ForeignKey(Educative, on_delete=models.CASCADE) - repetition = models.PositiveSmallIntegerField(default=1) + educatives = models.ManyToManyField(Educative) regexp = models.CharField(max_length=50, null=True, blank=True) - number_of_skill = models.PositiveSmallIntegerField() - difficulty = models.DecimalField(max_digits=4, decimal_places=1) + number_of_skill = models.PositiveSmallIntegerField(default=0) + difficulty = models.DecimalField(max_digits=4, decimal_places=1, default=0.0) def save(self, *args, **kwargs): """Sauve les informations de la personne et initialise les champs nettoyés.""" - is_skill = False - try: - educative = Routine.objects.get(pk=self.educative) - except Routine.DoesNotExist: - educative = Skill.objects.get(pk=self.educative) - is_skill = True + self.difficulty = 0 + self.number_of_skill = 1 + super().save(*args, **kwargs) - if is_skill: - self.number_of_skill = self.repetition - self.difficulty = educative.difficulty * self.repetition - 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)) * self.repetition - list_of_skill = educative.skill_links.filter( - rank__gte=start, rank__lte=end - ) - # .aggregate(total=Sum("value")) - self.difficulty = 0 - for routine_skill in list_of_skill: - self.difficulty += routine_skill.skill.difficulty - self.difficulty *= self.repetition + 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 else: - self.number_of_skill = educative.jumps.all().count() * self.repetition - self.difficulty = educative.difficulty * self.repetition + 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): if self.label: - return f"{self.label} {self.repetition}" + return f"{self.label} ({self.number_of_skill} | {self.difficulty})" else: - return f"- {self.repetition}" + return f"- ({self.number_of_skill} | {self.difficulty})" -# class TrainingProgram(models.Model): -# """Classe représentant un entraînement (ensemble de passage)""" +class TrainingProgram(Seasonisable): + """Classe représentant un entraînement (ensemble de passage).""" -# date = models.DateField() -# passe = models.ForeignKey(Passe, on_delete=models.SET_NULL) -# rank = models.PositiveIntegerField() + gymnast = models.ForeignKey("people.Gymnast", on_delete=models.CASCADE) + 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) + score = models.PositiveSmallIntegerField(blank=True, null=True) + updated_at = models.DateTimeField(auto_now=True) + + def __str__(self): + return ( + f"{self.gymnast} {self.date} - {self.rank} : {self.passe} {self.repetition}" + ) diff --git a/jarvis/objective/templates/combinations/details.html b/jarvis/objective/templates/combinations/details.html index f86d6c9..103028b 100644 --- a/jarvis/objective/templates/combinations/details.html +++ b/jarvis/objective/templates/combinations/details.html @@ -69,7 +69,7 @@