Jarvis/jarvis/followup/views_intensity.py

212 lines
8.3 KiB
Python
Raw Normal View History

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>
<li><b>Passe: {intensity.average_quality:.2f}%</b></li>
</ul>
<p><u>Statistics:</u></p>
<ul>
<li>Passe/time: {intensity.mean_time_by_passe:.2f}min</li>
<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)