diff --git a/bda/forms.py b/bda/forms.py index 94a52128..bb79932e 100644 --- a/bda/forms.py +++ b/bda/forms.py @@ -1,5 +1,6 @@ from django import forms from django.forms.models import BaseInlineFormSet +from django.template import loader from django.utils import timezone from bda.models import Attribution, Spectacle, SpectacleRevente @@ -38,142 +39,146 @@ class TokenForm(forms.Form): token = forms.CharField(widget=forms.widgets.Textarea()) -class AttributionModelMultipleChoiceField(forms.ModelMultipleChoiceField): - def label_from_instance(self, obj): - return str(obj.spectacle) +class TemplateLabelField(forms.ModelMultipleChoiceField): + """ + Extends ModelMultipleChoiceField to offer two more customization options : + - `label_from_instance` can be used with a template file + - the widget rendering template can be specified with `option_template_name` + """ - -class ReventeModelMultipleChoiceField(forms.ModelMultipleChoiceField): - def __init__(self, *args, own=True, **kwargs): + def __init__( + self, + label_template_name=None, + context_object_name="obj", + option_template_name=None, + *args, + **kwargs + ): super().__init__(*args, **kwargs) - self.own = own + self.label_template_name = label_template_name + self.context_object_name = context_object_name + if option_template_name is not None: + self.widget.option_template_name = option_template_name def label_from_instance(self, obj): - label = "{show}{suffix}" - suffix = "" - if self.own: - # C'est notre propre revente : informations sur le statut - if obj.soldTo is not None: - suffix = " -- Vendue à {firstname} {lastname}".format( - firstname=obj.soldTo.user.first_name, - lastname=obj.soldTo.user.last_name, - ) - elif obj.shotgun: - suffix = " -- Tirage infructueux" - elif obj.notif_sent: - suffix = " -- Inscriptions au tirage en cours" + if self.label_template_name is None: + return super().label_from_instance(obj) else: - # Ce n'est pas à nous : on ne voit jamais l'acheteur - suffix = " -- Vendue par {firstname} {lastname}".format( - firstname=obj.seller.user.first_name, lastname=obj.seller.user.last_name + return loader.render_to_string( + self.label_template_name, context={self.context_object_name: obj} ) - return label.format(show=str(obj.attribution.spectacle), suffix=suffix) + +# Formulaires pour revente_manage class ResellForm(forms.Form): - attributions = AttributionModelMultipleChoiceField( - label="", - queryset=Attribution.objects.none(), - widget=forms.CheckboxSelectMultiple, - required=False, - ) - def __init__(self, participant, *args, **kwargs): super().__init__(*args, **kwargs) - self.fields["attributions"].queryset = ( - participant.attribution_set.filter(spectacle__date__gte=timezone.now()) + self.fields["attributions"] = TemplateLabelField( + queryset=participant.attribution_set.filter( + spectacle__date__gte=timezone.now() + ) .exclude(revente__seller=participant) - .select_related("spectacle", "spectacle__location", "participant__user") + .select_related("spectacle", "spectacle__location", "participant__user"), + widget=forms.CheckboxSelectMultiple, + required=False, + label_template_name="bda/forms/attribution_label_table.html", + option_template_name="bda/forms/checkbox_table.html", + context_object_name="attribution", ) class AnnulForm(forms.Form): - reventes = ReventeModelMultipleChoiceField( - own=True, - label="", - queryset=Attribution.objects.none(), - widget=forms.CheckboxSelectMultiple, - required=False, - ) - def __init__(self, participant, *args, **kwargs): super().__init__(*args, **kwargs) - self.fields["reventes"].queryset = ( - participant.original_shows.filter( + self.fields["reventes"] = TemplateLabelField( + label="", + queryset=participant.original_shows.filter( attribution__spectacle__date__gte=timezone.now(), soldTo__isnull=True ) .select_related( "attribution__spectacle", "attribution__spectacle__location" ) - .order_by("-date") - ) - - -class InscriptionReventeForm(forms.Form): - spectacles = forms.ModelMultipleChoiceField( - queryset=Spectacle.objects.none(), - widget=forms.CheckboxSelectMultiple, - required=False, - ) - - def __init__(self, tirage, *args, **kwargs): - super().__init__(*args, **kwargs) - self.fields["spectacles"].queryset = tirage.spectacle_set.select_related( - "location" - ).filter(date__gte=timezone.now()) - - -class ReventeTirageAnnulForm(forms.Form): - reventes = ReventeModelMultipleChoiceField( - own=False, - 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.entered.filter( - soldTo__isnull=True - ).select_related("attribution__spectacle", "seller__user") - - -class ReventeTirageForm(forms.Form): - reventes = ReventeModelMultipleChoiceField( - own=False, - 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(confirmed_entry=participant) - .select_related("attribution__spectacle") + .order_by("-date"), + widget=forms.CheckboxSelectMultiple, + required=False, + label_template_name="bda/forms/revente_self_label_table.html", + option_template_name="bda/forms/checkbox_table.html", + context_object_name="revente", ) class SoldForm(forms.Form): - reventes = ReventeModelMultipleChoiceField( - own=True, - label="", - queryset=Attribution.objects.none(), - widget=forms.CheckboxSelectMultiple, - ) - def __init__(self, participant, *args, **kwargs): super().__init__(*args, **kwargs) - self.fields["reventes"].queryset = ( - participant.original_shows.filter(soldTo__isnull=False) + self.fields["reventes"] = TemplateLabelField( + queryset=participant.original_shows.filter(soldTo__isnull=False) .exclude(soldTo=participant) .select_related( "attribution__spectacle", "attribution__spectacle__location" - ) + ), + widget=forms.CheckboxSelectMultiple, + label_template_name="bda/forms/revente_sold_label_table.html", + option_template_name="bda/forms/checkbox_table.html", + context_object_name="revente", + ) + + +# Formulaire pour revente_subscribe + + +class InscriptionReventeForm(forms.Form): + def __init__(self, tirage, *args, **kwargs): + super().__init__(*args, **kwargs) + self.fields["spectacles"] = TemplateLabelField( + queryset=tirage.spectacle_set.select_related("location").filter( + date__gte=timezone.now() + ), + widget=forms.CheckboxSelectMultiple, + required=False, + label_template_name="bda/forms/spectacle_label_table.html", + option_template_name="bda/forms/checkbox_table.html", + context_object_name="spectacle", + ) + + +# Formulaires pour revente_tirages + + +class ReventeTirageAnnulForm(forms.Form): + def __init__(self, participant, *args, **kwargs): + super().__init__(*args, **kwargs) + self.fields["reventes"] = TemplateLabelField( + queryset=participant.entered.filter(soldTo__isnull=True).select_related( + "attribution__spectacle", "seller__user" + ), + widget=forms.CheckboxSelectMultiple, + required=False, + label_template_name="bda/forms/revente_other_label_table.html", + option_template_name="bda/forms/checkbox_table.html", + context_object_name="revente", + ) + + +class ReventeTirageForm(forms.Form): + def __init__(self, participant, *args, **kwargs): + super().__init__(*args, **kwargs) + + self.fields["reventes"] = TemplateLabelField( + queryset=( + SpectacleRevente.objects.filter( + notif_sent=True, + shotgun=False, + tirage_done=False, + attribution__spectacle__tirage=participant.tirage, + ) + .exclude(confirmed_entry=participant) + .select_related("attribution__spectacle") + ), + widget=forms.CheckboxSelectMultiple, + required=False, + label_template_name="bda/forms/revente_other_label_table.html", + option_template_name="bda/forms/checkbox_table.html", + context_object_name="revente", ) diff --git a/bda/templates/bda/forms/attribution_label_table.html b/bda/templates/bda/forms/attribution_label_table.html new file mode 100644 index 00000000..b50b8290 --- /dev/null +++ b/bda/templates/bda/forms/attribution_label_table.html @@ -0,0 +1 @@ +{% include 'bda/forms/spectacle_label_table.html' with spectacle=attribution.spectacle %} \ No newline at end of file diff --git a/bda/templates/bda/forms/checkbox_table.html b/bda/templates/bda/forms/checkbox_table.html new file mode 100644 index 00000000..e13a9c9d --- /dev/null +++ b/bda/templates/bda/forms/checkbox_table.html @@ -0,0 +1,4 @@ +
Plus de reventes possibles !
{% endif %} -{% endwith %} + + + {% endblock %} diff --git a/bda/templates/bda/revente/shotgun.html b/bda/templates/bda/revente/shotgun.html index fae36c04..a724032e 100644 --- a/bda/templates/bda/revente/shotgun.html +++ b/bda/templates/bda/revente/shotgun.html @@ -2,11 +2,26 @@ {% block realcontent %}Titre | +Date | +Lieu | +Prix | ++ |
---|---|---|---|---|
Racheter + |
Pas de places disponibles immédiatement, désolé !
{% endif %} diff --git a/bda/templates/bda/revente/subscribe.html b/bda/templates/bda/revente/subscribe.html index 9a193908..fbea28b5 100644 --- a/bda/templates/bda/revente/subscribe.html +++ b/bda/templates/bda/revente/subscribe.html @@ -1,12 +1,12 @@ {% extends "base_title.html" %} -{% load bootstrap %} +{% load staticfiles%} {% block realcontent %}