diff --git a/bda/forms.py b/bda/forms.py
index c0417d1e..139ef45d 100644
--- a/bda/forms.py
+++ b/bda/forms.py
@@ -4,7 +4,7 @@ from django import forms
from django.forms.models import BaseInlineFormSet
from django.utils import timezone
-from bda.models import Attribution, Spectacle
+from bda.models import Attribution, Spectacle, SpectacleRevente
class InscriptionInlineFormSet(BaseInlineFormSet):
@@ -45,6 +45,9 @@ class AttributionModelMultipleChoiceField(forms.ModelMultipleChoiceField):
def label_from_instance(self, obj):
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):
attributions = AttributionModelMultipleChoiceField(
@@ -63,7 +66,6 @@ class ResellForm(forms.Form):
'participant__user')
)
-
class AnnulForm(forms.Form):
attributions = AttributionModelMultipleChoiceField(
label='',
@@ -83,7 +85,6 @@ class AnnulForm(forms.Form):
'participant__user')
)
-
class InscriptionReventeForm(forms.Form):
spectacles = forms.ModelMultipleChoiceField(
queryset=Spectacle.objects.none(),
@@ -98,6 +99,40 @@ class InscriptionReventeForm(forms.Form):
.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):
attributions = AttributionModelMultipleChoiceField(
diff --git a/bda/templates/bda/revente-tirages.html b/bda/templates/bda/revente-tirages.html
new file mode 100644
index 00000000..bd738673
--- /dev/null
+++ b/bda/templates/bda/revente-tirages.html
@@ -0,0 +1,28 @@
+{% extends "base_title.html" %}
+{% load bootstrap %}
+
+{% block realcontent %}
+
+
Tirages au sort de reventes
+{% if annulform.reventes %}
+Mes inscriptions
+
+{% endif %}
+
+{% if subform.reventes %}
+Tirages en cours
+
+{% endif %}
+{% endblock %}
diff --git a/bda/urls.py b/bda/urls.py
index 876c84ea..51dd4235 100644
--- a/bda/urls.py
+++ b/bda/urls.py
@@ -32,16 +32,19 @@ urlpatterns = [
url(r'^spectacles/unpaid/(?P\d+)$',
views.unpaid,
name="bda-unpaid"),
- url(r'^liste-revente/(?P\d+)$',
+ url(r'^revente/(?P\d+)/list$',
views.list_revente,
name="bda-liste-revente"),
- url(r'^buy-revente/(?P\d+)$',
+ url(r'^revente/(?P\d+)/tirages$',
+ views.revente_tirages,
+ name="bda-revente-tirages"),
+ url(r'^revente/(?P\d+)/buy$',
views.buy_revente,
name="bda-buy-revente"),
- url(r'^revente-interested/(?P\d+)$',
+ url(r'^revente/(?P\d+)/interested$',
views.revente_interested,
name='bda-revente-interested'),
- url(r'^revente-immediat/(?P\d+)$',
+ url(r'^revente/(?P\d+)/immediat$',
views.revente_shotgun,
name="bda-shotgun"),
url(r'^mails-rappel/(?P\d+)$',
diff --git a/bda/views.py b/bda/views.py
index 84b6c9d3..4b75c116 100644
--- a/bda/views.py
+++ b/bda/views.py
@@ -30,7 +30,7 @@ from bda.models import (
from bda.algorithm import Algorithm
from bda.forms import (
TokenForm, ResellForm, AnnulForm, InscriptionReventeForm, SoldForm,
- InscriptionInlineFormSet,
+ InscriptionInlineFormSet, ReventeTirageForm, ReventeTirageAnnulForm
)
@@ -377,6 +377,7 @@ def revente(request, tirage_id):
if not created:
revente.seller = participant
revente.date = timezone.now()
+ revente.wanted = Participant.objects.none()
revente.soldTo = None
revente.notif_sent = False
revente.tirage_done = False
@@ -442,6 +443,53 @@ def revente(request, tirage_id):
"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
def revente_interested(request, revente_id):
revente = get_object_or_404(SpectacleRevente, id=revente_id)
diff --git a/gestioncof/templates/home.html b/gestioncof/templates/home.html
index acc04f30..f7ca57b5 100644
--- a/gestioncof/templates/home.html
+++ b/gestioncof/templates/home.html
@@ -43,9 +43,10 @@
État des demandes
{% else %}
Mes places
- Revendre une place
- S'inscrire à BdA-Revente
- Places disponibles immédiatement
+ Gestion de mes reventes
+ Reventes en cours
+ S'inscrire à BdA-Revente
+ Places disponibles immédiatement
{% endif %}
{% endfor %}