From bee7314dd7ffe75fc300de9d09eafc5350f535fb Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Tue, 24 Apr 2018 18:33:57 +0200 Subject: [PATCH] API: Add filters to questions view --- doc/api/resources/questions.rst | 8 ++++++++ src/pretix/api/views/item.py | 9 ++++++++- src/tests/api/test_items.py | 25 +++++++++++++++++++++++++ 3 files changed, 41 insertions(+), 1 deletion(-) diff --git a/doc/api/resources/questions.rst b/doc/api/resources/questions.rst index 167d03799..4bac9d060 100644 --- a/doc/api/resources/questions.rst +++ b/doc/api/resources/questions.rst @@ -59,6 +59,11 @@ options list of objects In case of ques Endpoints --------- +.. versionchanged:: 1.15 + + The questions endpoint has been extended by the filter queries ``ask_during_checkin``, ``requred``, and + ``identifier``. + .. http:get:: /api/v1/organizers/(organizer)/events/(event)/questions/ Returns a list of all questions within a given event. @@ -120,6 +125,9 @@ Endpoints :query integer page: The page number in case of a multi-page result set, default is 1 :query string ordering: Manually set the ordering of results. Valid fields to be used are ``id`` and ``position``. Default: ``position`` + :query string identifier: Only return questions with the given identifier string + :query boolean ask_during_checkin: Only return questions that are or are not to be asked during check-in + :query boolean required: Only return questions that are or are not required to fill in :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/item.py b/src/pretix/api/views/item.py index f26530c59..e941d791a 100644 --- a/src/pretix/api/views/item.py +++ b/src/pretix/api/views/item.py @@ -251,10 +251,17 @@ class ItemCategoryViewSet(viewsets.ModelViewSet): super().perform_destroy(instance) +class QuestionFilter(FilterSet): + class Meta: + model = Question + fields = ['ask_during_checkin', 'required', 'identifier'] + + class QuestionViewSet(viewsets.ModelViewSet): serializer_class = QuestionSerializer queryset = Question.objects.none() - filter_backends = (OrderingFilter,) + filter_backends = (DjangoFilterBackend, OrderingFilter) + filter_class = QuestionFilter ordering_fields = ('id', 'position') ordering = ('position', 'id') permission = 'can_change_items' diff --git a/src/tests/api/test_items.py b/src/tests/api/test_items.py index f99aa4113..a050dc904 100644 --- a/src/tests/api/test_items.py +++ b/src/tests/api/test_items.py @@ -1296,6 +1296,31 @@ def test_question_list(token_client, organizer, event, question, item): assert resp.status_code == 200 assert [res] == resp.data['results'] + resp = token_client.get('/api/v1/organizers/{}/events/{}/questions/?required=false'.format( + organizer.slug, event.slug + )) + assert [res] == resp.data['results'] + resp = token_client.get('/api/v1/organizers/{}/events/{}/questions/?ask_during_checkin=false'.format( + organizer.slug, event.slug + )) + assert [res] == resp.data['results'] + resp = token_client.get('/api/v1/organizers/{}/events/{}/questions/?identifier=ABC'.format( + organizer.slug, event.slug + )) + assert [res] == resp.data['results'] + resp = token_client.get('/api/v1/organizers/{}/events/{}/questions/?required=true'.format( + organizer.slug, event.slug + )) + assert [] == resp.data['results'] + resp = token_client.get('/api/v1/organizers/{}/events/{}/questions/?ask_during_checkin=true'.format( + organizer.slug, event.slug + )) + assert [] == resp.data['results'] + resp = token_client.get('/api/v1/organizers/{}/events/{}/questions/?identifier=DEF'.format( + organizer.slug, event.slug + )) + assert [] == resp.data['results'] + @pytest.mark.django_db def test_question_detail(token_client, organizer, event, question, item):