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 ). gymnast_id (int) identifiant d'un gymnaste (classe ). """ 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"""

Bonjour,

{intensity.gymnast} a encodé une nouvelle intensité pour le {date.strftime('%d %B %Y')}:

Quality:

Statistics:

""" 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)