[WIP] refactoring
This commit is contained in:
parent
a798507754
commit
23e00ef131
|
@ -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' %}
|
||||
</ul>
|
||||
</div>
|
||||
</li>
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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",
|
||||
# }
|
||||
# ),
|
||||
|
|
|
@ -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,
|
||||
},
|
||||
),
|
||||
]
|
|
@ -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}"
|
||||
)
|
||||
|
|
|
@ -69,7 +69,7 @@
|
|||
|
||||
<div class="card-footer row pt-0">
|
||||
<div class="col-6">
|
||||
<a href="{% url 'routine_listing' %}">
|
||||
<a href="{% url 'combination_listing' %}">
|
||||
<button type="submit" value="add" class="btn btn-icon btn-warning ">
|
||||
<i class="tim-icons icon-double-left"></i>
|
||||
</button>
|
||||
|
|
|
@ -9,10 +9,11 @@
|
|||
<div class="card">
|
||||
<div class="card-body">
|
||||
<b><u>Label :</b></u> {{ passe.label }}<br />
|
||||
<b><u>Educatif :</b></u> {{ passe.educative }}<br />
|
||||
<b><u>Content :</b></u> {% for educative in passe.educative.all %}{{ educative }}{% if not forloop.last %} & {% endif %}{% endfor %}<br />
|
||||
<b><u>Répétition :</b></u> {{ passe.repetition }}<br />
|
||||
<b><u>RegExp :</b></u> {{ passe.regexp }}<br /><br />
|
||||
<a href="{% url 'combination_details' passe.educative.id %}">{{ passe.label }}{% if passe.regexp %}{{ passe.regexp }}{% endif %}</a> {{ passe.repetition }}<br /><br />
|
||||
{% if passe.regexp %}<b><u>RegExp :</b></u> {{ passe.regexp }}<br />{% endif %}
|
||||
<br />
|
||||
<a href="#">{{ passe.label }}{% if passe.regexp %}{{ passe.regexp }}{% endif %}</a> {{ passe.repetition }}<br /><br />
|
||||
{{ number_of_skill }} - {{ difficulty }}
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -83,7 +83,7 @@ urlpatterns = [
|
|||
views.competition_routine_listing,
|
||||
name="competition_routine_listing",
|
||||
),
|
||||
path(r"combination/", views.combination_listing, name="combination_list"),
|
||||
path(r"combination/", views.combination_listing, name="combination_listing"),
|
||||
#
|
||||
# PASSES
|
||||
#
|
||||
|
@ -99,4 +99,12 @@ urlpatterns = [
|
|||
views.passe_create_or_update,
|
||||
name="passe_update",
|
||||
),
|
||||
#
|
||||
# TRAININGPROGRAM
|
||||
#
|
||||
path(
|
||||
r"trainingprogram/detail/date/<str:date>/gymnast/<int:gymnast_id>/",
|
||||
views.trainingprogram_details,
|
||||
name="trainingprogram_details",
|
||||
),
|
||||
]
|
||||
|
|
|
@ -19,6 +19,7 @@ from .models import (
|
|||
Routine,
|
||||
Educative,
|
||||
RoutineSkill,
|
||||
TrainingProgram,
|
||||
PrerequisiteClosure,
|
||||
)
|
||||
|
||||
|
@ -510,53 +511,18 @@ def passe_listing(request):
|
|||
def passe_details(request, passe_id):
|
||||
"""Détails d'un passage."""
|
||||
|
||||
is_skill = False
|
||||
passe = get_object_or_404(Passe, pk=passe_id)
|
||||
|
||||
try:
|
||||
educative = Routine.objects.get(pk=passe.educative)
|
||||
is_skill = False
|
||||
except Routine.DoesNotExist:
|
||||
educative = Skill.objects.get(pk=passe.educative)
|
||||
is_skill = True
|
||||
|
||||
if is_skill:
|
||||
number_of_skill = passe.repetition
|
||||
difficulty = educative.difficulty * passe.repetition
|
||||
else:
|
||||
if passe.regexp is not None:
|
||||
regexp = passe.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)
|
||||
|
||||
number_of_skill = (end - (start - 1)) * passe.repetition
|
||||
list_of_skill = educative.skill_links.filter(rank__gte=start, rank__lte=end)
|
||||
# .aggregate(total=Sum("value"))
|
||||
difficulty = 0
|
||||
for routine_skill in list_of_skill:
|
||||
difficulty += routine_skill.skill.difficulty
|
||||
difficulty *= passe.repetition
|
||||
|
||||
else:
|
||||
number_of_skill = educative.jumps.all().count() * passe.repetition
|
||||
difficulty = educative.difficulty * passe.repetition
|
||||
educative_list = passe.educatives.all()
|
||||
number_of_educative = educative_list.count()
|
||||
|
||||
context = {
|
||||
"passe": passe,
|
||||
"is_skill": is_skill,
|
||||
"educative": educative,
|
||||
"difficulty": difficulty,
|
||||
"number_of_skill": number_of_skill,
|
||||
"educative_list": educative_list,
|
||||
"difficulty": passe.difficulty,
|
||||
"number_of_skill": passe.number_of_skill,
|
||||
"number_of_educative": number_of_educative,
|
||||
}
|
||||
return render(request, "passes/details.html", context)
|
||||
|
||||
|
@ -586,3 +552,27 @@ def passe_create_or_update(request, passe_id=None):
|
|||
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."""
|
||||
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()
|
||||
if date is not None:
|
||||
trainingprogram_list = trainingprogram_list.filter(date=date)
|
||||
|
||||
if gymnast_id is not None:
|
||||
trainingprogram_list = trainingprogram_list.filter(gymnast=gymnast_id)
|
||||
|
||||
context = {
|
||||
"trainingprogram": trainingprogram,
|
||||
"trainingprogram_list": trainingprogram_list,
|
||||
}
|
||||
return render(request, "trainingprograms/details.html", context)
|
||||
|
|
Loading…
Reference in New Issue