diff --git a/bda/forms.py b/bda/forms.py index e2a1961b..2029645b 100644 --- a/bda/forms.py +++ b/bda/forms.py @@ -4,8 +4,6 @@ from __future__ import division from __future__ import print_function from __future__ import unicode_literals -from datetime import timedelta - from django import forms from django.forms.models import BaseInlineFormSet from django.utils import timezone @@ -45,6 +43,7 @@ class AttributionModelMultipleChoiceField(forms.ModelMultipleChoiceField): class ResellForm(forms.Form): attributions = AttributionModelMultipleChoiceField( + label='', queryset=Attribution.objects.none(), widget=forms.CheckboxSelectMultiple, required=False) @@ -58,6 +57,7 @@ class ResellForm(forms.Form): class AnnulForm(forms.Form): attributions = AttributionModelMultipleChoiceField( + label='', queryset=Attribution.objects.none(), widget=forms.CheckboxSelectMultiple, required=False) @@ -67,7 +67,7 @@ class AnnulForm(forms.Form): self.fields['attributions'].queryset = participant.attribution_set\ .filter(spectacle__date__gte=timezone.now(), revente__isnull=False, - revente__date__gt=timezone.now()-timedelta(hours=1), + revente__notif_sent=False, revente__soldTo__isnull=True) @@ -81,3 +81,19 @@ class InscriptionReventeForm(forms.Form): super(InscriptionReventeForm, self).__init__(*args, **kwargs) self.fields['spectacles'].queryset = tirage.spectacle_set.filter( date__gte=timezone.now()) + + +class SoldForm(forms.Form): + attributions = AttributionModelMultipleChoiceField( + label='', + queryset=Attribution.objects.none(), + widget=forms.CheckboxSelectMultiple) + + def __init__(self, participant, *args, **kwargs): + super(SoldForm, self).__init__(*args, **kwargs) + self.fields['attributions'].queryset = ( + participant.attribution_set + .filter(revente__isnull=False, + revente__soldTo__isnull=False) + .exclude(revente__soldTo=participant) + ) diff --git a/bda/templates/bda-revente.html b/bda/templates/bda-revente.html deleted file mode 100644 index 569a3f3a..00000000 --- a/bda/templates/bda-revente.html +++ /dev/null @@ -1,73 +0,0 @@ -{% extends "base_title.html" %} -{% load bootstrap %} - -{% block realcontent %} - -

Revente de place

-

Places non revendues

-
- {% csrf_token %} -
-
-
    - {% for box in resellform.attributions %} -
  • - {{box.tag}} - {{box.choice_label}} -
  • - {% endfor %} -
-
-
-
- -
-
-
-{% if annulform.attributions or overdue %} -

Places en cours de revente

-
- {% csrf_token %} -
-
-
    - {% for box in annulform.attributions %} -
  • - {{box.tag}} - {{box.choice_label}} -
  • - {% endfor %} - {% for attrib in overdue %} -
  • - - {{attrib.spectacle}} -
  • - {% endfor %} -
-
-
- {% if annulform.attributions %} - - {% endif %} -
-{% endif %} -
-{% if sold %} -

Places revendues

- - {% for attrib in sold %} - - - {% csrf_token %} - - - - - - - {% endfor %} -
{{attrib.spectacle}}{{attrib.revente.soldTo.user.get_full_name}}
-{% endif %} -{% endblock %} diff --git a/bda/templates/bda/reventes.html b/bda/templates/bda/reventes.html new file mode 100644 index 00000000..e61e7c8d --- /dev/null +++ b/bda/templates/bda/reventes.html @@ -0,0 +1,53 @@ +{% extends "base_title.html" %} +{% load bootstrap %} + +{% block realcontent %} + +

Revente de place

+{% if resellform.attributions %} +

Places non revendues

+
+ {% csrf_token %} + {{resellform|bootstrap}} +
+ +
+
+{% endif %} +
+{% if annulform.attributions or overdue %} +

Places en cours de revente

+
+ {% csrf_token %} +
+
+
    + {% for attrib in annulform.attributions %} +
  • {{attrib.tag}} {{attrib.choice_label}}
  • + {% endfor %} + {% for attrib in overdue %} +
  • + + {{attrib.spectacle}} +
  • + {% endfor %} + {% if annulform.attributions %} + + {% endif %} + +{% endif %} +
    +{% if soldform.attributions %} +

    Places revendues

    +
    + {% csrf_token %} + {{soldform|bootstrap}} + + +
    +{% endif %} +{% if not resellform.attributions and not soldform.attributions and not overdue and not annulform.attributions %} +

    Plus de reventes possibles !

    +{% endif %} + +{% endblock %} diff --git a/bda/views.py b/bda/views.py index 29067430..096aacf5 100644 --- a/bda/views.py +++ b/bda/views.py @@ -26,7 +26,7 @@ from bda.models import Spectacle, Participant, ChoixSpectacle, Attribution,\ Tirage, SpectacleRevente from bda.algorithm import Algorithm from bda.forms import BaseBdaFormSet, TokenForm, ResellForm, AnnulForm,\ - InscriptionReventeForm + InscriptionReventeForm, SoldForm @cof_required @@ -316,13 +316,18 @@ 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) + if not participant.paid: return render(request, "bda-notpaid.html", {}) + + resellform = ResellForm(participant, prefix='resell') + annulform = AnnulForm(participant, prefix='annul') + soldform = SoldForm(participant, prefix='sold') + if request.method == 'POST': # On met en vente une place if 'resell' in request.POST: resellform = ResellForm(participant, request.POST, prefix='resell') - annulform = AnnulForm(participant, prefix='annul') if resellform.is_valid(): datatuple = [] attributions = resellform.cleaned_data["attributions"] @@ -354,7 +359,6 @@ def revente(request, tirage_id): # On annule une revente elif 'annul' in request.POST: annulform = AnnulForm(participant, request.POST, prefix='annul') - resellform = ResellForm(participant, prefix='resell') if annulform.is_valid(): attributions = annulform.cleaned_data["attributions"] for attribution in attributions: @@ -362,58 +366,42 @@ def revente(request, tirage_id): # On confirme une vente en transférant la place à la personne qui a # gagné le tirage elif 'transfer' in request.POST: - resellform = ResellForm(participant, prefix='resell') - annulform = AnnulForm(participant, prefix='annul') + soldform = SoldForm(participant, request.POST, prefix='sold') + if soldform.is_valid(): + attributions = soldform.cleaned_data['attributions'] + for attribution in attributions: + attribution.participant = attribution.revente.soldTo + attribution.save() - revente_id = request.POST['transfer'][0] - rev = SpectacleRevente.objects.filter(soldTo__isnull=False, - id=revente_id) - if rev.exists(): - revente = rev.get() - attrib = revente.attribution - attrib.participant = revente.soldTo - attrib.save() # On annule la revente après le tirage au sort (par exemple si # la personne qui a gagné le tirage ne se manifeste pas). La place est # alors remise en vente elif 'reinit' in request.POST: - resellform = ResellForm(participant, prefix='resell') - annulform = AnnulForm(participant, prefix='annul') - revente_id = request.POST['reinit'][0] - rev = SpectacleRevente.objects.filter(soldTo__isnull=False, - id=revente_id) - if rev.exists(): - revente = rev.get() - if revente.attribution.spectacle.date > timezone.now(): - revente.date = timezone.now() - timedelta(hours=1) - revente.soldTo = None - revente.notif_sent = False - revente.tirage_done = False - revente.shotgun = False - if revente.answered_mail: - revente.answered_mail.clear() - revente.save() - - else: - resellform = ResellForm(participant, prefix='resell') - annulform = AnnulForm(participant, prefix='annul') - else: - resellform = ResellForm(participant, prefix='resell') - annulform = AnnulForm(participant, prefix='annul') + soldform = SoldForm(participant, request.POST, prefix='sold') + if soldform.is_valid(): + attributions = soldform.cleaned_data['attributions'] + for attribution in attributions: + if attribution.spectacle.date > timezone.now(): + revente = attribution.revente + revente.date = timezone.now() - timedelta(minutes=65) + revente.soldTo = None + revente.notif_sent = False + revente.tirage_done = False + revente.shotgun = False + if revente.answered_mail: + revente.answered_mail.clear() + revente.save() overdue = participant.attribution_set.filter( spectacle__date__gte=timezone.now(), revente__isnull=False, revente__seller=participant, - revente__date__lte=timezone.now()-timedelta(hours=1)).filter( + revente__notif_sent=True)\ + .filter( Q(revente__soldTo__isnull=True) | Q(revente__soldTo=participant)) - sold = participant.attribution_set.filter( - spectacle__date__gte=timezone.now(), - revente__isnull=False, - revente__soldTo__isnull=False) - return render(request, "bda-revente.html", - {'tirage': tirage, 'overdue': overdue, "sold": sold, + return render(request, "bda/reventes.html", + {'tirage': tirage, 'overdue': overdue, "soldform": soldform, "annulform": annulform, "resellform": resellform})