Трясогузка / Django: Фильтр запросов возвращает только те страницы, к которым у пользователя есть доступ / права доступа? - PullRequest
0 голосов
/ 13 января 2020

Я просматриваю документацию по адресу: http://docs.wagtail.io/en/v2.7.1/reference/pages/queryset_reference.html.

Существует ли фильтр для возврата только тех страниц, к которым у пользователя есть доступ? Я могу видеть только public() и not_public().

. У меня есть несколько страниц, для которых конфиденциальность установлена ​​как «Личная» (доступна пользователям в определенных c группах). И хотел бы исключить их из результатов запроса.

1 Ответ

0 голосов
/ 16 января 2020

В PageQuerySet такого фильтра нет. Однако вы можете создать свой собственный QuerySet, который добавляет авторизованный фильтр и использовать его. Следующий код взят из событий Joyous EventQuerySet и основан на PageQuerySet.public_q и BaseViewRestriction.accept_request. Он получает все ограничения, которые могут применяться, исключает те, которые проходит пользователь, а затем отфильтровывает страницы с остальными ограничениями.

from wagtail.core.query import PageQuerySet
from wagtail.core.models import Page, PageManager, PageViewRestriction

class MyQuerySet(PageQuerySet):
    def authorized_q(self, request):
        PASSWORD = PageViewRestriction.PASSWORD
        LOGIN    = PageViewRestriction.LOGIN
        GROUPS   = PageViewRestriction.GROUPS
        KEY      = PageViewRestriction.passed_view_restrictions_session_key

        restrictions = PageViewRestriction.objects.all()
        passed = request.session.get(KEY, [])
        if passed:
            restrictions = restrictions.exclude(id__in=passed,
                                                restriction_type=PASSWORD)
        if request.user.is_authenticated:
            restrictions = restrictions.exclude(restriction_type=LOGIN)
        if request.user.is_superuser:
            restrictions = restrictions.exclude(restriction_type=GROUPS)
        else:
            membership = request.user.groups.all()
            if membership:
                restrictions = restrictions.exclude(groups__in=membership,
                                                    restriction_type=GROUPS)
        q = models.Q()
        for restriction in restrictions:
            q &= ~self.descendant_of_q(restriction.page, inclusive=True)
        return q

    def authorized(self, request):
        self.request = request
        if request is None:
            return self
        else:
            return self.filter(self.authorized_q(request))

Затем вы можете установить его в качестве QuerySet по умолчанию для вашей модели.

class MyPage(Page):
    objects = PageManager.from_queryset(MyQuerySet)()

Затем при фильтрации объектов MyPage вы можете сказать MyPage.objects.live().authorized(request).all()

Надеюсь, что полезно Может содержать ошибки.

...