Ultron/ultron/planning/views.py

177 lines
5.5 KiB
Python
Raw Normal View History

2021-12-09 16:53:44 +01:00
from django.contrib.auth.decorators import login_required
from django.http import HttpResponseRedirect, HttpResponse, JsonResponse
2021-12-09 16:53:44 +01:00
from django.shortcuts import render, get_object_or_404
from django.views.decorators.http import require_http_methods
2022-02-01 11:13:01 +01:00
from django.urls import reverse
2021-12-09 16:53:44 +01:00
from ultron.people.models import Gymnast
from .models import (
Event,
2022-01-08 11:40:10 +01:00
EventParticipation,
2021-12-09 16:53:44 +01:00
)
from .forms import EventForm
@login_required
2022-02-12 18:39:06 +01:00
@require_http_methods(["POST"])
2021-12-09 16:53:44 +01:00
def event_lookup(request):
"""
Récupère la liste de tous évènements suivant un pattern si celui-ci est
définit.
"""
results = []
2022-02-12 18:39:06 +01:00
pattern = request.POST.get("pattern", None)
2021-12-09 16:53:44 +01:00
2022-02-12 18:39:06 +01:00
if pattern is not None and len(pattern) >= 3:
2021-12-09 16:53:44 +01:00
model_results = Event.objects.filter(name__icontains=pattern).order_by(
"date_begin"
2021-12-09 16:53:44 +01:00
)
results = [{"ID": x.id, "Name": str(x)} for x in model_results]
return JsonResponse(results, safe=False)
2021-12-09 16:53:44 +01:00
@login_required
@require_http_methods(["GET", "POST"])
2022-02-03 12:30:29 +01:00
def event_create_or_update(request, event_id=None):
2021-12-09 16:53:44 +01:00
"""
2021-12-19 09:30:51 +01:00
Création ou mise à jour d'un évènement.
2021-12-09 16:53:44 +01:00
"""
2022-02-03 12:30:29 +01:00
if event_id:
event = get_object_or_404(Event, pk=event_id)
2021-12-09 16:53:44 +01:00
data = {"place_related": event.place}
else:
event = None
data = {}
if request.method == "POST":
form = EventForm(request.POST, instance=event)
2021-12-09 16:53:44 +01:00
if form.is_valid():
event = form.save()
2022-02-01 11:08:02 +01:00
return HttpResponseRedirect(reverse("event_details", args=(event.pk,)))
else:
return render(request, "objectives/routines/create.html", {"form": form})
2021-12-09 16:53:44 +01:00
form = EventForm(instance=event, initial=data)
2022-02-03 12:30:29 +01:00
context = {"form": form, "event_id": event_id}
2021-12-09 16:53:44 +01:00
return render(request, "planning/events/create.html", context)
@require_http_methods(["POST"])
def link_gymnast_to_event(request):
2021-12-09 16:53:44 +01:00
"""Crée un lien entre un gymnaste et un évènement.
Returns:
Si tout se passe bien, un code 200 (Success) est retourné.
Excepts:
Si une erreur se produit lors de l'association, un code HTTP 409 (Conflict) est retourné.
Remarks:
Tu ne veux pas retourner le lien qui vient d'être créé ?
"""
try:
event_id = request.POST.get("event_id", None)
gymnast_id = request.POST.get("gymnast_id", None)
gymnast = get_object_or_404(Gymnast, pk=gymnast_id)
2022-02-03 12:30:29 +01:00
event = get_object_or_404(Event, pk=event_id)
2022-01-08 11:40:10 +01:00
EventParticipation.objects.create(gymnast=gymnast, event=event)
2021-12-09 16:53:44 +01:00
except:
return HttpResponse(409)
return HttpResponse(200)
@require_http_methods(["POST"])
def unlink_gymnast_from_event(request):
2021-12-09 16:53:44 +01:00
"""Supprime le lien entre un gymnaste et un évènement.
Remarks:
Fonctions `link_gymnast_to_event` et `unlink_gymnast_from_event` sont _très_ similaires.
2021-12-09 16:53:44 +01:00
Il faudrait sans doute mieux passer par une CBV, voire mieux: DRF ;-)
Surtout qu'ici, on gère directement des `link_between_g_and_e`, à ajouter ou supprimer.
"""
try:
event_id = request.POST.get("event_id", None)
gymnast_id = request.POST.get("gymnast_id", None)
gymnast = get_object_or_404(Gymnast, pk=gymnast_id)
2022-02-03 12:30:29 +01:00
event = get_object_or_404(Event, pk=event_id)
link = EventParticipation.objects.get(event=event, gymnast=gymnast).delete()
2021-12-09 16:53:44 +01:00
except:
return HttpResponse(409)
return HttpResponse(200)
def __get_event_list(request):
"""Récupère une liste d'évènement.
Par défaut, la liste est triée chronologiquement - le plus ancien étant le premier élément.
Cette fonction est utilisée pour l'affichage des évènements et au niveau du calendrier.
Args:
request (HttpRequest): La requête en entrée
pattern (str?): Optionnel. Permet de spécifier un pattern à appliquer à la recherche.
"""
pattern = request.GET.get("pattern", None)
if pattern:
event_list = Event.objects.filter(name__icontains=pattern)
else:
event_list = Event.objects.all()
return event_list.order_by("date_begin")
2021-12-09 16:53:44 +01:00
@login_required
@require_http_methods(["GET"])
def calendar(request):
2021-12-19 09:30:51 +01:00
"""Récupère la liste de tous évènements suivant un pattern si celui-ci est définit."""
2021-12-09 16:53:44 +01:00
event_list = __get_event_list(request)
context = {"event_list": event_list}
2022-02-03 19:34:14 +01:00
return render(request, "planning/events/grid.html", context)
2021-12-09 16:53:44 +01:00
@login_required
@require_http_methods(["GET"])
def event_listing(request):
"""
Récupère la liste de tous évènements suivant un pattern si celui-ci est
définit.
"""
event_list = __get_event_list(request)
context = {"event_list": event_list}
return render(request, "planning/events/list.html", context)
@login_required
@require_http_methods(["GET"])
2022-02-03 12:30:29 +01:00
def event_detail(request, event_id=None):
2021-12-09 16:53:44 +01:00
"""
Récupère toutes les informations d'un event.
:return: une instance de la classe `Event` et une liste de gymnastes liés
à l'évènement.
"""
2022-02-03 12:30:29 +01:00
# event = get_object_or_404(Event, pk=event_id)
event = Event.objects.get(pk=event_id)
2021-12-09 16:53:44 +01:00
gymnast_list = []
2022-01-07 18:08:39 +01:00
# today = timezone.now().date()
# tohour = timezone.now().time()
2021-12-09 16:53:44 +01:00
# if event.date_begin.date() > today:
2021-12-09 16:53:44 +01:00
# for gymnast in event.gymnasts.all():
# # pass
# gymnast_list.append((gymnast, counted, int((counted / 16) * 100)))
# else:
# gymnast_list = [(x, None, None) for x in event.gymnasts.all()]
gymnast_list = [(x, None, None) for x in event.gymnasts.all()]
context = {"event": event, "gymnast_list": gymnast_list}
return render(request, "planning/events/details.html", context)