Filter list of events

This commit is contained in:
Raphael Michel
2017-06-28 17:57:15 +02:00
parent ecc788fd79
commit c7f0436ec0
6 changed files with 167 additions and 26 deletions

View File

@@ -5,9 +5,19 @@ from django.utils.translation import ugettext_lazy as _
from pretix.base.models import Item, Order, Organizer from pretix.base.models import Item, Order, Organizer
from pretix.base.signals import register_payment_providers from pretix.base.signals import register_payment_providers
from pretix.control.utils.i18n import i18ncomp
class OrderFilterForm(forms.Form): class FilterForm(forms.Form):
def filter_qs(self, qs):
return qs
@property
def filtered(self):
return self.is_valid() and any(self.cleaned_data.values())
class OrderFilterForm(FilterForm):
query = forms.CharField( query = forms.CharField(
label=_('Search for…'), label=_('Search for…'),
widget=forms.TextInput(attrs={ widget=forms.TextInput(attrs={
@@ -61,10 +71,6 @@ class OrderFilterForm(forms.Form):
return qs return qs
@property
def filtered(self):
return self.is_valid() and any(self.cleaned_data.values())
class EventOrderFilterForm(OrderFilterForm): class EventOrderFilterForm(OrderFilterForm):
item = forms.ModelChoiceField( item = forms.ModelChoiceField(
@@ -137,3 +143,73 @@ class OrderSearchFilterForm(OrderFilterForm):
qs = qs.filter(event__organizer=fdata.get('organizer')) qs = qs.filter(event__organizer=fdata.get('organizer'))
return qs return qs
class EventFilterForm(FilterForm):
status = forms.ChoiceField(
label=_('Status'),
choices=(
('', _('All events')),
('live', _('Shop live')),
('running', _('Shop live and presale running')),
('notlive', _('Shop not live')),
('future', _('Presale not started')),
('past', _('Presale over')),
),
required=False
)
organizer = forms.ModelChoiceField(
label=_('Organizer'),
queryset=Organizer.objects.none(),
required=False,
empty_label=_('All organizers')
)
query = forms.CharField(
label=_('Event name'),
widget=forms.TextInput(attrs={
'placeholder': _('Event name'),
'autofocus': 'autofocus'
}),
required=False
)
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)
)
def filter_qs(self, qs):
fdata = self.cleaned_data
if fdata.get('status') == 'live':
qs = qs.filter(live=True)
elif fdata.get('status') == 'running':
qs = qs.filter(
live=True
).filter(
Q(presale_start__isnull=True) | Q(presale_start__lte=now())
).filter(
Q(presale_end__isnull=True) | Q(presale_end__gte=now())
)
elif fdata.get('status') == 'notlive':
qs = qs.filter(live=False)
elif fdata.get('status') == 'future':
qs = qs.filter(presale_start__gte=now())
elif fdata.get('status') == 'past':
qs = qs.filter(presale_end__lte=now())
if fdata.get('organizer'):
qs = qs.filter(organizer=fdata.get('organizer'))
if fdata.get('query'):
query = fdata.get('query')
qs = qs.filter(
Q(name__icontains=i18ncomp(query)) | Q(slug__icontains=query)
)
return qs

View File

@@ -1,18 +1,49 @@
{% extends "pretixcontrol/base.html" %} {% extends "pretixcontrol/base.html" %}
{% load i18n %} {% load i18n %}
{% load bootstrap3 %}
{% block title %}{% trans "Events" %}{% endblock %} {% block title %}{% trans "Events" %}{% endblock %}
{% block content %} {% block content %}
<h1>{% trans "Events" %}</h1> <h1>{% trans "Events" %}</h1>
<p>{% trans "The list below shows all events you have administrative access to. Click on the event name to access event details." %}</p> <p>{% trans "The list below shows all events you have administrative access to. Click on the event name to access event details." %}</p>
<a href="{% url "control:events.add" %}" class="btn btn-default"> {% if events|length == 0 and not filter_form.filtered %}
<span class="fa fa-plus"></span> <div class="empty-collection">
{% trans "Create a new event" %} <p>
</a> {% blocktrans trimmed %}
{% if events|length == 0 %} You currently do not have access to any events.
<p> {% endblocktrans %}
<em>{% trans "You currently do not have access to any events." %}</em> </p>
</p>
<a href="{% url "control:events.add" %}" class="btn btn-primary btn-lg">
<span class="fa fa-plus"></span>
{% trans "Create a new event" %}
</a>
</div>
{% else %} {% else %}
<form class="row filter-form" action="" method="get">
<div class="col-md-4 col-sm-6 col-xs-12">
{% bootstrap_field filter_form.query layout='inline' %}
</div>
<div class="col-md-3 col-sm-6 col-xs-12">
{% bootstrap_field filter_form.status layout='inline' %}
</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>
<span class="hidden-md">
{% trans "Filter" %}
</span>
</button>
</div>
</form>
<p>
<a href="{% url "control:events.add" %}" class="btn btn-default">
<span class="fa fa-plus"></span>
{% trans "Create a new event" %}
</a>
</p>
<table class="table table-condensed table-hover"> <table class="table table-condensed table-hover">
<thead> <thead>
<tr> <tr>
@@ -20,15 +51,29 @@
<th>{% trans "Organizer" %}</th> <th>{% trans "Organizer" %}</th>
<th>{% trans "Start date" %}</th> <th>{% trans "Start date" %}</th>
<th>{% trans "End date" %}</th> <th>{% trans "End date" %}</th>
<th class="text-right">{% trans "Status" %}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{% for e in events %} {% for e in events %}
<tr> <tr>
<td><strong><a href="{% url "control:event.index" organizer=e.organizer.slug event=e.slug %}">{{ e.name }}</a></strong></td> <td>
<strong><a href="{% url "control:event.index" organizer=e.organizer.slug event=e.slug %}">{{ e.name }}</a></strong>
</td>
<td>{{ e.organizer }}</td> <td>{{ e.organizer }}</td>
<td>{{ e.get_date_from_display }}</td> <td>{{ e.get_date_from_display }}</td>
<td>{{ e.get_date_to_display }}</td> <td>{{ e.get_date_to_display }}</td>
<td class="text-right">
{% if not e.live %}
<span class="label label-danger">{% trans "Shop disabled" %}</span>
{% elif e.presale_has_ended %}
<span class="label label-warning">{% trans "Presale over" %}</span>
{% elif not e.presale_is_running %}
<span class="label label-warning">{% trans "Presale not started" %}</span>
{% else %}
<span class="label label-success">{% trans "On sale" %}</span>
{% endif %}
</td>
</tr> </tr>
{% endfor %} {% endfor %}
</tbody> </tbody>

View File

@@ -6,7 +6,7 @@
{% block title %}{% trans "Orders" %}{% endblock %} {% block title %}{% trans "Orders" %}{% endblock %}
{% block content %} {% block content %}
<h1>{% trans "Orders" %}</h1> <h1>{% trans "Orders" %}</h1>
{% if not filtered and orders|length == 0 %} {% if not filter_form.filtered and orders|length == 0 %}
<div class="empty-collection"> <div class="empty-collection">
<p> <p>
{% blocktrans trimmed %} {% blocktrans trimmed %}
@@ -88,9 +88,14 @@
<tbody> <tbody>
{% for o in orders %} {% for o in orders %}
<tr> <tr>
<td><strong><a <td>
href="{% url "control:event.order" event=request.event.slug organizer=request.event.organizer.slug code=o.code %}" <strong>
>{{ o.code }}</a></strong></td> <a
href="{% url "control:event.order" event=request.event.slug organizer=request.event.organizer.slug code=o.code %}">
{{ o.code }}
</a>
</strong>
</td>
<td> <td>
{{ o.email }} {{ o.email }}
{% if o.invoice_address.name %} {% if o.invoice_address.name %}

View File

@@ -1,5 +1,6 @@
# Inspired by https://github.com/asaglimbeni/django-datetime-widget/blob/master/datetimewidget/widgets.py # Inspired by https://github.com/asaglimbeni/django-datetime-widget/blob/master/datetimewidget/widgets.py
# Copyright (c) 2013, Alfredo Saglimbeni (BSD license) # Copyright (c) 2013, Alfredo Saglimbeni (BSD license)
import json
import re import re
from django.utils import translation from django.utils import translation
@@ -63,3 +64,7 @@ def get_moment_locale(locale=None):
if main in moment_locales: if main in moment_locales:
return main return main
return settings.LANGUAGE_CODE return settings.LANGUAGE_CODE
def i18ncomp(query):
return json.dumps(str(query))[1:-1]

View File

@@ -3,6 +3,7 @@ from django.contrib import messages
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.db import transaction from django.db import transaction
from django.shortcuts import redirect from django.shortcuts import redirect
from django.utils.functional import cached_property
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from django.views.generic import ListView from django.views.generic import ListView
from formtools.wizard.views import SessionWizardView from formtools.wizard.views import SessionWizardView
@@ -11,6 +12,7 @@ from pretix.base.models import Event, Team
from pretix.control.forms.event import ( from pretix.control.forms.event import (
EventWizardBasicsForm, EventWizardCopyForm, EventWizardFoundationForm, EventWizardBasicsForm, EventWizardCopyForm, EventWizardFoundationForm,
) )
from pretix.control.forms.filter import EventFilterForm
class EventList(ListView): class EventList(ListView):
@@ -20,9 +22,21 @@ class EventList(ListView):
template_name = 'pretixcontrol/events/index.html' template_name = 'pretixcontrol/events/index.html'
def get_queryset(self): def get_queryset(self):
return self.request.user.get_events_with_any_permission().select_related('organizer').prefetch_related( qs = self.request.user.get_events_with_any_permission().select_related('organizer').prefetch_related(
'_settings_objects', 'organizer___settings_objects' '_settings_objects', 'organizer___settings_objects'
) )
if self.filter_form.is_valid():
qs = self.filter_form.filter_qs(qs)
return qs
def get_context_data(self, **kwargs):
ctx = super().get_context_data(**kwargs)
ctx['filter_form'] = self.filter_form
return ctx
@cached_property
def filter_form(self):
return EventFilterForm(data=self.request.GET, request=self.request)
def condition_copy(wizard): def condition_copy(wizard):

View File

@@ -1,12 +1,8 @@
import json
from django.db.models import Q from django.db.models import Q
from django.http import JsonResponse from django.http import JsonResponse
from django.urls import reverse from django.urls import reverse
from pretix.control.utils.i18n import i18ncomp
def i18ncomp(query):
return json.dumps(str(query))[1:-1]
def event_list(request): def event_list(request):