diff --git a/src/pretix/control/forms/filter.py b/src/pretix/control/forms/filter.py index f6cc4a3a3b..36cdea5b94 100644 --- a/src/pretix/control/forms/filter.py +++ b/src/pretix/control/forms/filter.py @@ -1,10 +1,13 @@ from django import forms +from django.db.models import Q +from django.utils.timezone import now from django.utils.translation import ugettext_lazy as _ -from pretix.base.models import Organizer +from pretix.base.models import Item, Order, Organizer +from pretix.base.signals import register_payment_providers -class OrderSearchFilterForm(forms.Form): +class OrderFilterForm(forms.Form): query = forms.CharField( label=_('Search for…'), widget=forms.TextInput(attrs={ @@ -27,6 +30,88 @@ class OrderSearchFilterForm(forms.Form): ), required=False, ) + + def filter_qs(self, qs): + fdata = self.cleaned_data + + if fdata.get('query'): + u = fdata.get('query') + if "-" in u: + code = (Q(event__slug__icontains=u.split("-")[0]) + & Q(code__icontains=Order.normalize_code(u.split("-")[1]))) + else: + code = Q(code__icontains=Order.normalize_code(u)) + qs = qs.filter( + code + | Q(email__icontains=u) + | Q(positions__attendee_name__icontains=u) + | Q(positions__attendee_email__icontains=u) + | Q(invoice_address__name__icontains=u) + | Q(invoice_address__company__icontains=u) + ) + + if fdata.get('status'): + s = fdata.get('status') + if s == 'o': + qs = qs.filter(status=Order.STATUS_PENDING, expires__lt=now().replace(hour=0, minute=0, second=0)) + elif s == 'ne': + qs = qs.filter(status__in=[Order.STATUS_PENDING, Order.STATUS_EXPIRED]) + else: + qs = qs.filter(status=s) + + return qs + + @property + def filtered(self): + return self.is_valid() and any(self.cleaned_data.values()) + + +class EventOrderFilterForm(OrderFilterForm): + item = forms.ModelChoiceField( + label=_('Products'), + queryset=Item.objects.none(), + required=False, + empty_label=_('All products') + ) + provider = forms.ChoiceField( + label=_('Payment provider'), + choices=[ + ('', _('All payment providers')), + ], + required=False, + ) + + def get_payment_providers(self): + providers = [] + responses = register_payment_providers.send(self.event) + for receiver, response in responses: + provider = response(self.event) + providers.append({ + 'name': provider.identifier, + 'verbose_name': provider.verbose_name + }) + return providers + + def __init__(self, *args, **kwargs): + self.event = kwargs.pop('event') + super().__init__(*args, **kwargs) + self.fields['item'].queryset = self.event.items.all() + self.fields['provider'].choices += [(p['name'], p['verbose_name']) for p in self.get_payment_providers()] + + def filter_qs(self, qs): + fdata = self.cleaned_data + qs = super().filter_qs(qs) + + if fdata.get('item'): + qs = qs.filter(positions__item_id__in=(fdata.get('item'),)) + + if fdata.get('provider'): + qs = qs.filter(payment_provider=fdata.get('provider')) + + return qs + + +class OrderSearchFilterForm(OrderFilterForm): organizer = forms.ModelChoiceField( label=_('Organizer'), queryset=Organizer.objects.none(), @@ -43,3 +128,12 @@ class OrderSearchFilterForm(forms.Form): self.fields['organizer'].queryset = Organizer.objects.filter( pk__in=request.user.teams.values_list('organizer', flat=True) ) + + def filter_qs(self, qs): + fdata = self.cleaned_data + qs = super().filter_qs(qs) + + if fdata.get('organizer'): + qs = qs.filter(event__organizer=fdata.get('organizer')) + + return qs diff --git a/src/pretix/control/templates/pretixcontrol/orders/index.html b/src/pretix/control/templates/pretixcontrol/orders/index.html index 60f9df4d3e..b899a032b4 100644 --- a/src/pretix/control/templates/pretixcontrol/orders/index.html +++ b/src/pretix/control/templates/pretixcontrol/orders/index.html @@ -2,6 +2,7 @@ {% load i18n %} {% load eventurl %} {% load urlreplace %} +{% load bootstrap3 %} {% block title %}{% trans "Orders" %}{% endblock %} {% block content %}
-