Côté serveur du catalogue des spectacles BdA

This commit is contained in:
Hugo Roussille 2017-03-15 07:37:24 +01:00
parent a0a7be43e1
commit f64a865de1
3 changed files with 61 additions and 2 deletions

View file

@ -47,4 +47,6 @@ urlpatterns = [
url(r'^mails-rappel/(?P<spectacle_id>\d+)$', views.send_rappel), url(r'^mails-rappel/(?P<spectacle_id>\d+)$', views.send_rappel),
url(r'^descriptions/(?P<tirage_id>\d+)$', views.descriptions_spectacles, url(r'^descriptions/(?P<tirage_id>\d+)$', views.descriptions_spectacles,
name='bda-descriptions'), name='bda-descriptions'),
url(r'^catalogue/(?P<request_type>[a-z]*)$', views.catalogue,
name='bda-catalogue'),
] ]

View file

@ -3,7 +3,9 @@
import random import random
import hashlib import hashlib
import time import time
import json
from datetime import timedelta from datetime import timedelta
from more_itertools import unique_everseen
from custommail.shortcuts import ( from custommail.shortcuts import (
send_mass_custom_mail, send_custom_mail, render_custom_mail 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.core import serializers
from django.db.models import Count, Q, Sum from django.db.models import Count, Q, Sum
from django.forms.models import inlineformset_factory 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.core.urlresolvers import reverse
from django.conf import settings from django.conf import settings
from django.utils import timezone, formats 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 gestioncof.decorators import cof_required, buro_required
from bda.models import Spectacle, Participant, ChoixSpectacle, Attribution,\ from bda.models import Spectacle, Participant, ChoixSpectacle, Attribution,\
Tirage, SpectacleRevente Tirage, SpectacleRevente, Salle
from bda.algorithm import Algorithm from bda.algorithm import Algorithm
from bda.forms import BaseBdaFormSet, TokenForm, ResellForm, AnnulForm,\ from bda.forms import BaseBdaFormSet, TokenForm, ResellForm, AnnulForm,\
InscriptionReventeForm, SoldForm InscriptionReventeForm, SoldForm
@ -639,3 +641,57 @@ def descriptions_spectacles(request, tirage_id):
return HttpResponseBadRequest( return HttpResponseBadRequest(
"La variable GET 'location' doit contenir un entier") "La variable GET 'location' doit contenir un entier")
return render(request, 'descriptions.html', {'shows': shows_qs.all()}) 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

View file

@ -11,6 +11,7 @@ DBPASSWD="4KZt3nGPLVeWSvtBZPSM3fSzXpzEU4"
apt-get update && apt-get install -y python3-pip python3-dev python3-venv \ apt-get update && apt-get install -y python3-pip python3-dev python3-venv \
libmysqlclient-dev libjpeg-dev git redis-server libmysqlclient-dev libjpeg-dev git redis-server
pip install -U pip pip install -U pip
pip install more_itertools
# Configuration et installation de mysql. Le mot de passe root est le même que # 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 # le mot de passe pour l'utilisateur local - pour rappel, ceci est une instance