diff --git a/bda/urls.py b/bda/urls.py index bbbf8e39..0af14b53 100644 --- a/bda/urls.py +++ b/bda/urls.py @@ -47,4 +47,6 @@ urlpatterns = [ url(r'^mails-rappel/(?P\d+)$', views.send_rappel), url(r'^descriptions/(?P\d+)$', views.descriptions_spectacles, name='bda-descriptions'), + url(r'^catalogue/(?P[a-z]*)$', views.catalogue, + name='bda-catalogue'), ] diff --git a/bda/views.py b/bda/views.py index 096aacf5..cdc7a296 100644 --- a/bda/views.py +++ b/bda/views.py @@ -3,7 +3,9 @@ import random import hashlib import time +import json from datetime import timedelta +from more_itertools import unique_everseen from custommail.shortcuts import ( send_mass_custom_mail, send_custom_mail, render_custom_mail ) @@ -15,7 +17,7 @@ from django.db import models, transaction from django.core import serializers from django.db.models import Count, Q, Sum from django.forms.models import inlineformset_factory -from django.http import HttpResponseBadRequest, HttpResponseRedirect +from django.http import HttpResponseBadRequest, HttpResponseRedirect, HttpResponse from django.core.urlresolvers import reverse from django.conf import settings from django.utils import timezone, formats @@ -23,7 +25,7 @@ from django.views.generic.list import ListView from gestioncof.decorators import cof_required, buro_required from bda.models import Spectacle, Participant, ChoixSpectacle, Attribution,\ - Tirage, SpectacleRevente + Tirage, SpectacleRevente, Salle from bda.algorithm import Algorithm from bda.forms import BaseBdaFormSet, TokenForm, ResellForm, AnnulForm,\ InscriptionReventeForm, SoldForm @@ -639,3 +641,57 @@ def descriptions_spectacles(request, tirage_id): return HttpResponseBadRequest( "La variable GET 'location' doit contenir un entier") return render(request, 'descriptions.html', {'shows': shows_qs.all()}) + +def catalogue(request,request_type): + """ + Vue destinée à communiquer avec un client AJAX, fournissant soit : + - la liste des tirages + - les catégories et salles d'un tirage + - les descriptions d'un tirage (filtrées selon la catégorie et la salle) + """ + if request_type == "list": + # Dans ce cas on retourne la liste des tirages et de leur id sous forme de JSON + data_return = [{'id':tirage.id, 'title':tirage.title} for tirage in Tirage.objects.all()] + return HttpResponse(json.dumps(data_return)) + if request_type == "details": + # Dans ce cas on retourne une liste des catégories et des salles du tirage + try : + tirage_id = request.GET.get('id', '') + tirage = get_object_or_404(Tirage, id=tirage_id) + except: + return HttpResponseBadRequest() + categories = list(unique_everseen([str(spectacle.category) for spectacle in tirage.spectacle_set.all()])) + categories.remove('None') + locations = list(unique_everseen([str(spectacle.location) for spectacle in tirage.spectacle_set.all()])) + data_return = [{'categories':categories, 'locations':locations}] + return HttpResponse(json.dumps(data_return)) + if request_type == "descriptions": + # Ici on retourne les descriptions correspondant à la catégorie et à la salle spécifiées + locations = {} + for salle in Salle.objects.all(): + locations[salle.name] = salle.id + try: + tirage_id = request.GET.get('id', '') + category_name = request.GET.get('category', '') + location_name = request.GET.get('location', '') + tirage = get_object_or_404(Tirage, id=tirage_id) + + shows_qs = tirage.spectacle_set + if category_name: + shows_qs = shows_qs.filter(category__name=category_name) + if location_name: + shows_qs = shows_qs.filter(location__id=locations[location_name]) + except: + return HttpResponseBadRequest("Impossible de trouver des résultats correspondant à ces caractéristiques") + + def getImgUrl(obj): + """ Cette fonction permet de gérer les cas où il n'y a pas d'image """ + try: + return obj.image.url + except: + return '' + + # On convertit les descriptions à envoyer en une liste facilement JSONifiable (il devrait y avoir un moyen plus efficace en redéfinissant le serializer de JSON) + data_return = [{'title': spectacle.title, 'category': str(spectacle.category), 'date': str(spectacle.date), 'location': str(spectacle.location), 'vips': spectacle.vips, 'description': spectacle.description, 'slots_description': spectacle.slots_description, 'image': getImgUrl(spectacle), 'ext_link': spectacle.ext_link, 'price': spectacle.price, 'slots': spectacle.slots} for spectacle in shows_qs.all()] + return HttpResponse(json.dumps(data_return)) + return HttpResponseBadRequest() # Si la requête n'est pas de la forme attendue, on quitte avec une erreur diff --git a/provisioning/bootstrap.sh b/provisioning/bootstrap.sh index 269e4f25..a08d9282 100644 --- a/provisioning/bootstrap.sh +++ b/provisioning/bootstrap.sh @@ -11,6 +11,7 @@ DBPASSWD="4KZt3nGPLVeWSvtBZPSM3fSzXpzEU4" apt-get update && apt-get install -y python3-pip python3-dev python3-venv \ libmysqlclient-dev libjpeg-dev git redis-server pip install -U pip +pip install more_itertools # Configuration et installation de mysql. Le mot de passe root est le même que # le mot de passe pour l'utilisateur local - pour rappel, ceci est une instance