forked from CGM_Public/pretix_original
Add filters to the order search
This commit is contained in:
45
src/pretix/control/forms/filter.py
Normal file
45
src/pretix/control/forms/filter.py
Normal 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)
|
||||||
|
)
|
||||||
@@ -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">
|
||||||
|
|||||||
@@ -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", "")
|
||||||
|
|||||||
Reference in New Issue
Block a user