diff --git a/wagtail/admin/api/serializers.py b/wagtail/admin/api/serializers.py index 589257148..67dde88ff 100644 --- a/wagtail/admin/api/serializers.py +++ b/wagtail/admin/api/serializers.py @@ -51,7 +51,7 @@ class PageChildrenField(Field): def to_representation(self, page): return OrderedDict([ - ('count', page.numchild), + ('count', self.context['base_queryset'].child_of(page).count()), ('listing_url', get_model_listing_url(self.context, Page) + '?child_of=' + str(page.id)), ]) @@ -71,7 +71,7 @@ class PageDescendantsField(Field): def to_representation(self, page): return OrderedDict([ - ('count', page.get_descendants().count()), + ('count', self.context['base_queryset'].descendant_of(page).count()), ('listing_url', get_model_listing_url(self.context, Page) + '?descendant_of=' + str(page.id)), ]) diff --git a/wagtail/admin/tests/api/test_pages.py b/wagtail/admin/tests/api/test_pages.py index f11410151..01aba941d 100644 --- a/wagtail/admin/tests/api/test_pages.py +++ b/wagtail/admin/tests/api/test_pages.py @@ -518,6 +518,14 @@ class TestAdminPageDetail(AdminAPITestCase, TestPageDetail): self.assertEqual(content['__types']['demosite.BlogIndexPage']['verbose_name'], 'blog index page') self.assertEqual(content['__types']['demosite.BlogIndexPage']['verbose_name_plural'], 'blog index pages') + # Overriden from public API tests + def test_meta_parent_id_doesnt_show_root_page(self): + # Root page is visible in the admin API + response = self.get_response(2) + content = json.loads(response.content.decode('UTF-8')) + + self.assertIsNotNone(content['meta']['parent']) + def test_field_ordering(self): # Need to override this as the admin API has a __types field diff --git a/wagtail/api/v2/endpoints.py b/wagtail/api/v2/endpoints.py index 2811355bc..34d5e817f 100644 --- a/wagtail/api/v2/endpoints.py +++ b/wagtail/api/v2/endpoints.py @@ -464,3 +464,11 @@ class PagesAPIViewSet(BaseAPIViewSet): return page return super().find_object(queryset, request) + + def get_serializer_context(self): + """ + The serialization context differs between listing and detail views. + """ + context = super().get_serializer_context() + context['base_queryset'] = self.get_base_queryset() + return context diff --git a/wagtail/api/v2/serializers.py b/wagtail/api/v2/serializers.py index e966dd82e..ea9852494 100644 --- a/wagtail/api/v2/serializers.py +++ b/wagtail/api/v2/serializers.py @@ -8,7 +8,7 @@ from taggit.managers import _TaggableManager from wagtail.core import fields as wagtailcore_fields -from .utils import get_object_detail_url, pages_for_site +from .utils import get_object_detail_url class TypeField(Field): @@ -121,8 +121,7 @@ class PageParentField(relations.RelatedField): def get_attribute(self, instance): parent = instance.get_parent() - site_pages = pages_for_site(self.context['request'].site) - if site_pages.filter(id=parent.id).exists(): + if self.context['base_queryset'].filter(id=parent.id).exists(): return parent def to_representation(self, value): diff --git a/wagtail/api/v2/utils.py b/wagtail/api/v2/utils.py index 84bcee8a0..b8cc8a664 100644 --- a/wagtail/api/v2/utils.py +++ b/wagtail/api/v2/utils.py @@ -32,12 +32,6 @@ def get_object_detail_url(router, request, model, pk): return get_full_url(request, url_path) -def pages_for_site(site): - pages = Page.objects.public().live() - pages = pages.descendant_of(site.root_page, inclusive=True) - return pages - - def page_models_from_string(string): page_models = []