mirror of
https://github.com/pretix/pretix.git
synced 2026-05-10 16:04:02 +00:00
Filter list of events
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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 %}
|
||||||
|
|||||||
@@ -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]
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
Reference in New Issue
Block a user