diff --git a/doc/api/resources/checkinlists.rst b/doc/api/resources/checkinlists.rst index b3051226da..0c1cf26467 100644 --- a/doc/api/resources/checkinlists.rst +++ b/doc/api/resources/checkinlists.rst @@ -56,6 +56,10 @@ rules object Custom check-in The ``subevent`` attribute may now be ``null`` inside event series. The ``allow_multiple_entries``, ``allow_entry_after_exit``, and ``rules`` attributes have been added. +.. versionchanged:: 3.11 + + The ``subevent_match`` filter has been added. + Endpoints --------- @@ -109,6 +113,7 @@ Endpoints :query integer page: The page number in case of a multi-page result set, default is 1 :query integer subevent: Only return check-in lists of the sub-event with the given ID + :query integer subevent_match: Only return check-in lists that are valid for the sub-event with the given ID (i.e. also lists valid for all subevents) :param organizer: The ``slug`` field of the organizer to fetch :param event: The ``slug`` field of the event to fetch :statuscode 200: no error diff --git a/src/pretix/api/views/checkin.py b/src/pretix/api/views/checkin.py index 845a2abb25..cf51e209ef 100644 --- a/src/pretix/api/views/checkin.py +++ b/src/pretix/api/views/checkin.py @@ -1,3 +1,4 @@ +import django_filters from django.core.exceptions import ValidationError from django.db.models import Count, F, Max, OuterRef, Prefetch, Q, Subquery from django.db.models.functions import Coalesce @@ -27,10 +28,17 @@ from pretix.helpers.database import FixedOrderBy with scopes_disabled(): class CheckinListFilter(FilterSet): + subevent_match = django_filters.NumberFilter(method='subevent_match_qs') + class Meta: model = CheckinList fields = ['subevent'] + def subevent_match_qs(self, qs, name, value): + return qs.filter( + Q(subevent_id=value) | Q(subevent_id__isnull=True) + ) + class CheckinListViewSet(viewsets.ModelViewSet): serializer_class = CheckinListSerializer diff --git a/src/tests/api/test_checkin.py b/src/tests/api/test_checkin.py index a5eec78ed3..12ea154d86 100644 --- a/src/tests/api/test_checkin.py +++ b/src/tests/api/test_checkin.py @@ -162,11 +162,25 @@ def test_list_list(token_client, organizer, event, clist, item, subevent): resp = token_client.get( '/api/v1/organizers/{}/events/{}/checkinlists/?subevent={}'.format(organizer.slug, event.slug, subevent.pk)) assert [res] == resp.data['results'] + resp = token_client.get( + '/api/v1/organizers/{}/events/{}/checkinlists/?subevent_match={}'.format(organizer.slug, event.slug, subevent.pk)) + assert [res] == resp.data['results'] with scopes_disabled(): se2 = event.subevents.create(name="Foobar", date_from=datetime.datetime(2017, 12, 27, 10, 0, 0, tzinfo=UTC)) resp = token_client.get( '/api/v1/organizers/{}/events/{}/checkinlists/?subevent={}'.format(organizer.slug, event.slug, se2.pk)) assert [] == resp.data['results'] + resp = token_client.get( + '/api/v1/organizers/{}/events/{}/checkinlists/?subevent_match={}'.format(organizer.slug, event.slug, se2.pk)) + assert [] == resp.data['results'] + + clist.subevent = None + clist.save() + res["subevent"] = None + + resp = token_client.get( + '/api/v1/organizers/{}/events/{}/checkinlists/?subevent_match={}'.format(organizer.slug, event.slug, se2.pk)) + assert [res] == resp.data['results'] @pytest.mark.django_db