Use FilterForm for list of orders

This commit is contained in:
Raphael Michel
2017-06-28 17:28:30 +02:00
parent c2bd2f0672
commit 8ea9d5685d
5 changed files with 157 additions and 120 deletions

View File

@@ -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