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 %}
No height/weight recorded for this gymnast.
- {% endif %} -No well being recorded for this gymnast.
- {% endif %} -- | Date | -Mechanism | -Type | -Location | -Side | -Skill | -# 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 }} | -
No injury known for this gymnast.
- {% endif %} -