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." %}

+
+
+ {% bootstrap_field filter_form.query layout='inline' %} +
+
+ +
+
{% trans "Create a new team" %} @@ -13,7 +27,9 @@ - + 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):
{% trans "Team name" %}{% trans "Team name" %} + + {% trans "Members" %} {% trans "Events" %}