From bbedfb6b52685be5a047a04320a41fe899c68d78 Mon Sep 17 00:00:00 2001 From: Gregory Trullemans Date: Fri, 2 Feb 2024 11:44:53 +0100 Subject: [PATCH] =?UTF-8?q?Remove=20unused=20method,=20change=20average=20?= =?UTF-8?q?quality,=20=E2=80=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jarvis/followup/models.py | 118 +++++- jarvis/followup/templates/chronos/create.html | 8 +- .../templates/intensities/details.html | 30 +- .../followup/templates/intensities/list.html | 2 +- jarvis/people/templates/gymnasts/details.html | 2 +- .../gymnasts/tabs/tab_physiological.html | 388 ------------------ .../tabs/tab_routines_and_routine_stats.html | 6 +- jarvis/people/urls.py | 20 +- jarvis/people/views.py | 63 +-- 9 files changed, 167 insertions(+), 470 deletions(-) delete mode 100644 jarvis/people/templates/gymnasts/tabs/tab_physiological.html diff --git a/jarvis/followup/models.py b/jarvis/followup/models.py index 5d335d0..4a962ed 100644 --- a/jarvis/followup/models.py +++ b/jarvis/followup/models.py @@ -563,17 +563,14 @@ class Intensity(Markdownizable, Seasonisable): - qualité du nombre de passage - qualité moyenne - Elle va également calculer 6 statistiques : - - la difficulté moyenne par passage (diff/pass) - - la difficulté moyenne par figure (diff/skill) - - la quantité moyenne de figures par passage (skill/pass) - - la quantité moyenne de figure par minute (skill/time) - - le temps moyen par passage (time/pass) - - le temps moyen par figure (time/skill) - - TODO: - - trouver un calcul d'efficacité qui tienne compte des dépassements (100%+) - - trouver un calcul d'efficacité qui tienne compte des statistiques (notamment le temps par passage) + Elle va également calculer 6 statistiques (et/ou leur corollaire) : + - la difficulté moyenne par minute (d/T) + - la quantité moyenne de figure par minute (S/T) + - le temps moyen par passage (T/p) + - le temps moyen par figure (T/S) (corollaire de la 2ème) + - la difficulté moyenne par passage (d/p) + - la difficulté moyenne par figure (d/S) + - la quantité moyenne de figures par passage (S/p) """ class Meta: @@ -601,6 +598,7 @@ class Intensity(Markdownizable, Seasonisable): def __str__(self): return f"{self.gymnast} - {self.date} : {self.time} - {self.difficulty} - {self.quantity_of_skill} - {self.number_of_passes}" # pylint: disable=line-too-long + # Quality @property def time_quality(self): return (self.time / self.theorical_time) * 100 @@ -619,6 +617,55 @@ class Intensity(Markdownizable, Seasonisable): @property def average_quality(self): + """ + Calcul de la qualité d'un entrainement sur base des 4 données pratiques encodées : Temps, + # de passage, # de saut et Difficulté. + + Si les 4 données pratiques sont inférieures ou égales aux données théoriques, une moyenne + pondérée (D*4, p*3, S*2 et T) est calculée. + Si une (ou plusieurs) données pratiques sont supérieures aux données théorique... ? + Pour les cas non traités, une moyenne arithmétique est calculée. + + TODO: + - trouver un calcul d'efficacité qui tienne compte des statistiques (notamment le temps par passage) + """ + + # Si les 4 données pratiques sont inférieures ou égales aux données théoriques, une moyenne + # pondérée (D*4, p*3, S*2 et T) est calculée. + if ( + self.time <= self.theorical_time + and self.number_of_passes <= self.number_of_passes_asked + and self.difficulty <= self.difficulty_asked + and self.quantity_of_skill <= self.quantity_of_skill_asked + ): + return ( + self.time_quality + + (self.quantity_of_skill_quality * 2) + + (self.number_of_passes_quality * 3) + + (self.difficulty_quality * 4) + ) / 10 + + # if self.difficulty > self.difficulty_asked: + # if ( + # self.time <= self.theorical_time + # and self.number_of_passes <= self.number_of_passes_asked + # and self.quantity_of_skill <= self.quantity_of_skill_asked + # ): + # return self.difficulty_quality + + if ( + self.time <= self.theorical_time + and self.number_of_passes <= self.number_of_passes_asked + ): + if ( + self.difficulty >= self.difficulty_asked + and self.quantity_of_skill >= self.quantity_of_skill_asked + ): + return ( + (self.difficulty_quality * 2) + self.quantity_of_skill_quality + ) / 3 + + # Pour les cas non traités, une moyenne arithmétique est calculée. return ( self.time_quality + self.difficulty_quality @@ -626,6 +673,32 @@ class Intensity(Markdownizable, Seasonisable): + self.number_of_passes_quality ) / 4 + # Theorical statistics + @property + def mean_time_by_passe_theorical(self): + return self.theorical_time / self.number_of_passes_asked + + @property + def mean_quantity_of_skill_by_time_theorical(self): + return self.quantity_of_skill_asked / self.theorical_time + + @property + def mean_time_by_skill_theorical(self): + return self.theorical_time / self.quantity_of_skill_asked + + @property + def mean_difficulty_by_passe_theorical(self): + return self.difficulty_asked / self.number_of_passes_asked + + @property + def mean_quantity_of_skill_by_passe_theorical(self): + return self.quantity_of_skill_asked / self.number_of_passes_asked + + @property + def mean_difficulty_by_skill_theorical(self): + return self.difficulty_asked / self.quantity_of_skill_asked + + # Real statistics @property def mean_time_by_passe(self): return self.time / self.number_of_passes @@ -634,28 +707,20 @@ class Intensity(Markdownizable, Seasonisable): def mean_time_by_skill(self): return self.time / self.quantity_of_skill - @property - def difficulty_in_unit(self): - return self.difficulty / 10 - - @property - def difficulty_asked_in_unit(self): - return self.difficulty_asked / 10 - @property def mean_difficulty_by_passe(self): return self.difficulty / self.number_of_passes @property def mean_difficulty_by_passe_in_unit(self): - return (self.difficulty / 10) / self.number_of_passes + return self.mean_difficulty_by_passe / 10 @property def mean_quantity_of_skill_by_time(self): return self.quantity_of_skill / self.time @property - def quantity_of_skill_by_passe(self): + def mean_quantity_of_skill_by_passe(self): return self.quantity_of_skill / self.number_of_passes @property @@ -664,7 +729,16 @@ class Intensity(Markdownizable, Seasonisable): @property def mean_difficulty_by_skill_in_unit(self): - return (self.difficulty / 10) / self.quantity_of_skill + return self.mean_difficulty_by_skill / 10 + + # Human readeable scores + @property + def difficulty_in_unit(self): + return self.difficulty / 10 + + @property + def difficulty_asked_in_unit(self): + return self.difficulty_asked / 10 class SeasonInformation(models.Model): diff --git a/jarvis/followup/templates/chronos/create.html b/jarvis/followup/templates/chronos/create.html index 266cff8..f0e62b4 100644 --- a/jarvis/followup/templates/chronos/create.html +++ b/jarvis/followup/templates/chronos/create.html @@ -14,7 +14,7 @@ {% csrf_token %}
-
+
{% if request.user|has_group:"trainer" %} {{ form.gymnast }} {{ form.gymnast_related }} @@ -34,21 +34,21 @@
-
+
{{ form.chrono_type }} {% if form.chrono_type.errors %} {% for error in form.chrono_type.errors %}{{ error }}{% endfor %}{% endif %}
-
+
{{ form.score_type }} {% if form.score_type.errors %} {% for error in form.score_type.errors %}{{ error }}{% endfor %}{% endif %}
-
+
{{ form.score }} {% if form.score.errors %} {% for error in form.score.errors %}{{ error }}{% endfor %}{% endif %}
diff --git a/jarvis/followup/templates/intensities/details.html b/jarvis/followup/templates/intensities/details.html index 988cdaf..abcba64 100644 --- a/jarvis/followup/templates/intensities/details.html +++ b/jarvis/followup/templates/intensities/details.html @@ -48,13 +48,13 @@
Skill
- {% if intensity.quantity_of_skill_quality < 85.0 %} - {{ intensity.quantity_of_skill_quality | floatformat:1 }}% - {% elif intensity.quantity_of_skill_quality < 95.0 %} - {{ intensity.quantity_of_skill_quality | floatformat:1 }}% - {% else %} - {{ intensity.quantity_of_skill_quality | floatformat:1 }}% - {% endif %} + {% if intensity.quantity_of_skill_quality < 85.0 %} + {{ intensity.quantity_of_skill_quality | floatformat:1 }}% + {% elif intensity.quantity_of_skill_quality < 95.0 %} + {{ intensity.quantity_of_skill_quality | floatformat:1 }}% + {% else %} + {{ intensity.quantity_of_skill_quality | floatformat:1 }}% + {% endif %}
@@ -63,13 +63,13 @@
Passes
- {% if intensity.number_of_passes_quality < 85.0 %} - {{ intensity.number_of_passes_quality | floatformat:1 }}% - {% elif intensity.number_of_passes_quality < 95.0 %} - {{ intensity.number_of_passes_quality | floatformat:1 }}% - {% else %} - {{ intensity.number_of_passes_quality | floatformat:1 }}% - {% endif %} + {% if intensity.number_of_passes_quality < 85.0 %} + {{ intensity.number_of_passes_quality | floatformat:1 }}% + {% elif intensity.number_of_passes_quality < 95.0 %} + {{ intensity.number_of_passes_quality | floatformat:1 }}% + {% else %} + {{ intensity.number_of_passes_quality | floatformat:1 }}% + {% endif %}
@@ -94,7 +94,7 @@
Skill/passe
- {{ intensity.quantity_of_skill_by_passe | floatformat:3 }} + {{ intensity.mean_quantity_of_skill_by_passe | floatformat:3 }}
diff --git a/jarvis/followup/templates/intensities/list.html b/jarvis/followup/templates/intensities/list.html index 05489e1..2318b3d 100644 --- a/jarvis/followup/templates/intensities/list.html +++ b/jarvis/followup/templates/intensities/list.html @@ -88,7 +88,7 @@ {{ intensity.mean_difficulty_by_passe_in_unit | floatformat:2 }} - {{ intensity.quantity_of_skill_by_passe | floatformat:2 }} + {{ intensity.mean_quantity_of_skill_by_passe | floatformat:2 }} {{ intensity.mean_difficulty_by_skill_in_unit | floatformat:2 }} diff --git a/jarvis/people/templates/gymnasts/details.html b/jarvis/people/templates/gymnasts/details.html index 297d34c..6b1f691 100644 --- a/jarvis/people/templates/gymnasts/details.html +++ b/jarvis/people/templates/gymnasts/details.html @@ -113,7 +113,7 @@ {% endif %} diff --git a/jarvis/people/templates/gymnasts/tabs/tab_physiological.html b/jarvis/people/templates/gymnasts/tabs/tab_physiological.html deleted file mode 100644 index 83cc035..0000000 --- a/jarvis/people/templates/gymnasts/tabs/tab_physiological.html +++ /dev/null @@ -1,388 +0,0 @@ -{% load static %} -
-
-
-
-

Height/Weight

-
-
- {% if height_weight_list %} -
- {% else %} -

No height/weight recorded for this gymnast.

- {% endif %} -
- -
-
- -
-
-
-

Well Being

-
-
- {% if wellbeing_list %} -
- {% else %} -

No well being recorded for this gymnast.

- {% endif %} -
- -
-
-
-
-
-
-
-

Injuries

-
-
- {% if injuries_list %} - - - - - - - - - - - - - - - {% for injury in injuries_list %} - - - - - - - - - - - {% endfor %} - -
DateMechanismTypeLocationSideSkill# Week Off
- -   - - {{ injury.date | date:"d-m-Y" }}{{ injury.get_mechanism_display }}{{ injury.get_injury_type_display }}{{ injury.get_location_display }}{{ injury.get_body_side_display }}{% if injury.skill %}{{ injury.skill }}{% else %}-{% endif %}{{ injury.nb_week_off }}
- {% else %} -

No injury known for this gymnast.

- {% endif %} -
- -
-
-
- - - \ No newline at end of file diff --git a/jarvis/people/templates/gymnasts/tabs/tab_routines_and_routine_stats.html b/jarvis/people/templates/gymnasts/tabs/tab_routines_and_routine_stats.html index d097271..2513618 100644 --- a/jarvis/people/templates/gymnasts/tabs/tab_routines_and_routine_stats.html +++ b/jarvis/people/templates/gymnasts/tabs/tab_routines_and_routine_stats.html @@ -236,11 +236,11 @@ {% endfor %} ]; - var quantity_of_skill_by_passe = [ + var mean_quantity_of_skill_by_passe = [ {% for score in intensity_list %} { x: '{{ score.date | date:"d-m-Y" }}', - y: '{{ score.quantity_of_skill_by_passe }}' + y: '{{ score.mean_quantity_of_skill_by_passe }}' }, {% endfor %} ]; @@ -275,7 +275,7 @@ cubicInterpolationMode: 'monotone', borderColor: 'rgb(255, 159, 64)', pointBackgroundColor: 'rgb(255, 159, 64)', - data: quantity_of_skill_by_passe + data: mean_quantity_of_skill_by_passe }, { label: 'diff/skill', diff --git a/jarvis/people/urls.py b/jarvis/people/urls.py index a938cb1..254186a 100644 --- a/jarvis/people/urls.py +++ b/jarvis/people/urls.py @@ -36,21 +36,21 @@ gymnast_urlpatterns = [ views.gymnast_display_events_and_notes, name="gymnast_display_events_and_notes", ), - path( - r"details//injury/", - views.gymnast_display_injury, - name="gymnast_display_injury", - ), + # path( + # r"details//injury/", + # views.gymnast_display_injury, + # name="gymnast_display_injury", + # ), path( r"details//scores_chrono/", views.gymnast_display_scores_chrono, name="gymnast_display_scores_chrono", ), - path( - r"details//wellbeing/", - views.gymnast_display_wellbeing, - name="gymnast_display_wellbeing", - ), + # path( + # r"details//wellbeing/", + # views.gymnast_display_wellbeing, + # name="gymnast_display_wellbeing", + # ), path( r"details//physiological/", views.gymnast_display_physiological, diff --git a/jarvis/people/views.py b/jarvis/people/views.py index 052c2f9..d2d9f81 100644 --- a/jarvis/people/views.py +++ b/jarvis/people/views.py @@ -237,18 +237,25 @@ def gymnast_display_events_and_notes(request, gymnast_id): return render(request, "gymnasts/tabs/tab_events_and_notes.html", context) -@login_required -@require_http_methods(["GET"]) -def gymnast_display_injury(request, gymnast_id): - """ - Renvoie la liste des blessures d'un gymnaste. +# @login_required +# @require_http_methods(["GET"]) +# def gymnast_display_injury(request, gymnast_id): +# """ +# Renvoie la liste des blessures d'un gymnaste. - Args: - gymnast_id (int) identifiant du gymnast - """ - injuries_list = Injury.objects.filter(gymnast=gymnast_id) - context = {"injuries_list": injuries_list, "gymnast_id": gymnast_id} - return render(request, "gymnasts/list_injury.html", context) +# Args: +# gymnast_id (int) identifiant du gymnast +# """ +# start_date = pendulum.now().date().subtract(months=6) +# base_queryset = Injury.objects.filter(gymnast=gymnast_id) +# number_of_injuries = base_queryset.count() +# injuries_list = base_queryset.filter(date__gte=start_date) +# context = { +# "injuries_list": injuries_list, +# "gymnast_id": gymnast_id, +# "number_of_injuries": number_of_injuries, +# } +# return render(request, "gymnasts/list_injury.html", context) @login_required @@ -260,6 +267,7 @@ def gymnast_display_physiological(request, gymnast_id): Args: gymnast_id (int) identifiant du gymnast """ + number_of_injuries = Injury.objects.filter(gymnast=gymnast_id).count() start_date = pendulum.now().date().subtract(months=6) injuries_list = Injury.objects.filter( gymnast=gymnast_id, date__gte=start_date @@ -273,11 +281,14 @@ def gymnast_display_physiological(request, gymnast_id): context = { "injuries_list": injuries_list, + "number_of_injuries": number_of_injuries, "wellbeing_list": wellbeing_list, "height_weight_list": height_weight_list, "gymnast_id": gymnast_id, } - return render(request, "gymnasts/tabs/tab_physiological.html", context) + return render( + request, "gymnasts/tabs/tab_physiological_and_wellbeing.html", context + ) @login_required @@ -313,22 +324,22 @@ def gymnast_display_scores_chrono(request, gymnast_id): return render(request, "gymnasts/tabs/tab_scores_and_chronos.html", context) -@login_required -@require_http_methods(["GET"]) -def gymnast_display_wellbeing(request, gymnast_id): - """ - Selectionne tous les scores réalisés par le gymnaste. +# @login_required +# @require_http_methods(["GET"]) +# def gymnast_display_wellbeing(request, gymnast_id): +# """ +# Selectionne tous les scores réalisés par le gymnaste. - Args: - gymnast_id (int) identifiant du gymnast - """ - wellbeing_list = WellBeing.objects.filter(gymnast=gymnast_id).order_by("-date") +# Args: +# gymnast_id (int) identifiant du gymnast +# """ +# wellbeing_list = WellBeing.objects.filter(gymnast=gymnast_id).order_by("-date") - context = { - "wellbeing_list": wellbeing_list, - "gymnast_id": gymnast_id, - } - return render(request, "gymnasts/list_wellbeing.html", context) +# context = { +# "wellbeing_list": wellbeing_list, +# "gymnast_id": gymnast_id, +# } +# return render(request, "gymnasts/list_wellbeing.html", context) @login_required