From f71dbd0d069024459519a0823a161af03228effe Mon Sep 17 00:00:00 2001 From: Gregory Trullemans Date: Mon, 17 Oct 2022 10:58:39 +0200 Subject: [PATCH] Add date comparison for plan and minor modification --- templates/people/gymnasts/tab_skill.html | 2 + ultron/core/views.py | 8 +++ ultron/people/templatetags/skill_doughnut.py | 61 ++++++++++++++------ ultron/people/views.py | 17 +++--- ultron/tools/models.py | 4 -- 5 files changed, 62 insertions(+), 30 deletions(-) diff --git a/templates/people/gymnasts/tab_skill.html b/templates/people/gymnasts/tab_skill.html index ca40546174..09c3d7142b 100644 --- a/templates/people/gymnasts/tab_skill.html +++ b/templates/people/gymnasts/tab_skill.html @@ -111,7 +111,9 @@ {{ skill.long_label }} + {% if skill.is_past %}{% endif %} {{ skill.plan_date | date:"d-m-Y" }} + {% if skill.is_past %}{% endif %} {{ skill.difficulty }} {{ skill.level }} diff --git a/ultron/core/views.py b/ultron/core/views.py index 25ee3d077f..5a233b7038 100644 --- a/ultron/core/views.py +++ b/ultron/core/views.py @@ -17,6 +17,8 @@ from ultron.people.models import Gymnast from ultron.planning.models import Event from ultron.tools.models import get_number_of_weeks_between +from functools import lru_cache + def login(request): """ @@ -72,6 +74,11 @@ def next_birthdays(request, number_of_birthday): return birthday_list +# @lru_cache() +# def get_last_updated_gymnasts(expiration_date): +# ... + + @login_required @require_http_methods(["GET"]) def home(request): @@ -82,6 +89,7 @@ def home(request): "date_begin" )[:10] + # mettre tout ca en cache. last_updated_gymnast = Gymnast.objects.filter( Q(mindstate__created_at__gt=request.user.last_login) | Q(points__created_at__gt=request.user.last_login) diff --git a/ultron/people/templatetags/skill_doughnut.py b/ultron/people/templatetags/skill_doughnut.py index 35d9fd5a99..2a22aae91f 100644 --- a/ultron/people/templatetags/skill_doughnut.py +++ b/ultron/people/templatetags/skill_doughnut.py @@ -7,29 +7,56 @@ register = template.Library() @register.inclusion_tag("people/gymnasts/gymnast_level_doughnut.html") def generate_skill_doughnut(gymnast_id): - """ - Récupère les différents nombres de skill du gymnaste (masterised, chained, without help, + """ Récupère pour un gymnaste la quantité de skill dans chaque phase d'apprentissage (with help, + withoutRécupère les différents nombres de skill du gymnaste (masterised, chained, without help, with help or no) à la dernière date connue et les renvoie pour en faire un graphique. """ - base_queryset = LearnedSkill.objects.filter(gymnast=gymnast_id).order_by("-date") + # base_queryset = LearnedSkill.objects.filter(gymnast=gymnast_id).order_by("-date") - total = 0 - skills_capacity = [0] * 5 - checked_skills = set() - for learned_skill in base_queryset: - if learned_skill not in checked_skills: - checked_skills.add(learned_skill) - skills_capacity[learned_skill.learning_step] += 1 - total += 1 + # total = 0 + # skills_capacity = [0] * 5 + # checked_skills = set() + # for learned_skill in base_queryset: + # if learned_skill not in checked_skills: + # checked_skills.add(learned_skill) + # skills_capacity[learned_skill.learning_step] += 1 + # total += 1 + + skill_whith_help = ( + Skill.objects.filter(known_by__gymnast=gymnast_id, known_by__learning_step=1) + .exclude(known_by__gymnast=gymnast_id, known_by__learning_step__gte=2) + .distinct() + .count() + ) + + skill_without_help = ( + Skill.objects.filter(known_by__gymnast=gymnast_id, known_by__learning_step=2) + .exclude(known_by__gymnast=gymnast_id, known_by__learning_step=3) + .distinct() + .count() + ) + + skill_chained = ( + Skill.objects.filter(known_by__gymnast=gymnast_id, known_by__learning_step=3) + .exclude(known_by__gymnast=gymnast_id, known_by__learning_step=4) + .distinct() + .count() + ) + + skill_masterised = ( + Skill.objects.filter(known_by__gymnast=gymnast_id, known_by__learning_step__gte=4) + .distinct() + .count() + ) nb_skill = Skill.objects.all().count() - nb_unknown_skill = nb_skill - total + nb_unknown_skill = nb_skill - skill_whith_help - skill_without_help - skill_chained - skill_masterised return { - "nb_skill_masterised": skills_capacity[4], - "nb_skill_chained": skills_capacity[3], - "nb_skill_without_help": skills_capacity[2], - "nb_skill_whith_help": skills_capacity[1], - "lost_skill": skills_capacity[0], + "nb_skill_whith_help": skill_whith_help, + "nb_skill_without_help": skill_without_help, + "nb_skill_chained": skill_chained, + "nb_skill_masterised": skill_masterised, + # "lost_skill": skills_capacity[0], "nb_unknown_skill": nb_unknown_skill, } diff --git a/ultron/people/views.py b/ultron/people/views.py index 1c1d76132a..7bf192e10c 100644 --- a/ultron/people/views.py +++ b/ultron/people/views.py @@ -4,7 +4,7 @@ from django.contrib.auth.models import Group from django.contrib.auth import get_user_model User = get_user_model() -from django.db.models import Q, F, Avg +from django.db.models import BooleanField, ExpressionWrapper, Q, F, Avg from django.db.models.functions import TruncDay from django.http import HttpResponse, HttpResponseRedirect, JsonResponse from django.shortcuts import render, get_object_or_404 @@ -462,7 +462,13 @@ def gymnast_display_skill(request, gymnast_id): planified_skill = ( Skill.objects.filter(plan__gymnast=gymnast.id) .order_by("-plan__date") - .annotate(plan_date=F("plan__date")) + .annotate( + plan_date=F("plan__date"), + is_past=ExpressionWrapper( + Q(plan__date__lte=pendulum.now().date()), + output_field=BooleanField() + ) + ) ) context["planified_skill"] = planified_skill @@ -488,12 +494,6 @@ def gymnast_display_skill(request, gymnast_id): .distinct() ) - skill_not_chained = ( - Skill.objects.filter(known_by__gymnast=gymnast_id, known_by__learning_step=2) - .exclude(known_by__gymnast=gymnast.id, known_by__learning_step=3) - .distinct() - ) - skill_chained = ( Skill.objects.filter(known_by__gymnast=gymnast_id, known_by__learning_step=3) .exclude(known_by__gymnast=gymnast.id, known_by__learning_step=4) @@ -502,7 +502,6 @@ def gymnast_display_skill(request, gymnast_id): context["gymnast"] = gymnast context["skill_whith_help"] = skill_whith_help - context["skill_not_chained"] = skill_not_chained context["skill_without_help"] = skill_without_help context["skill_chained"] = skill_chained context["gymnast_nb_known_skills"] = gymnast_nb_known_skills diff --git a/ultron/tools/models.py b/ultron/tools/models.py index 7434fbcaab..30e11016ff 100644 --- a/ultron/tools/models.py +++ b/ultron/tools/models.py @@ -91,10 +91,6 @@ class Seasonisable(models.Model): self.season, self.week_number = from_date_to_week_number(self.date) super().save(*args, **kwargs) - # @property - # def is_past(self): - # return pendulum.now().date() > self.date - class TemporizableQuerySet(models.QuerySet): """