From 0a46c9680f5018931eacec63a902dd1529aa326b Mon Sep 17 00:00:00 2001 From: Karl Hobley Date: Thu, 25 Feb 2016 08:38:29 +0000 Subject: [PATCH] Implement special "root" page value for child_of/decendant_of filters This adds the ability to specify "root" to the child_of and decendant_of filters, which represents the homepage of the current site. --- wagtail/api/v2/filters.py | 22 ++++++++++++++++++++-- wagtail/api/v2/tests/test_pages.py | 17 +++++++++++++++++ 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/wagtail/api/v2/filters.py b/wagtail/api/v2/filters.py index dc989130c..42411f3c3 100644 --- a/wagtail/api/v2/filters.py +++ b/wagtail/api/v2/filters.py @@ -114,6 +114,9 @@ class ChildOfFilter(BaseFilterBackend): Implements the ?child_of filter used to filter the results to only contain pages that are direct children of the specified page. """ + def get_root_page(self, request): + return Page.get_first_root_node() + def get_page_by_id(self, request, page_id): return Page.objects.get(id=page_id) @@ -125,7 +128,10 @@ class ChildOfFilter(BaseFilterBackend): parent_page = self.get_page_by_id(request, parent_page_id) except (ValueError, AssertionError): - raise BadRequestError("child_of must be a positive integer") + if request.GET['child_of'] == 'root': + parent_page = self.get_root_page(request) + else: + raise BadRequestError("child_of must be a positive integer") except Page.DoesNotExist: raise BadRequestError("parent page doesn't exist") @@ -140,6 +146,9 @@ class RestrictedChildOfFilter(ChildOfFilter): A restricted version of ChildOfFilter that only allows pages in the current site to be specified. """ + def get_root_page(self, request): + return request.site.root_page + def get_page_by_id(self, request, page_id): site_pages = pages_for_site(request.site) return site_pages.get(id=page_id) @@ -150,6 +159,9 @@ class DescendantOfFilter(BaseFilterBackend): Implements the ?decendant_of filter which limits the set of pages to a particular branch of the page tree. """ + def get_root_page(self, request): + return Page.get_first_root_node() + def get_page_by_id(self, request, page_id): return Page.objects.get(id=page_id) @@ -163,7 +175,10 @@ class DescendantOfFilter(BaseFilterBackend): parent_page = self.get_page_by_id(request, parent_page_id) except (ValueError, AssertionError): - raise BadRequestError("descendant_of must be a positive integer") + if request.GET['descendant_of'] == 'root': + parent_page = self.get_root_page(request) + else: + raise BadRequestError("descendant_of must be a positive integer") except Page.DoesNotExist: raise BadRequestError("ancestor page doesn't exist") @@ -177,6 +192,9 @@ class RestrictedDescendantOfFilter(DescendantOfFilter): A restricted version of DecendantOfFilter that only allows pages in the current site to be specified. """ + def get_root_page(self, request): + return request.site.root_page + def get_page_by_id(self, request, page_id): site_pages = pages_for_site(request.site) return site_pages.get(id=page_id) diff --git a/wagtail/api/v2/tests/test_pages.py b/wagtail/api/v2/tests/test_pages.py index 9bb873454..8c8762b10 100644 --- a/wagtail/api/v2/tests/test_pages.py +++ b/wagtail/api/v2/tests/test_pages.py @@ -286,6 +286,14 @@ class TestPageListing(TestCase): page_id_list = self.get_page_id_list(content) self.assertEqual(page_id_list, [16, 18, 19]) + def test_child_of_root(self): + # "root" gets children of the homepage of the current site + response = self.get_response(child_of='root') + content = json.loads(response.content.decode('UTF-8')) + + page_id_list = self.get_page_id_list(content) + self.assertEqual(page_id_list, [4, 5, 6, 20, 12]) + def test_child_of_with_type(self): response = self.get_response(type='demosite.EventPage', child_of=5) content = json.loads(response.content.decode('UTF-8')) @@ -325,6 +333,15 @@ class TestPageListing(TestCase): page_id_list = self.get_page_id_list(content) self.assertEqual(page_id_list, [10, 15, 17, 21, 22, 23]) + def test_descendant_of_root(self): + # "root" gets decendants of the homepage of the current site + # Basically returns every page except the homepage + response = self.get_response(descendant_of='root') + content = json.loads(response.content.decode('UTF-8')) + + page_id_list = self.get_page_id_list(content) + self.assertEqual(page_id_list, [4, 8, 9, 5, 16, 18, 19, 6, 10, 15, 17, 21, 22, 23, 20, 13, 14, 12]) + def test_descendant_of_with_type(self): response = self.get_response(type='tests.EventPage', descendant_of=6) content = json.loads(response.content.decode('UTF-8'))