216 lines
6.7 KiB
Python
216 lines
6.7 KiB
Python
from django.contrib.auth.decorators import login_required
|
|
from django.http import HttpResponseRedirect, HttpResponse, JsonResponse
|
|
from django.shortcuts import render, get_object_or_404
|
|
from django.views.decorators.http import require_http_methods
|
|
from django.urls import reverse
|
|
from django.core.mail import send_mail
|
|
from django.conf import settings
|
|
|
|
import pendulum
|
|
|
|
from jarvis.people.models import Gymnast
|
|
|
|
from .models import (
|
|
Event,
|
|
EventParticipation,
|
|
)
|
|
|
|
from .forms import EventForm
|
|
|
|
|
|
@login_required
|
|
@require_http_methods(["POST"])
|
|
def event_lookup(request):
|
|
"""
|
|
Récupère la liste de tous évènements suivant un pattern si celui-ci est
|
|
définit.
|
|
"""
|
|
results = []
|
|
pattern = request.POST.get("pattern", None)
|
|
|
|
if pattern is not None and len(pattern) >= 3:
|
|
model_results = Event.objects.filter(name__icontains=pattern).order_by(
|
|
"date_begin"
|
|
)
|
|
results = [{"ID": x.id, "Name": str(x)} for x in model_results]
|
|
return JsonResponse(results, safe=False)
|
|
|
|
|
|
@login_required
|
|
@require_http_methods(["GET", "POST"])
|
|
def event_create_or_update(request, event_id=None):
|
|
"""
|
|
Création ou mise à jour d'un évènement.
|
|
"""
|
|
|
|
if event_id:
|
|
event = get_object_or_404(Event, pk=event_id)
|
|
data = {"place_related": event.place}
|
|
else:
|
|
event = None
|
|
data = {}
|
|
|
|
if request.method == "POST":
|
|
form = EventForm(request.POST, instance=event)
|
|
|
|
if form.is_valid():
|
|
event = form.save()
|
|
return HttpResponseRedirect(reverse("event_details", args=(event.pk,)))
|
|
else:
|
|
return render(request, "objectives/routines/create.html", {"form": form})
|
|
|
|
form = EventForm(instance=event, initial=data)
|
|
context = {"form": form, "event_id": event_id}
|
|
return render(request, "events/create.html", context)
|
|
|
|
|
|
@require_http_methods(["POST"])
|
|
def link_gymnast_to_event(request):
|
|
"""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)
|
|
event = get_object_or_404(Event, pk=event_id)
|
|
EventParticipation.objects.create(gymnast=gymnast, event=event)
|
|
|
|
send_mail(
|
|
"Association à un évènement.",
|
|
"Vous avez été associé(e) à un évènement.",
|
|
settings.EMAIL_HOST_USER,
|
|
[gymnast.user.email, gymnast.email_trainer],
|
|
fail_silently=False,
|
|
html_message="""<p>Bonjour,</p>
|
|
<p>Vous avez été associé(e) à un évènement. Vous pouvez consulter les détails de l'évènement <a href='"
|
|
+ request.build_absolute_uri(
|
|
reverse(
|
|
"event_details", args=(event_id)
|
|
)
|
|
)
|
|
+ "'>ici</a>.</p><br /><p>Excellente journée</p><p>Jarvis</p>""",
|
|
)
|
|
except Exception:
|
|
return HttpResponse(409)
|
|
|
|
return HttpResponse(200)
|
|
|
|
|
|
@require_http_methods(["POST"])
|
|
def unlink_gymnast_from_event(request):
|
|
"""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.
|
|
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.
|
|
"""
|
|
event_id = request.POST.get("event_id", None)
|
|
gymnast_id = request.POST.get("gymnast_id", None)
|
|
|
|
try:
|
|
EventParticipation.objects.get(event=event_id, gymnast=gymnast_id).delete()
|
|
except Exception:
|
|
return HttpResponse(409)
|
|
|
|
return HttpResponse(200)
|
|
|
|
|
|
def __get_event_list(request, from_date=None, to_date=None):
|
|
"""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)
|
|
|
|
event_list = Event.objects.all()
|
|
|
|
if pattern:
|
|
event_list = event_list.filter(name__icontains=pattern)
|
|
|
|
if from_date:
|
|
event_list = event_list.filter(date_end__gte=from_date)
|
|
|
|
if to_date:
|
|
event_list = event_list.filter(date_begin__lte=to_date)
|
|
|
|
return event_list.order_by("date_begin")
|
|
|
|
|
|
@login_required
|
|
@require_http_methods(["GET"])
|
|
def calendar(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, "events/grid.html", context)
|
|
|
|
|
|
@login_required
|
|
@require_http_methods(["GET"])
|
|
def next_event_listing(request):
|
|
"""
|
|
Récupère la liste de tous évènements suivant un pattern si celui-ci est
|
|
définit.
|
|
"""
|
|
today = pendulum.today()
|
|
event_list = __get_event_list(request, from_date=today)
|
|
context = {"event_list": event_list}
|
|
return render(request, "events/list.html", context)
|
|
|
|
|
|
@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, "events/list.html", context)
|
|
|
|
|
|
@login_required
|
|
@require_http_methods(["GET"])
|
|
def event_detail(request, event_id=None):
|
|
"""
|
|
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.
|
|
"""
|
|
# event = get_object_or_404(Event, pk=event_id)
|
|
event = Event.objects.get(pk=event_id)
|
|
|
|
gymnast_list = []
|
|
# today = timezone.now().date()
|
|
# tohour = timezone.now().time()
|
|
|
|
# if event.date_begin.date() > today:
|
|
# 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, "events/details.html", context)
|