Add unsubscribe option + list of current draws

This commit is contained in:
Ludovic Stephan 2017-10-23 17:25:58 +02:00
parent fccad5edee
commit 732e47707e
5 changed files with 126 additions and 11 deletions

View file

@ -4,7 +4,7 @@ from django import forms
from django.forms.models import BaseInlineFormSet from django.forms.models import BaseInlineFormSet
from django.utils import timezone from django.utils import timezone
from bda.models import Attribution, Spectacle from bda.models import Attribution, Spectacle, SpectacleRevente
class InscriptionInlineFormSet(BaseInlineFormSet): class InscriptionInlineFormSet(BaseInlineFormSet):
@ -45,6 +45,9 @@ class AttributionModelMultipleChoiceField(forms.ModelMultipleChoiceField):
def label_from_instance(self, obj): def label_from_instance(self, obj):
return "%s" % str(obj.spectacle) return "%s" % str(obj.spectacle)
class ReventeModelMultipleChoiceField(forms.ModelMultipleChoiceField):
def label_from_instance(self, obj):
return "%s" % str(obj.attribution.spectacle)
class ResellForm(forms.Form): class ResellForm(forms.Form):
attributions = AttributionModelMultipleChoiceField( attributions = AttributionModelMultipleChoiceField(
@ -63,7 +66,6 @@ class ResellForm(forms.Form):
'participant__user') 'participant__user')
) )
class AnnulForm(forms.Form): class AnnulForm(forms.Form):
attributions = AttributionModelMultipleChoiceField( attributions = AttributionModelMultipleChoiceField(
label='', label='',
@ -83,7 +85,6 @@ class AnnulForm(forms.Form):
'participant__user') 'participant__user')
) )
class InscriptionReventeForm(forms.Form): class InscriptionReventeForm(forms.Form):
spectacles = forms.ModelMultipleChoiceField( spectacles = forms.ModelMultipleChoiceField(
queryset=Spectacle.objects.none(), queryset=Spectacle.objects.none(),
@ -98,6 +99,40 @@ class InscriptionReventeForm(forms.Form):
.filter(date__gte=timezone.now()) .filter(date__gte=timezone.now())
) )
class ReventeTirageAnnulForm(forms.Form):
reventes = ReventeModelMultipleChoiceField(
label='',
queryset=SpectacleRevente.objects.none(),
widget=forms.CheckboxSelectMultiple,
required=False
)
def __init__(self, participant, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['reventes'].queryset = (
participant.wanted.filter(soldTo__isnull=True)
.select_related('attribution__spectacle')
)
class ReventeTirageForm(forms.Form):
reventes = ReventeModelMultipleChoiceField(
label='',
queryset=SpectacleRevente.objects.none(),
widget=forms.CheckboxSelectMultiple,
required=False
)
def __init__(self, participant, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['reventes'].queryset = (
SpectacleRevente.objects.filter(
notif_sent=True,
shotgun=False,
tirage_done=False
).exclude(answered_mail=participant)
.select_related('attribution__spectacle')
)
class SoldForm(forms.Form): class SoldForm(forms.Form):
attributions = AttributionModelMultipleChoiceField( attributions = AttributionModelMultipleChoiceField(

View file

@ -0,0 +1,28 @@
{% extends "base_title.html" %}
{% load bootstrap %}
{% block realcontent %}
<h2>Tirages au sort de reventes</h2>
{% if annulform.reventes %}
<h3>Mes inscriptions</h3>
<form class="form-horizontal" action="" method="post">
{% csrf_token %}
{{annulform|bootstrap}}
<div class="form-actions">
<input type="submit" class="btn btn-primary" name="annul" value="Se désinscrire des tirages sélectionnés">
</div>
</form>
{% endif %}
<br>
{% if subform.reventes %}
<h3>Tirages en cours</h3>
<form class="form-horizontal" action="" method="post">
{% csrf_token %}
{{subform|bootstrap}}
<div class="form-actions">
<input type="submit" class="btn btn-primary" name="subscribe" value="S'inscrire aux tirages sélectionnés">
</div>
</form>
{% endif %}
{% endblock %}

View file

@ -32,16 +32,19 @@ urlpatterns = [
url(r'^spectacles/unpaid/(?P<tirage_id>\d+)$', url(r'^spectacles/unpaid/(?P<tirage_id>\d+)$',
views.unpaid, views.unpaid,
name="bda-unpaid"), name="bda-unpaid"),
url(r'^liste-revente/(?P<tirage_id>\d+)$', url(r'^revente/(?P<tirage_id>\d+)/list$',
views.list_revente, views.list_revente,
name="bda-liste-revente"), name="bda-liste-revente"),
url(r'^buy-revente/(?P<spectacle_id>\d+)$', url(r'^revente/(?P<tirage_id>\d+)/tirages$',
views.revente_tirages,
name="bda-revente-tirages"),
url(r'^revente/(?P<spectacle_id>\d+)/buy$',
views.buy_revente, views.buy_revente,
name="bda-buy-revente"), name="bda-buy-revente"),
url(r'^revente-interested/(?P<revente_id>\d+)$', url(r'^revente/(?P<revente_id>\d+)/interested$',
views.revente_interested, views.revente_interested,
name='bda-revente-interested'), name='bda-revente-interested'),
url(r'^revente-immediat/(?P<tirage_id>\d+)$', url(r'^revente/(?P<tirage_id>\d+)/immediat$',
views.revente_shotgun, views.revente_shotgun,
name="bda-shotgun"), name="bda-shotgun"),
url(r'^mails-rappel/(?P<spectacle_id>\d+)$', url(r'^mails-rappel/(?P<spectacle_id>\d+)$',

View file

@ -30,7 +30,7 @@ from bda.models import (
from bda.algorithm import Algorithm from bda.algorithm import Algorithm
from bda.forms import ( from bda.forms import (
TokenForm, ResellForm, AnnulForm, InscriptionReventeForm, SoldForm, TokenForm, ResellForm, AnnulForm, InscriptionReventeForm, SoldForm,
InscriptionInlineFormSet, InscriptionInlineFormSet, ReventeTirageForm, ReventeTirageAnnulForm
) )
@ -377,6 +377,7 @@ def revente(request, tirage_id):
if not created: if not created:
revente.seller = participant revente.seller = participant
revente.date = timezone.now() revente.date = timezone.now()
revente.wanted = Participant.objects.none()
revente.soldTo = None revente.soldTo = None
revente.notif_sent = False revente.notif_sent = False
revente.tirage_done = False revente.tirage_done = False
@ -442,6 +443,53 @@ def revente(request, tirage_id):
"annulform": annulform, "resellform": resellform}) "annulform": annulform, "resellform": resellform})
@login_required
def revente_tirages(request, tirage_id):
tirage = get_object_or_404(Tirage, id=tirage_id)
participant, _ = Participant.objects.get_or_create(
user=request.user, tirage=tirage)
unsub = 0
subform = ReventeTirageForm(participant, prefix="subscribe")
annulform = ReventeTirageAnnulForm(participant, prefix="annul")
if request.method == 'POST':
if "subscribe" in request.POST:
subform = ReventeTirageForm(participant, request.POST,
prefix="subscribe")
if subform.is_valid():
sub = 0
reventes = subform.cleaned_data['reventes']
for revente in reventes:
revente.answered_mail.add(participant)
sub += 1
if sub > 0:
plural = "s" if sub > 1 else ""
messages.success(
request,
"Tu as bien été inscrit à {} revente{}"
.format(sub, plural)
)
elif "annul" in request.POST:
annulform = ReventeTirageAnnulForm(participant, request.POST,
prefix="annul")
if annulform.is_valid():
unsub = 0
reventes = annulform.cleaned_data['reventes']
for revente in reventes:
revente.answered_mail.remove(participant)
unsub += 1
if unsub > 0:
plural = "s" if unsub > 1 else ""
messages.success(
request,
"Tu as bien été désinscrit de {} revente{}"
.format(unsub, plural)
)
return render(request, "bda/revente-tirages.html",
{"annulform": annulform, "subform": subform})
@login_required @login_required
def revente_interested(request, revente_id): def revente_interested(request, revente_id):
revente = get_object_or_404(SpectacleRevente, id=revente_id) revente = get_object_or_404(SpectacleRevente, id=revente_id)

View file

@ -43,7 +43,8 @@
<li><a href="{% url "bda-etat-places" tirage.id %}">État des demandes</a></li> <li><a href="{% url "bda-etat-places" tirage.id %}">État des demandes</a></li>
{% else %} {% else %}
<li><a href="{% url "bda-places-attribuees" tirage.id %}">Mes places</a></li> <li><a href="{% url "bda-places-attribuees" tirage.id %}">Mes places</a></li>
<li><a href="{% url "bda-revente" tirage.id %}">Revendre une place</a></li> <li><a href="{% url "bda-revente" tirage.id %}">Gestion de mes reventes</a></li>
<li><a href="{% url "bda-revente-tirages" tirage.id %}">Reventes en cours</a></li>
<li><a href="{% url "bda-liste-revente" tirage.id %}">S'inscrire à BdA-Revente</a></li> <li><a href="{% url "bda-liste-revente" tirage.id %}">S'inscrire à BdA-Revente</a></li>
<li><a href="{% url "bda-shotgun" tirage.id %}">Places disponibles immédiatement</a></li> <li><a href="{% url "bda-shotgun" tirage.id %}">Places disponibles immédiatement</a></li>
{% endif %} {% endif %}