2024-02-16 16:54:10 +01:00
|
|
|
from django.shortcuts import render, get_object_or_404
|
|
|
|
from django.contrib.auth.decorators import login_required
|
|
|
|
from django.views.decorators.http import require_http_methods
|
|
|
|
from django.http import HttpResponseRedirect
|
|
|
|
from django.db.models import Min, Avg, Max
|
|
|
|
from django.core.mail import send_mail
|
|
|
|
from django.urls import reverse
|
|
|
|
from django.conf import settings
|
|
|
|
from django.contrib.contenttypes.models import ContentType
|
|
|
|
|
|
|
|
from jarvis.core.models import Email
|
|
|
|
from .models import Gymnast
|
|
|
|
from .models import Intensity
|
|
|
|
from .forms import IntensityForm
|
|
|
|
|
|
|
|
from .email_vars import MAIL_HEADER, MAIL_FOOTER
|
|
|
|
|
|
|
|
|
|
|
|
def get_intensity_stats_for_season_week(gymnast_id, season, week_number):
|
|
|
|
"""Calcule le min, max et moyenne de bien-être d'un gymnaste pour une semaine donnéee
|
|
|
|
|
|
|
|
Args:
|
|
|
|
gymnast_id (int) identifiant d'un gymnaste
|
|
|
|
season (str) saison
|
|
|
|
week_number (int) numéro de semaine
|
|
|
|
"""
|
|
|
|
intensity_score = Intensity.objects.filter(
|
|
|
|
gymnast_id=gymnast_id, season=season, week_number=week_number
|
|
|
|
).aggregate(
|
|
|
|
average_intensity_time_value=Avg("time"),
|
|
|
|
average_intensity_difficulty_value=Avg("difficulty"),
|
|
|
|
average_quantity_of_skill_value=Avg("quantity_of_skill"),
|
|
|
|
average_number_of_passes_value=Avg("number_of_passes"),
|
|
|
|
average_time_quality=Avg("time_quality"),
|
|
|
|
average_difficulty_quality=Avg("difficulty_quality"),
|
|
|
|
average_quantity_of_skill_quality=Avg("quantity_of_skill_quality"),
|
|
|
|
average_number_of_passes_quality=Avg("number_of_passes_quality"),
|
|
|
|
average_average_training_quality=Avg("average_training_quality"),
|
|
|
|
min_intensity_time_value=Min("time"),
|
|
|
|
min_intensity_difficulty_value=Min("difficulty"),
|
|
|
|
min_quantity_of_skill_value=Min("quantity_of_skill"),
|
|
|
|
min_number_of_passes_value=Min("number_of_passes"),
|
|
|
|
min_time_quality=Min("time_quality"),
|
|
|
|
min_difficulty_quality=Min("difficulty_quality"),
|
|
|
|
min_quantity_of_skill_quality=Min("quantity_of_skill_quality"),
|
|
|
|
min_number_of_passes_quality=Min("number_of_passes_quality"),
|
|
|
|
min_average_training_quality=Min("average_training_quality"),
|
|
|
|
max_intensity_time_value=Max("time"),
|
|
|
|
max_intensity_difficulty_value=Max("difficulty"),
|
|
|
|
max_quantity_of_skill_value=Max("quantity_of_skill"),
|
|
|
|
max_number_of_passes_value=Max("number_of_passes"),
|
|
|
|
max_time_quality=Max("time_quality"),
|
|
|
|
max_difficulty_quality=Max("difficulty_quality"),
|
|
|
|
max_quantity_of_skill_quality=Max("quantity_of_skill_quality"),
|
|
|
|
max_number_of_passes_quality=Max("number_of_passes_quality"),
|
|
|
|
max_average_training_quality=Max("average_training_quality"),
|
|
|
|
)
|
|
|
|
return intensity_score
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
|
|
|
@require_http_methods(["GET"])
|
|
|
|
def intensity_listing(request, gymnast_id=None):
|
|
|
|
"""
|
|
|
|
Si la personne connectée est un entraîneur, la fonction récupère la liste des intensités d'un
|
|
|
|
gymnaste précis ou de tout le monde.
|
|
|
|
Si la personne connectée est un gymnaste, la fonction récupère la liste de ses intensités.
|
|
|
|
|
|
|
|
Args:
|
|
|
|
gymnast_id (int) identifiant d'un gymnaste
|
|
|
|
"""
|
|
|
|
|
|
|
|
gymnast = None
|
|
|
|
if gymnast_id and (
|
|
|
|
request.user.is_superuser
|
|
|
|
or (
|
|
|
|
request.session.has_key("available_gymnast")
|
|
|
|
and gymnast_id in request.session["available_gymnast"]
|
|
|
|
)
|
|
|
|
):
|
|
|
|
gymnast = get_object_or_404(Gymnast, pk=gymnast_id)
|
|
|
|
intensity_list = Intensity.objects.filter(gymnast=gymnast_id)
|
|
|
|
else:
|
|
|
|
if request.user.is_superuser:
|
|
|
|
intensity_list = Intensity.objects.all()
|
|
|
|
else:
|
|
|
|
intensity_list = Intensity.objects.filter(
|
|
|
|
gymnast__in=request.session["available_gymnast"]
|
|
|
|
)
|
|
|
|
|
|
|
|
context = {"intensity_list": intensity_list, "gymnast": gymnast}
|
|
|
|
return render(request, "intensities/list.html", context)
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
|
|
|
@require_http_methods(["GET"])
|
|
|
|
def intensity_details(request, intensity_id):
|
|
|
|
"""
|
|
|
|
Récupère toutes les informations d'une intensité.
|
|
|
|
|
|
|
|
Args:
|
|
|
|
intensity_id (int) identifiant d'une intensité
|
|
|
|
"""
|
|
|
|
intensity = get_object_or_404(Intensity, pk=intensity_id)
|
|
|
|
|
|
|
|
if not request.user.is_superuser and (
|
|
|
|
request.session.has_key("available_gymnast")
|
|
|
|
and intensity.gymnast.id not in request.session["available_gymnast"]
|
|
|
|
):
|
|
|
|
return intensity_listing(request)
|
|
|
|
|
|
|
|
return render(request, "intensities/details.html", {"intensity": intensity})
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
|
|
|
@require_http_methods(["GET", "POST"])
|
|
|
|
def intensity_create_or_update(request, intensity_id=None, gymnast_id=None):
|
|
|
|
"""Création d'un record de la class Intentity.
|
|
|
|
|
|
|
|
Args:
|
|
|
|
intensity_id (int) identifiant d'une intensité (classe <Intensity>).
|
|
|
|
gymnast_id (int) identifiant d'un gymnaste (classe <Gymnast>).
|
|
|
|
"""
|
|
|
|
|
|
|
|
if intensity_id:
|
|
|
|
intensity = get_object_or_404(Intensity, pk=intensity_id)
|
|
|
|
if not request.user.is_superuser and (
|
|
|
|
request.session.has_key("available_gymnast")
|
|
|
|
and intensity.gymnast.id not in request.session["available_gymnast"]
|
|
|
|
):
|
|
|
|
return intensity_listing(request)
|
|
|
|
data = {
|
|
|
|
"gymnast": intensity.gymnast.id,
|
|
|
|
"gymnast_related": str(intensity.gymnast),
|
|
|
|
}
|
|
|
|
else:
|
|
|
|
intensity = None
|
|
|
|
data = {}
|
|
|
|
|
|
|
|
if gymnast_id:
|
|
|
|
gymnast = get_object_or_404(Gymnast, pk=gymnast_id)
|
|
|
|
data["gymnast"] = gymnast_id
|
|
|
|
data["gymnast_related"] = str(gymnast)
|
|
|
|
|
|
|
|
if request.method == "POST":
|
|
|
|
form = IntensityForm(request.POST, instance=intensity)
|
|
|
|
|
|
|
|
if form.is_valid():
|
|
|
|
intensity = form.save()
|
|
|
|
|
|
|
|
# notification
|
|
|
|
receivers = []
|
|
|
|
date = form.cleaned_data["date"]
|
|
|
|
functionality = ContentType.objects.get(model="intensity")
|
|
|
|
for notification in intensity.gymnast.notifications.filter(
|
|
|
|
functionality=functionality
|
|
|
|
):
|
|
|
|
receivers.append(notification.user.email)
|
|
|
|
|
|
|
|
title = f"{intensity.gymnast} : Nouvelle intensité"
|
|
|
|
body = f"""<p>Bonjour,</p><p>{intensity.gymnast} a encodé une nouvelle intensité pour le {date.strftime('%d %B %Y')}:</p>
|
|
|
|
<ul>
|
|
|
|
<li>{intensity.number_of_passes} passages</li>
|
|
|
|
<li>{intensity.time} minutes</li>
|
|
|
|
<li>{intensity.quantity_of_skill} figures</li>
|
|
|
|
<li>{intensity.difficulty_in_unit} difficulty</li>
|
|
|
|
</ul>
|
|
|
|
<p><u>Quality:</u></p>
|
|
|
|
<ul>
|
|
|
|
<li>Time: {intensity.time_quality:.1f}%</li>
|
|
|
|
<li>Diff: {intensity.difficulty_quality:.1f}%</li>
|
|
|
|
<li>Skill: {intensity.quantity_of_skill_quality:.1f}%</li>
|
|
|
|
<li>Passe: {intensity.number_of_passes_quality:.1f}%</li>
|
2024-03-13 11:52:24 +01:00
|
|
|
<li><b>Training: {intensity.average_training_quality:.2f}%</b></li>
|
2024-02-16 16:54:10 +01:00
|
|
|
</ul>
|
|
|
|
<p><u>Statistics:</u></p>
|
|
|
|
<ul>
|
2024-02-17 19:00:27 +01:00
|
|
|
<li>Passe/time: {intensity.average_time_by_passe:.2f}min</li>
|
2024-02-16 16:54:10 +01:00
|
|
|
<li>Skill/time: {intensity.average_quantity_of_skill_by_time:.2f}min</li>
|
|
|
|
<li>Skill/passe: {intensity.average_quantity_of_skill_by_passe:.2f}</li>
|
|
|
|
<li>Diff/passe: {intensity.average_difficulty_by_passe:.2f}</li>
|
|
|
|
<li>Diff/skill: {intensity.average_difficulty_by_skill:.2f}</li>
|
|
|
|
</ul>"""
|
|
|
|
|
|
|
|
Email.objects.create(
|
|
|
|
receivers=receivers,
|
|
|
|
title=title,
|
|
|
|
body=body,
|
|
|
|
)
|
|
|
|
|
|
|
|
send_mail(
|
|
|
|
title,
|
|
|
|
f"Une nouvelle information de saison enregistrée pour {intensity.gymnast}",
|
|
|
|
settings.EMAIL_HOST_USER,
|
|
|
|
receivers,
|
|
|
|
fail_silently=False,
|
|
|
|
html_message=body + MAIL_FOOTER,
|
|
|
|
)
|
|
|
|
|
|
|
|
return HttpResponseRedirect(
|
|
|
|
reverse(
|
|
|
|
"intensity_details",
|
|
|
|
args=(intensity.id,),
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
return render(request, "intensities/create.html", {"form": form})
|
|
|
|
|
|
|
|
form = IntensityForm(instance=intensity, initial=data)
|
|
|
|
context = {"form": form, "intensity_id": intensity_id}
|
|
|
|
return render(request, "intensities/create.html", context)
|