From b391cbfd627f5403cf869e2e2a0ea90925295632 Mon Sep 17 00:00:00 2001 From: Michael Fillier Date: Thu, 10 Dec 2015 10:30:42 +0000 Subject: [PATCH] Added 'operator' to the API --- wagtail/api/v2/endpoints.py | 1 + wagtail/api/v2/filters.py | 3 ++- wagtail/api/v2/tests/test_pages.py | 16 ++++++++++++++++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/wagtail/api/v2/endpoints.py b/wagtail/api/v2/endpoints.py index 974919c6b..93ef843c8 100644 --- a/wagtail/api/v2/endpoints.py +++ b/wagtail/api/v2/endpoints.py @@ -45,6 +45,7 @@ class BaseAPIEndpoint(GenericViewSet): 'fields', 'order', 'search', + 'search_operator', # Used by jQuery for cache-busting. See #1671 '_', diff --git a/wagtail/api/v2/filters.py b/wagtail/api/v2/filters.py index afaf56c49..dedb69813 100644 --- a/wagtail/api/v2/filters.py +++ b/wagtail/api/v2/filters.py @@ -101,9 +101,10 @@ class SearchFilter(BaseFilterBackend): raise BadRequestError("filtering by tag with a search query is not supported") search_query = request.GET['search'] + search_operator = request.GET.get('search_operator', None) sb = get_search_backend() - queryset = sb.search(search_query, queryset) + queryset = sb.search(search_query, queryset, operator=search_operator) return queryset diff --git a/wagtail/api/v2/tests/test_pages.py b/wagtail/api/v2/tests/test_pages.py index c531408e1..9039a5050 100644 --- a/wagtail/api/v2/tests/test_pages.py +++ b/wagtail/api/v2/tests/test_pages.py @@ -552,6 +552,22 @@ class TestPageListing(TestCase): self.assertEqual(response.status_code, 400) self.assertEqual(content, {'message': "filtering by tag with a search query is not supported"}) + def test_search_operator_and(self): + response = self.get_response(type='demosite.BlogEntryPage', search='blog again', search_operator='and') + content = json.loads(response.content.decode('UTF-8')) + + page_id_list = self.get_page_id_list(content) + + self.assertEqual(set(page_id_list), set([18])) + + def test_search_operator_or(self): + response = self.get_response(type='demosite.BlogEntryPage', search='blog again', search_operator='or') + content = json.loads(response.content.decode('UTF-8')) + + page_id_list = self.get_page_id_list(content) + + self.assertEqual(set(page_id_list), set([16, 18, 19])) + class TestPageDetail(TestCase): fixtures = ['demosite.json']