forked from DGNum/gestioCOF
Côté serveur du catalogue des spectacles BdA
This commit is contained in:
parent
a0a7be43e1
commit
f64a865de1
3 changed files with 61 additions and 2 deletions
|
@ -47,4 +47,6 @@ urlpatterns = [
|
|||
url(r'^mails-rappel/(?P<spectacle_id>\d+)$', views.send_rappel),
|
||||
url(r'^descriptions/(?P<tirage_id>\d+)$', views.descriptions_spectacles,
|
||||
name='bda-descriptions'),
|
||||
url(r'^catalogue/(?P<request_type>[a-z]*)$', views.catalogue,
|
||||
name='bda-catalogue'),
|
||||
]
|
||||
|
|
60
bda/views.py
60
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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue