forked from DGNum/gestioCOF
Add unsubscribe option + list of current draws
This commit is contained in:
parent
fccad5edee
commit
732e47707e
5 changed files with 126 additions and 11 deletions
41
bda/forms.py
41
bda/forms.py
|
@ -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(
|
||||||
|
|
28
bda/templates/bda/revente-tirages.html
Normal file
28
bda/templates/bda/revente-tirages.html
Normal 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 %}
|
11
bda/urls.py
11
bda/urls.py
|
@ -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+)$',
|
||||||
|
|
50
bda/views.py
50
bda/views.py
|
@ -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)
|
||||||
|
|
|
@ -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 %}
|
||||||
|
|
Loading…
Reference in a new issue