forked from DGNum/gestioCOF
Merge branch 'master' into Kerl/fix_32_do_tirage
This commit is contained in:
commit
3aa9667eb9
28 changed files with 1010 additions and 605 deletions
144
bda/views.py
144
bda/views.py
|
@ -10,7 +10,7 @@ from django.core import serializers
|
|||
from django.forms.models import inlineformset_factory
|
||||
import hashlib
|
||||
|
||||
from django.core.mail import send_mail
|
||||
from django.core.mail import send_mail
|
||||
from django.utils import timezone
|
||||
from django.views.generic.list import ListView
|
||||
|
||||
|
@ -18,11 +18,13 @@ from datetime import timedelta
|
|||
import time
|
||||
|
||||
from gestioncof.decorators import cof_required, buro_required
|
||||
from bda.models import Spectacle, Participant, ChoixSpectacle, Attribution, Tirage
|
||||
from bda.models import Spectacle, Participant, ChoixSpectacle, Attribution,\
|
||||
Tirage
|
||||
from bda.algorithm import Algorithm
|
||||
|
||||
from bda.forms import BaseBdaFormSet, TokenForm, ResellForm
|
||||
|
||||
|
||||
@cof_required
|
||||
def etat_places(request, tirage_id):
|
||||
tirage = get_object_or_404(Tirage, id=tirage_id)
|
||||
|
@ -30,13 +32,13 @@ def etat_places(request, tirage_id):
|
|||
.filter(spectacle__tirage=tirage) \
|
||||
.filter(double_choice="1") \
|
||||
.all() \
|
||||
.values('spectacle','spectacle__title') \
|
||||
.values('spectacle', 'spectacle__title') \
|
||||
.annotate(total=models.Count('spectacle'))
|
||||
spectacles2 = ChoixSpectacle.objects \
|
||||
.filter(spectacle__tirage=tirage) \
|
||||
.exclude(double_choice="1") \
|
||||
.all() \
|
||||
.values('spectacle','spectacle__title') \
|
||||
.values('spectacle', 'spectacle__title') \
|
||||
.annotate(total=models.Count('spectacle'))
|
||||
spectacles = tirage.spectacle_set.all()
|
||||
spectacles_dict = {}
|
||||
|
@ -50,15 +52,16 @@ def etat_places(request, tirage_id):
|
|||
spectacles_dict[spectacle["spectacle"]].ratio = \
|
||||
spectacles_dict[spectacle["spectacle"]].total / \
|
||||
spectacles_dict[spectacle["spectacle"]].slots
|
||||
total += spectacle["total"]
|
||||
total += spectacle["total"]
|
||||
for spectacle in spectacles2:
|
||||
spectacles_dict[spectacle["spectacle"]].total += 2*spectacle["total"]
|
||||
spectacles_dict[spectacle["spectacle"]].ratio = \
|
||||
spectacles_dict[spectacle["spectacle"]].total / \
|
||||
spectacles_dict[spectacle["spectacle"]].slots
|
||||
total += spectacle["total"]
|
||||
total += spectacle["total"]
|
||||
return render(request, "etat-places.html",
|
||||
{"spectacles": spectacles, "total": total, 'tirage': tirage})
|
||||
{"spectacles": spectacles, "total": total, 'tirage': tirage})
|
||||
|
||||
|
||||
def _hash_queryset(queryset):
|
||||
data = serializers.serialize("json", queryset)
|
||||
|
@ -66,13 +69,14 @@ def _hash_queryset(queryset):
|
|||
hasher.update(data)
|
||||
return hasher.hexdigest()
|
||||
|
||||
|
||||
@cof_required
|
||||
def places(request, tirage_id):
|
||||
tirage = get_object_or_404(Tirage, id=tirage_id)
|
||||
participant, created = Participant.objects.get_or_create(
|
||||
user=request.user, tirage=tirage)
|
||||
user=request.user, tirage=tirage)
|
||||
places = participant.attribution_set.order_by(
|
||||
"spectacle__date", "spectacle").all()
|
||||
"spectacle__date", "spectacle").all()
|
||||
total = sum([place.spectacle.price for place in places])
|
||||
filtered_places = []
|
||||
places_dict = {}
|
||||
|
@ -99,13 +103,14 @@ def places(request, tirage_id):
|
|||
"total": total,
|
||||
"warning": warning})
|
||||
|
||||
@cof_required
|
||||
|
||||
@cof_required
|
||||
def places_ics(request, tirage_id):
|
||||
tirage = get_object_or_404(Tirage, id=tirage_id)
|
||||
participant, created = Participant.objects.get_or_create(
|
||||
user=request.user, tirage=tirage)
|
||||
user=request.user, tirage=tirage)
|
||||
places = participant.attribution_set.order_by(
|
||||
"spectacle__date", "spectacle").all()
|
||||
"spectacle__date", "spectacle").all()
|
||||
filtered_places = []
|
||||
places_dict = {}
|
||||
spectacles = []
|
||||
|
@ -114,7 +119,8 @@ def places_ics(request, tirage_id):
|
|||
places_dict[place.spectacle].double = True
|
||||
else:
|
||||
place.double = False
|
||||
place.spectacle.dtend = place.spectacle.date + timedelta(seconds=7200)
|
||||
place.spectacle.dtend = place.spectacle.date \
|
||||
+ timedelta(seconds=7200)
|
||||
places_dict[place.spectacle] = place
|
||||
spectacles.append(place.spectacle)
|
||||
filtered_places.append(place)
|
||||
|
@ -122,35 +128,38 @@ def places_ics(request, tirage_id):
|
|||
{"participant": participant,
|
||||
"places": filtered_places}, content_type="text/calendar")
|
||||
|
||||
|
||||
@cof_required
|
||||
def inscription(request, tirage_id):
|
||||
tirage = get_object_or_404(Tirage, id=tirage_id)
|
||||
if timezone.now() < tirage.ouverture:
|
||||
error_desc = "Ouverture le %s" % (
|
||||
tirage.ouverture.strftime('%d %b %Y à %H:%M'))
|
||||
tirage.ouverture.strftime('%d %b %Y à %H:%M'))
|
||||
return render(request, 'resume_inscription.html',
|
||||
{ "error_title": "Le tirage n'est pas encore ouvert !",
|
||||
"error_description": error_desc })
|
||||
{"error_title": "Le tirage n'est pas encore ouvert !",
|
||||
"error_description": error_desc})
|
||||
if timezone.now() > tirage.fermeture:
|
||||
participant, created = Participant.objects.get_or_create(
|
||||
user=request.user, tirage=tirage)
|
||||
user=request.user, tirage=tirage)
|
||||
choices = participant.choixspectacle_set.order_by("priority").all()
|
||||
return render(request, "resume_inscription.html",
|
||||
{ "error_title": "C'est fini !",
|
||||
"error_description": u"Tirage au sort dans la journée !",
|
||||
"choices": choices})
|
||||
{"error_title": "C'est fini !",
|
||||
"error_description":
|
||||
u"Tirage au sort dans la journée !",
|
||||
"choices": choices})
|
||||
|
||||
def formfield_callback(f, **kwargs):
|
||||
if f.name == "spectacle":
|
||||
kwargs['queryset'] = tirage.spectacle_set
|
||||
return f.formfield(**kwargs)
|
||||
BdaFormSet = inlineformset_factory(
|
||||
Participant,
|
||||
ChoixSpectacle,
|
||||
fields=("spectacle","double_choice","priority"),
|
||||
formset=BaseBdaFormSet,
|
||||
formfield_callback=formfield_callback)
|
||||
Participant,
|
||||
ChoixSpectacle,
|
||||
fields=("spectacle", "double_choice", "priority"),
|
||||
formset=BaseBdaFormSet,
|
||||
formfield_callback=formfield_callback)
|
||||
participant, created = Participant.objects.get_or_create(
|
||||
user=request.user, tirage=tirage)
|
||||
user=request.user, tirage=tirage)
|
||||
success = False
|
||||
stateerror = False
|
||||
if request.method == "POST":
|
||||
|
@ -170,14 +179,16 @@ def inscription(request, tirage_id):
|
|||
total_price = 0
|
||||
for choice in participant.choixspectacle_set.all():
|
||||
total_price += choice.spectacle.price
|
||||
if choice.double: total_price += choice.spectacle.price
|
||||
if choice.double:
|
||||
total_price += choice.spectacle.price
|
||||
return render(request, "inscription-bda.html",
|
||||
{ "formset": formset,
|
||||
"success": success,
|
||||
"total_price": total_price,
|
||||
"dbstate": dbstate,
|
||||
'tirage': tirage,
|
||||
"stateerror": stateerror})
|
||||
{"formset": formset,
|
||||
"success": success,
|
||||
"total_price": total_price,
|
||||
"dbstate": dbstate,
|
||||
'tirage': tirage,
|
||||
"stateerror": stateerror})
|
||||
|
||||
|
||||
def do_tirage(request, tirage_id):
|
||||
tirage_elt = get_object_or_404(Tirage, id=tirage_id)
|
||||
|
@ -188,8 +199,8 @@ def do_tirage(request, tirage_id):
|
|||
data = {}
|
||||
shows = tirage_elt.spectacle_set.select_related().all()
|
||||
members = tirage_elt.participant_set.all()
|
||||
choices = ChoixSpectacle.objects.filter(spectacle__tirage=tirage_elt).order_by(
|
||||
'participant', 'priority').select_related().all()
|
||||
choices = ChoixSpectacle.objects.filter(spectacle__tirage=tirage_elt) \
|
||||
.order_by('participant', 'priority').select_related().all()
|
||||
algo = Algorithm(shows, members, choices)
|
||||
results = algo(form.cleaned_data["token"])
|
||||
total_slots = 0
|
||||
|
@ -219,8 +230,9 @@ def do_tirage(request, tirage_id):
|
|||
data["duration"] = time.time() - start
|
||||
if request.user.is_authenticated():
|
||||
members2 = {}
|
||||
members_uniq = {} # Participant objects are not shared accross spectacle results,
|
||||
# So assign a single object for each Participant id
|
||||
# Participant objects are not shared accross spectacle results,
|
||||
# so assign a single object for each Participant id
|
||||
members_uniq = {}
|
||||
for (show, members, _) in results:
|
||||
for (member, _, _, _) in members:
|
||||
if member.id not in members_uniq:
|
||||
|
@ -235,7 +247,7 @@ def do_tirage(request, tirage_id):
|
|||
# À partir d'ici, le tirage devient effectif
|
||||
Attribution.objects.filter(spectacle__tirage=tirage_elt).delete()
|
||||
tirage_elt.tokens += "%s\n\"\"\"%s\"\"\"\n" % (
|
||||
timezone.now().strftime("%y-%m-%d %H:%M:%S"),
|
||||
timezone.now().strftime("%y-%m-%d %H:%M:%S"),
|
||||
form.cleaned_data['token'])
|
||||
tirage_elt.enable_do_tirage = False
|
||||
tirage_elt.save()
|
||||
|
@ -247,6 +259,7 @@ def do_tirage(request, tirage_id):
|
|||
else:
|
||||
return render(request, "bda-attrib.html", data)
|
||||
|
||||
|
||||
@buro_required
|
||||
def tirage(request, tirage_id):
|
||||
tirage_elt = get_object_or_404(Tirage, id=tirage_id)
|
||||
|
@ -260,6 +273,7 @@ def tirage(request, tirage_id):
|
|||
form = TokenForm()
|
||||
return render(request, "bda-token.html", {"form": form})
|
||||
|
||||
|
||||
def do_resell(request, form):
|
||||
spectacle = form.cleaned_data["spectacle"]
|
||||
count = form.cleaned_data["count"]
|
||||
|
@ -270,18 +284,20 @@ Je souhaite revendre %s pour %s le %s (%s) à %.02f€.
|
|||
Contactez moi par email si vous êtes intéressé·e·s !
|
||||
|
||||
%s (%s)""" % (places, spectacle.title, spectacle.date_no_seconds(),
|
||||
spectacle.location, spectacle.price, request.user.get_full_name(),
|
||||
request.user.email)
|
||||
spectacle.location, spectacle.price,
|
||||
request.user.get_full_name(), request.user.email)
|
||||
send_mail("%s" % spectacle, mail,
|
||||
request.user.email, ["bda-revente@lists.ens.fr"],
|
||||
fail_silently = False)
|
||||
return render(request, "bda-success.html", {"show": spectacle, "places": places})
|
||||
fail_silently=False)
|
||||
return render(request, "bda-success.html",
|
||||
{"show": spectacle, "places": places})
|
||||
|
||||
|
||||
@login_required
|
||||
def revente(request, tirage_id):
|
||||
tirage = get_object_or_404(Tirage, id=tirage_id)
|
||||
participant, created = Participant.objects.get_or_create(
|
||||
user=request.user, tirage=tirage)
|
||||
user=request.user, tirage=tirage)
|
||||
if not participant.paid:
|
||||
return render(request, "bda-notpaid.html", {})
|
||||
if request.POST:
|
||||
|
@ -290,7 +306,9 @@ def revente(request, tirage_id):
|
|||
return do_resell(request, form)
|
||||
else:
|
||||
form = ResellForm(participant)
|
||||
return render(request, "bda-revente.html", {"form": form, 'tirage': tirage})
|
||||
return render(request, "bda-revente.html",
|
||||
{"form": form, 'tirage': tirage})
|
||||
|
||||
|
||||
@buro_required
|
||||
def spectacle(request, tirage_id, spectacle_id):
|
||||
|
@ -300,52 +318,56 @@ def spectacle(request, tirage_id, spectacle_id):
|
|||
participants = {}
|
||||
for attrib in attributions:
|
||||
participant = attrib.participant
|
||||
participant_info = {'lastname': participant.user.last_name,
|
||||
'name': participant.user.get_full_name,
|
||||
'username': participant.user.username,
|
||||
'email': participant.user.email,
|
||||
'given': int(attrib.given),
|
||||
'paid': participant.paid,
|
||||
participant_info = {'lastname': participant.user.last_name,
|
||||
'name': participant.user.get_full_name,
|
||||
'username': participant.user.username,
|
||||
'email': participant.user.email,
|
||||
'given': int(attrib.given),
|
||||
'paid': participant.paid,
|
||||
'nb_places': 1}
|
||||
if participant.id in participants:
|
||||
participants[participant.id]['nb_places'] += 1
|
||||
participants[participant.id]['nb_places'] += 1
|
||||
participants[participant.id]['given'] += attrib.given
|
||||
else:
|
||||
participants[participant.id] = participant_info
|
||||
|
||||
participants_info = sorted(participants.values(),
|
||||
key=lambda part: part['lastname'])
|
||||
return render(request, "bda-participants.html",
|
||||
{"spectacle": spectacle, "participants": participants_info})
|
||||
participants_info = sorted(participants.values(),
|
||||
key=lambda part: part['lastname'])
|
||||
return render(request, "bda-participants.html",
|
||||
{"spectacle": spectacle, "participants": participants_info})
|
||||
|
||||
|
||||
class SpectacleListView(ListView):
|
||||
model = Spectacle
|
||||
template_name = 'spectacle_list.html'
|
||||
|
||||
def get_queryset(self):
|
||||
self.tirage = get_object_or_404(Tirage, id=self.kwargs['tirage_id'])
|
||||
categories = self.tirage.spectacle_set.all()
|
||||
return categories
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super(SpectacleListView, self).get_context_data(**kwargs)
|
||||
context['tirage_id'] = self.tirage.id
|
||||
context['tirage_name'] = self.tirage.title
|
||||
return context
|
||||
|
||||
|
||||
@buro_required
|
||||
def unpaid(request, tirage_id):
|
||||
tirage = get_object_or_404(Tirage, id=tirage_id)
|
||||
unpaid = tirage.participant_set \
|
||||
.annotate(nb_attributions=Count('attribution')) \
|
||||
.filter(paid=False, nb_attributions__gt=0).all()
|
||||
.annotate(nb_attributions=Count('attribution')) \
|
||||
.filter(paid=False, nb_attributions__gt=0).all()
|
||||
return render(request, "bda-unpaid.html", {"unpaid": unpaid})
|
||||
|
||||
@buro_required
|
||||
|
||||
@buro_required
|
||||
def liste_spectacles_ics(request, tirage_id):
|
||||
tirage = get_object_or_404(Tirage, id=tirage_id)
|
||||
spectacles = tirage.spectacle_set.order_by("date").all()
|
||||
for spectacle in spectacles:
|
||||
spectacle.dtend = spectacle.date + timedelta(seconds=7200)
|
||||
return render(request, "liste_spectacles.ics",
|
||||
{"spectacles": spectacles, "tirage": tirage},
|
||||
content_type="text/calendar")
|
||||
|
||||
{"spectacles": spectacles, "tirage": tirage},
|
||||
content_type="text/calendar")
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue