diff --git a/src/pretix/control/forms/filter.py b/src/pretix/control/forms/filter.py
index 2faa63ad0..652a33d26 100644
--- a/src/pretix/control/forms/filter.py
+++ b/src/pretix/control/forms/filter.py
@@ -1022,6 +1022,44 @@ class GiftCardFilterForm(FilterForm):
return qs.distinct()
+class TeamFilterForm(FilterForm):
+ orders = {
+ 'name': 'name',
+ }
+ query = forms.CharField(
+ label=_('Search query'),
+ widget=forms.TextInput(attrs={
+ 'placeholder': _('Search query'),
+ 'autofocus': 'autofocus'
+ }),
+ required=False
+ )
+
+ def __init__(self, *args, **kwargs):
+ kwargs.pop('request')
+ super().__init__(*args, **kwargs)
+
+ def filter_qs(self, qs):
+ fdata = self.cleaned_data
+
+ if fdata.get('query'):
+ query = fdata.get('query')
+ qs = qs.filter(
+ Q(name__icontains=query)
+ | Q(members__email__icontains=query)
+ | Q(members__fullname__icontains=query)
+ | Q(invites__email__icontains=query)
+ | Q(tokens__name__icontains=query)
+ )
+
+ if fdata.get('ordering'):
+ qs = qs.order_by(self.get_order_by())
+ else:
+ qs = qs.order_by('name')
+
+ return qs.distinct()
+
+
class EventFilterForm(FilterForm):
orders = {
'slug': 'slug',
diff --git a/src/pretix/control/templates/pretixcontrol/organizers/teams.html b/src/pretix/control/templates/pretixcontrol/organizers/teams.html
index faecf6bce..3f695d5fa 100644
--- a/src/pretix/control/templates/pretixcontrol/organizers/teams.html
+++ b/src/pretix/control/templates/pretixcontrol/organizers/teams.html
@@ -1,11 +1,25 @@
{% extends "pretixcontrol/organizers/base.html" %}
{% load i18n %}
+{% load urlreplace %}
{% load bootstrap3 %}
{% block inner %}
{% trans "Teams" %}
{% trans "The list below shows all teams that exist within this organizer." %}
+
{% trans "Create a new team" %}
@@ -13,7 +27,9 @@
- | {% trans "Team name" %} |
+ {% trans "Team name" %}
+
+ |
{% trans "Members" %} |
{% trans "Events" %} |
|
diff --git a/src/pretix/control/views/organizer.py b/src/pretix/control/views/organizer.py
index 79918c81e..4b331fd85 100644
--- a/src/pretix/control/views/organizer.py
+++ b/src/pretix/control/views/organizer.py
@@ -77,7 +77,7 @@ from pretix.base.settings import SETTINGS_AFFECTING_CSS
from pretix.base.signals import register_multievent_data_exporters
from pretix.base.views.tasks import AsyncAction
from pretix.control.forms.filter import (
- EventFilterForm, GiftCardFilterForm, OrganizerFilterForm,
+ EventFilterForm, GiftCardFilterForm, OrganizerFilterForm, TeamFilterForm,
)
from pretix.control.forms.orders import ExporterForm
from pretix.control.forms.organizer import (
@@ -390,18 +390,30 @@ class OrganizerCreate(CreateView):
})
-class TeamListView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, ListView):
+class TeamListView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, PaginationMixin, ListView):
model = Team
template_name = 'pretixcontrol/organizers/teams.html'
permission = 'can_change_teams'
context_object_name = 'teams'
def get_queryset(self):
- return self.request.organizer.teams.annotate(
+ qs = self.request.organizer.teams.annotate(
memcount=Count('members', distinct=True),
eventcount=Count('limit_events', distinct=True),
invcount=Count('invites', distinct=True)
).all().order_by('name')
+ 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 TeamFilterForm(data=self.request.GET, request=self.request)
class TeamCreateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, CreateView):