from datetime import datetime from django.contrib.auth.decorators import login_required from django.db.models import Q from django.http import HttpResponseRedirect, 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 .models import ( Club, Place, Country, ) from .forms import PlaceForm def __difference_between_times(end, start): """ Prend deux `datetime.time` en paramètre et calcul la différence entre les deux. """ startdate = datetime(2000, 1, 1, start.hour, start.minute) enddate = datetime(2000, 1, 1, end.hour, end.minute) return enddate - startdate @login_required @require_http_methods(["POST"]) def place_lookup(request): """ Récupère la liste des lieux à la volée suivant des caractères de recherche entrés. """ place_list = [] pattern = request.POST.get("pattern", None) if pattern is not None and len(pattern) >= 3: results = Place.objects.filter( Q(name__icontains=pattern) | Q(city__icontains=pattern) ) place_list = [{"ID": x.id, "Label": str(x)} for x in results] return JsonResponse(place_list, safe=False) @login_required @require_http_methods(["POST"]) def country_lookup(request): """ Récupère la liste des pays à la volée suivant des caractères de recherche entrés. """ country_list = [] pattern = request.POST.get("pattern", None) print(pattern) if pattern is not None and len(pattern) >= 3: results = Country.objects.filter( Q(name__icontains=pattern) | Q(nationality__icontains=pattern) ) country_list = [{"id": x.id, "Label": str(x)} for x in results] return JsonResponse(country_list, safe=False) @login_required @require_http_methods(["GET"]) def place_listing(request): """ Liste tous les lieux connus """ place_list = Place.objects.all() context = {"place_list": place_list} return render(request, "places/list.html", context) @login_required @require_http_methods(["GET", "POST"]) def place_create_or_update(request, place_id=None): """ Formulaire de création d'un nouveau lieu. """ if place_id: place = get_object_or_404(Place, pk=place_id) data = {"country_related": place.country} else: place = None data = {} if request.method == "POST": form = PlaceForm(request.POST, instance=place) if form.is_valid(): place = form.save() return HttpResponseRedirect(reverse("place_details", args=(place.pk,))) else: return render(request, "places/create.html", {"form": form}) form = PlaceForm(instance=place, initial=data) context = {"form": form, "place_id": place_id} return render(request, "places/create.html", context) @login_required @require_http_methods(["GET"]) def place_details(request, place_id): """ Récupère toutes les informations d'un lieu. """ place = get_object_or_404(Place, pk=place_id) context = {"place": place} return render(request, "places/details.html", context) @login_required @require_http_methods(["GET"]) def club_listing(request): """Liste tous les clubs connus""" club_list = Club.objects.all() context = {"club_list": club_list} return render(request, "clubs/list.html", context) @login_required @require_http_methods(["POST"]) def club_lookup(request): """ Récupère la liste des gymnastes à la volée suivant des caractères de recherche entrés. (min 3 caractères) """ results = [] pattern = request.POST.get("pattern", None) if pattern is not None and len(pattern) > 3: model_results = Club.objects.filter( Q(name__icontains=pattern) | Q(place__city__icontains=pattern) | Q(acronym__icontains=pattern) ) results = [{"ID": x.id, "Name": str(x)} for x in model_results] return JsonResponse(results, safe=False)