from django.shortcuts import render, get_object_or_404 from django.http import HttpResponse from django.contrib.auth.decorators import login_required from django.views.decorators.http import require_http_methods from django.http import HttpResponse, HttpResponseRedirect from django.db.models import Q, F, Count, Min from django.contrib import messages from .models import Gymnast from .forms import GymnastForm from ultron.followup.models import Event from ultron.objective.models import Educative, Plan from ultron.followup.forms import GymnastHasRoutineForm from ultron.followup.models import ( Chrono, LearnedSkill, MindState, Skill, Point, Accident, HeightWeight, ) import simplejson import pendulum @login_required @require_http_methods(["GET"]) def gymnast_lookup(request): """ Récupère la liste des gymnastes à la volée suivant des caractères de recherche entrés. (min 3 caractères) """ results = [] pattern = request.GET.get("pattern", None) # Ignore queries shorter than length 3 if pattern is not None and len(pattern) > 3: model_results = Gymnast.objects.filter( Q(last_name__icontains=pattern) | Q(first_name__icontains=pattern) ) results = [{"ID": x.id, "Name": str(x)} for x in model_results] json = simplejson.dumps(results) return HttpResponse(json, content_type="application/json") @login_required @require_http_methods(["GET"]) def gymnast_listing(request): """ Liste tous les gymnasts connus """ gymnast_list = Gymnast.objects.all() context = {"gymnast_list": gymnast_list} return render(request, "peoples/gymnasts/list.html", context) @login_required @require_http_methods(["GET"]) def gymnast_details(request, gymnast_id): """ Récupère toutes les informations d'un gymnaste. """ gymnast = get_object_or_404(Gymnast, pk=gymnast_id) context = {} # devrait disparaitre context = gymnast.get_informations_from_level() # devrait disparaitre context.update(gymnast.get_informations_from_rank()) # devrait disparaitre gymnast_nb_known_skills = gymnast.known_skills.distinct( "skill" ).count() # devrait disparaitre context["gymnast_nb_known_skills"] = gymnast_nb_known_skills # devrait disparaitre planified_learn = Plan.objects.filter(gymnast=gymnast_id).order_by( "-date" ) # devrait disparaitre ? context["planified_learn"] = planified_learn learnedskills_list = LearnedSkill.objects.filter(gymnast=gymnast_id).order_by( "-date" )[:10] nb_skill = Skill.objects.all().count() nb_known_skill = ( LearnedSkill.objects.filter(gymnast=gymnast_id).distinct("skill").count() ) percentage_known_skill = (nb_known_skill / nb_skill) * 100 chronos_list = Chrono.objects.filter(gymnast=gymnast_id).order_by("-date")[:10] straightjump_score = ( Chrono.objects.filter(gymnast=gymnast_id).filter(type=0).order_by("-date") ) best_straightjump = ( Chrono.objects.filter(gymnast=gymnast_id).filter(type=0).order_by("-score")[:1] ) best_routine = ( Chrono.objects.filter(gymnast=gymnast_id).filter(type=1).order_by("-score")[:1] ) routine_score = ( Chrono.objects.filter(gymnast=gymnast_id).filter(type=1).order_by("-date") ) points_routine_1_list = ( Point.objects.filter(gymnast=gymnast_id) .filter(routine_type=0) .order_by("-event__datebegin") ) points_routine_2_list = ( Point.objects.filter(gymnast=gymnast_id) .filter(routine_type=1) .order_by("-event__datebegin") ) points_routine_final_list = ( Point.objects.filter(gymnast=gymnast_id) .filter(routine_type=2) .order_by("-event__datebegin") ) # Devrait être dans un template tags nb_skill_chained = ( Skill.objects.filter(known_by__gymnast=gymnast_id, known_by__cando=3) .distinct() .count() ) nb_skill_not_chained = ( Skill.objects.filter(known_by__gymnast=gymnast_id, known_by__cando=2) .exclude(known_by__gymnast=gymnast.id, known_by__cando=3) .distinct() .count() ) nb_skill_whith_help = ( Skill.objects.filter(known_by__gymnast=gymnast_id, known_by__cando=1) .exclude(known_by__gymnast=gymnast.id, known_by__cando__gte=2) .distinct() .count() ) height_weight = HeightWeight.objects.filter(gymnast=gymnast_id).order_by("-date")[ :1 ] nb_unknown_skill = nb_skill - gymnast_nb_known_skills context["gymnast"] = gymnast context["learnedskills_list"] = learnedskills_list context["chronos_list"] = chronos_list context["straightjump_score"] = straightjump_score context["routine_score"] = routine_score context["best_routine"] = best_routine context["best_straightjump"] = best_straightjump context["nb_skill"] = nb_skill context["nb_known_skill"] = nb_known_skill context["points_routine_1_list"] = points_routine_1_list context["points_routine_2_list"] = points_routine_2_list context["points_routine_final_list"] = points_routine_final_list context["percentage_known_skill"] = percentage_known_skill context["nb_skill_chained"] = nb_skill_chained context["nb_skill_not_chained"] = nb_skill_not_chained context["nb_skill_whith_help"] = nb_skill_whith_help context["nb_unknown_skill"] = nb_unknown_skill context["height_weight"] = height_weight # context = { # 'gymnast': gymnast, # 'learnedskills_list': learnedskills_list, # 'chronos_list': chronos_list, # 'straightjump_score': straightjump_score, # 'routine_score': routine_score, # 'best_routine': best_routine, # 'best_straightjump': best_straightjump, # 'nb_skill': nb_skill, # 'nb_known_skill': nb_known_skill, # 'points_routine_1_list': points_routine_1_list, # 'points_routine_2_list': points_routine_2_list, # 'points_routine_final_list': points_routine_final_list, # 'percentage_known_skill': percentage_known_skill, # } return render(request, "peoples/gymnasts/details.html", context) @login_required @require_http_methods(["GET"]) def gymnast_display_event(request, gymnast_id): """ Renvoie deux listes d'évènements : ceux à venir et ceux passés. """ today = pendulum.now().date() next_event_list = Event.objects.filter(gymnasts=gymnast_id, datebegin__gte=today) previous_event_list = Event.objects.filter( gymnasts=gymnast_id, datebegin__lte=today ) context = { "next_event_list": next_event_list, "previous_event_list": previous_event_list, } return render(request, "peoples/gymnasts/list_event.html", context) @login_required @require_http_methods(["GET"]) def gymnast_display_accident(request, gymnast_id): """ Renvoie deux listes d'évènements : ceux à venir et ceux passés. """ accident_list = Accident.objects.filter(gymnast=gymnast_id) context = {"accident_list": accident_list, "gymnast_id": gymnast_id} return render(request, "peoples/gymnasts/list_accident.html", context) @login_required @require_http_methods(["GET"]) def gymnast_display_phisiological(request, gymnast_id): """ Renvoie les listes des tailles/poids, état d'esprit et accidents. """ accident_list = Accident.objects.filter(gymnast=gymnast_id).order_by("-date") mindstate_list = MindState.objects.filter(gymnast=gymnast_id).order_by("-date") height_weight_list = HeightWeight.objects.filter(gymnast=gymnast_id).order_by( "-date" ) context = { "accident_list": accident_list, "mindstate_list": mindstate_list, "height_weight_list": height_weight_list, "gymnast_id": gymnast_id, } return render(request, "peoples/gymnasts/physiological_followup.html", context) @login_required @require_http_methods(["GET"]) def gymnast_display_scores_chrono(request, gymnast_id): """ Selectionne tous les scores réalisés par le gymnaste """ score_list = Point.objects.filter(gymnast=gymnast_id).order_by("-event__datebegin") score_routine1_list = score_list.filter(routine_type=0) score_routine2_list = score_list.filter(routine_type=1) score_routine3_list = score_list.filter(routine_type=2) chrono_list = Chrono.objects.filter(gymnast=gymnast_id).order_by("date") chrono_10c = chrono_list.filter(type=0) chrono_r1 = chrono_list.filter(type=1) chrono_r2 = chrono_list.filter(type=2) chrono_rf = chrono_list.filter(type=3) context = { "score_list": score_list, "score_routine1_list": score_routine1_list, "score_routine2_list": score_routine2_list, "score_routine3_list": score_routine3_list, "chrono_list": chrono_list, "chrono_10c": chrono_10c, "chrono_r1": chrono_r1, "chrono_r2": chrono_r2, "chrono_rf": chrono_rf, "gymnast_id": gymnast_id, } return render(request, "peoples/gymnasts/list_scores_chronos.html", context) @login_required @require_http_methods(["GET"]) def gymnast_display_mindstate(request, gymnast_id): """ Selectionne tous les scores réalisés par le gymnaste """ mindstate_list = MindState.objects.filter(gymnast=gymnast_id).order_by("-date") context = { "mindstate_list": mindstate_list, "gymnast_id": gymnast_id, } return render(request, "peoples/gymnasts/list_mindstate.html", context) @login_required @require_http_methods(["GET"]) def gymnast_display_routines(request, gymnast_id): """ Tag affichant les séries d'un gymnaste. """ gymnast = get_object_or_404(Gymnast, pk=gymnast_id) ghr_list = gymnast.has_routine.prefetch_related("routine") context = {"ghr_list": ghr_list, "gymnast_id": gymnast_id} return render(request, "peoples/gymnasts/list_routine.html", context) @login_required @require_http_methods(["GET", "POST"]) def link_routine_to_gymnast(request, gymnast_id=None): """ """ if gymnast_id: gymnast = get_object_or_404(Gymnast, pk=gymnast_id) data = {"gymnast": gymnast_id, "gymnast_related": str(gymnast), "dateend": None} else: gymnast = None data = {"dateend": None} if request.method == "POST": form = GymnastHasRoutineForm(request.POST) if form.is_valid(): form.save() if gymnast_id is not None: return HttpResponseRedirect("/gymnast/details/" + str(gymnast_id) + "/") else: return HttpResponseRedirect("/gymnast/") else: form = GymnastHasRoutineForm(instance=gymnast, initial=data) context = {"form": form, "gymnast_id": gymnast_id} return render(request, "peoples/gymnasts/link_to_routine.html", context) @login_required @require_http_methods(["GET", "POST"]) def gymnast_create_or_update(request, gymnast_id=None): """ Formulaire de creation et modification d'un gymnaste. """ if gymnast_id: gymnast = get_object_or_404(Gymnast, pk=gymnast_id) data = {"club_related": gymnast.club} else: gymnast = None data = {} if request.method == "POST": gymnast_form = GymnastForm(request.POST, instance=gymnast) if gymnast_form.is_valid(): gymnast = gymnast_form.save() return HttpResponseRedirect("/gymnast/details/" + str(gymnast.id)) else: print(gymnast_form.errors) form = GymnastForm(instance=gymnast, initial=data) context = {"form": form, "gymnast_id": gymnast_id} return render(request, "peoples/gymnasts/create.html", context) @login_required @require_http_methods(["GET"]) def gymnast_display_skill(request, gymnast_id): """ Tag affichant les statistiques de skill d'un gymnaste : le nombre de saut qu'il sait faire (total, par niveau, par rank, …), calcule la complétude, … .. todo:: Générer UNE fois la liste de skill que le gymnaste ne sait pas faire (1 query) et les counts puis, dans le template on parcourt plusieurs fois cette même liste mais on affiche conditionnellement (par age, par rank, ...) """ context = {} gymnast = get_object_or_404(Gymnast, pk=gymnast_id) gymnast_nb_known_skills = gymnast.known_skills.distinct("skill").count() context = gymnast.get_informations_from_level() context.update(gymnast.get_informations_from_rank()) planified_skill = ( Skill.objects.filter(plan__gymnast=gymnast.id) .order_by("-plan__date") .annotate(plan_date=F("plan__date")) ) context["planified_skill"] = planified_skill if gymnast.gender: context["skill_by_age"] = Skill.objects.filter( age_girl__lte=gymnast.age ).exclude(known_by__gymnast=gymnast.id) else: context["skill_by_age"] = Skill.objects.filter( age_boy__lte=gymnast.age ).exclude(known_by__gymnast=gymnast.id) skill_whith_help = ( Skill.objects.filter(known_by__gymnast=gymnast_id, known_by__cando=1) .exclude(known_by__gymnast=gymnast.id, known_by__cando__gte=2) .distinct() ) skill_not_chained = ( Skill.objects.filter(known_by__gymnast=gymnast_id, known_by__cando=2) .exclude(known_by__gymnast=gymnast.id, known_by__cando=3) .distinct() ) context["gymnast"] = gymnast context["skill_whith_help"] = skill_whith_help context["skill_not_chained"] = skill_not_chained context["gymnast_nb_known_skills"] = gymnast_nb_known_skills return render(request, "peoples/gymnasts/list_skill.html", context)