Add filters to the order search

This commit is contained in:
Raphael Michel
2017-06-28 12:52:48 +02:00
parent 424b7964b4
commit c2bd2f0672
3 changed files with 102 additions and 23 deletions

View File

@@ -0,0 +1,45 @@
from django import forms
from django.utils.translation import ugettext_lazy as _
from pretix.base.models import Organizer
class OrderSearchFilterForm(forms.Form):
query = forms.CharField(
label=_('Search for…'),
widget=forms.TextInput(attrs={
'placeholder': _('Search for…'),
'autofocus': 'autofocus'
}),
required=False
)
status = forms.ChoiceField(
label=_('Order status'),
choices=(
('', _('All orders')),
('p', _('Paid')),
('n', _('Pending')),
('o', _('Pending (overdue)')),
('e', _('Expired')),
('ne', _('Pending or expired')),
('c', _('Canceled')),
('r', _('Refunded')),
),
required=False,
)
organizer = forms.ModelChoiceField(
label=_('Organizer'),
queryset=Organizer.objects.none(),
required=False,
empty_label=_('All organizers')
)
def __init__(self, *args, **kwargs):
request = kwargs.pop('request')
super().__init__(*args, **kwargs)
if request.user.is_superuser:
self.fields['organizer'].queryset = Organizer.objects.all()
else:
self.fields['organizer'].queryset = Organizer.objects.filter(
pk__in=request.user.teams.values_list('organizer', flat=True)
)

View File

@@ -2,16 +2,25 @@
{% load i18n %} {% load i18n %}
{% load eventurl %} {% load eventurl %}
{% load urlreplace %} {% load urlreplace %}
{% load bootstrap3 %}
{% block title %}{% trans "Order search" %}{% endblock %} {% block title %}{% trans "Order search" %}{% endblock %}
{% block content %} {% block content %}
<h1>{% trans "Order search" %}</h1> <h1>{% trans "Order search" %}</h1>
<form class="form-inline" action="" method="get"> <form class="row filter-form" action="" method="get">
<div class="input-group search-line"> <div class="col-md-4 col-sm-6 col-xs-12">
<input type="text" name="query" class="form-control" placeholder="{% trans "Search for..." %}" {% bootstrap_field filter_form.query layout='inline' %}
value="{{ request.GET.query }}" autofocus> </div>
<span class="input-group-btn"> <div class="col-md-3 col-sm-6 col-xs-12">
<button class="btn btn-primary" type="submit">{% trans "Search" %}</button> {% bootstrap_field filter_form.status layout='inline' %}
</span> </div>
<div class="col-md-3 col-sm-6 col-xs-12">
{% bootstrap_field filter_form.organizer layout='inline' %}
</div>
<div class="col-md-2 col-sm-6 col-xs-12">
<button class="btn btn-primary btn-block" type="submit">
<span class="fa fa-filter"></span>
{% trans "Filter" %}
</button>
</div> </div>
</form> </form>
<div class="table-responsive"> <div class="table-responsive">

View File

@@ -1,7 +1,10 @@
from django.db.models import Q from django.db.models import Q
from django.utils.functional import cached_property
from django.utils.timezone import now
from django.views.generic import ListView from django.views.generic import ListView
from pretix.base.models import Order from pretix.base.models import Order
from pretix.control.forms.filter import OrderSearchFilterForm
class OrderSearch(ListView): class OrderSearch(ListView):
@@ -10,6 +13,15 @@ class OrderSearch(ListView):
paginate_by = 30 paginate_by = 30
template_name = 'pretixcontrol/search/orders.html' template_name = 'pretixcontrol/search/orders.html'
@cached_property
def filter_form(self):
return OrderSearchFilterForm(data=self.request.GET, request=self.request)
def get_context_data(self, **kwargs):
ctx = super().get_context_data()
ctx['filter_form'] = self.filter_form
return ctx
def get_queryset(self): def get_queryset(self):
qs = Order.objects.all() qs = Order.objects.all()
if not self.request.user.is_superuser: if not self.request.user.is_superuser:
@@ -20,22 +32,35 @@ class OrderSearch(ListView):
can_view_orders=True).values_list('limit_events__id', flat=True)) can_view_orders=True).values_list('limit_events__id', flat=True))
) )
if self.request.GET.get("query", "") != "": if self.filter_form.is_valid():
u = self.request.GET.get("query", "") fdata = self.filter_form.cleaned_data
if "-" in u: if fdata.get('query'):
code = (Q(event__slug__icontains=u.split("-")[0]) u = fdata.get('query')
& Q(code__icontains=Order.normalize_code(u.split("-")[1]))) if "-" in u:
else: code = (Q(event__slug__icontains=u.split("-")[0])
code = Q(code__icontains=Order.normalize_code(u)) & Q(code__icontains=Order.normalize_code(u.split("-")[1])))
qs = qs.filter( else:
code code = Q(code__icontains=Order.normalize_code(u))
| Q(email__icontains=u) qs = qs.filter(
| Q(positions__attendee_name__icontains=u) code
| Q(positions__attendee_email__icontains=u) | Q(email__icontains=u)
| Q(invoice_address__name__icontains=u) | Q(positions__attendee_name__icontains=u)
| Q(invoice_address__company__icontains=u) | Q(positions__attendee_email__icontains=u)
) | Q(invoice_address__name__icontains=u)
print(qs.query) | 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)
if fdata.get('organizer'):
qs = qs.filter(event__organizer=fdata.get('organizer'))
if self.request.GET.get("ordering", "") != "": if self.request.GET.get("ordering", "") != "":
p = self.request.GET.get("ordering", "") p = self.request.GET.get("ordering", "")