Move ForExplorerFilter into Admin API implementation

Not generally useful in the Public API
This commit is contained in:
Karl Hobley 2019-11-05 11:38:59 +00:00 committed by Karl Hobley
parent 16d5b5c99e
commit 4e5587918a
3 changed files with 21 additions and 20 deletions

View file

@ -4,12 +4,12 @@ from rest_framework.authentication import SessionAuthentication
from wagtail.api.v2.endpoints import PagesAPIViewSet
from wagtail.api.v2.filters import (
ChildOfFilter, DescendantOfFilter, FieldsFilter, ForExplorerFilter, OrderingFilter,
ChildOfFilter, DescendantOfFilter, FieldsFilter, OrderingFilter,
SearchFilter)
from wagtail.api.v2.utils import BadRequestError, filter_page_type, page_models_from_string
from wagtail.core.models import Page
from .filters import HasChildrenFilter
from .filters import ForExplorerFilter, HasChildrenFilter
from .serializers import AdminPageSerializer

View file

@ -1,6 +1,8 @@
from rest_framework.filters import BaseFilterBackend
from wagtail.api.v2.utils import BadRequestError, parse_boolean
from wagtail.core import hooks
from wagtail.core.models import UserPagePermissionsProxy
class HasChildrenFilter(BaseFilterBackend):
@ -21,3 +23,19 @@ class HasChildrenFilter(BaseFilterBackend):
return queryset.filter(numchild=0)
return queryset
class ForExplorerFilter(BaseFilterBackend):
def filter_queryset(self, request, queryset, view):
if request.GET.get('for_explorer'):
if not hasattr(queryset, '_filtered_by_child_of'):
raise BadRequestError("filtering by for_explorer without child_of is not supported")
parent_page = queryset._filtered_by_child_of
for hook in hooks.get_hooks('construct_explorer_page_queryset'):
queryset = hook(parent_page, queryset, request)
user_perms = UserPagePermissionsProxy(request.user)
queryset = queryset & user_perms.explorable_pages()
return queryset

View file

@ -3,8 +3,7 @@ from django.db import models
from rest_framework.filters import BaseFilterBackend
from taggit.managers import TaggableManager
from wagtail.core import hooks
from wagtail.core.models import Page, UserPagePermissionsProxy
from wagtail.core.models import Page
from wagtail.search.backends import get_search_backend
from wagtail.search.backends.base import FilterFieldError, OrderByFieldError
@ -219,19 +218,3 @@ class RestrictedDescendantOfFilter(DescendantOfFilter):
def get_page_by_id(self, request, page_id):
site_pages = pages_for_site(request.site)
return site_pages.get(id=page_id)
class ForExplorerFilter(BaseFilterBackend):
def filter_queryset(self, request, queryset, view):
if request.GET.get('for_explorer'):
if not hasattr(queryset, '_filtered_by_child_of'):
raise BadRequestError("filtering by for_explorer without child_of is not supported")
parent_page = queryset._filtered_by_child_of
for hook in hooks.get_hooks('construct_explorer_page_queryset'):
queryset = hook(parent_page, queryset, request)
user_perms = UserPagePermissionsProxy(request.user)
queryset = queryset & user_perms.explorable_pages()
return queryset