Wagtail, как фильтровать страницы, к которым пользователь имеет доступ для просмотра через свои группы

Я реализую функцию поиска, которая возвращает страницы, к которым пользователь имеет доступ через свои группы. Страницы имеют эти настройки, установленные через настройки конфиденциальности страницы администратора Wagtail при редактировании.

Например, страница может быть видна только пользователям в группе "Редакторы". Поэтому, когда пользователь, НЕ входящий в группу "Редакторы", ищет эту страницу, ее следует отфильтровать.

Как можно таким образом эффективно фильтровать страницы, недоступные пользователю? Я не мог найти четкого способа сделать это.

1 ответ

Решение

Чтобы ответить на мой собственный вопрос в целях поисковой оптимизации.

Изучив исходный код Wagtail, я обнаружил, что Wagtail использует PageViewRestriction модель внутренне.

Я решил использовать этот фрагмент для решения своей проблемы:

from wagtail.core.models import Page, PageViewRestriction

def filter_pages(user):
    pages = Page.objects.live()

    # Unauthenticated users can only see public pages
    if not user.is_authenticated:
        pages = pages.public()
    # Superusers can implicitly view all pages. No further filtering required
    elif not user.is_superuser:
        # Get all page ids where the user's groups do NOT have access to
        disallowed_ids = PageViewRestriction.objects.exclude(groups__id=user.groups.all()).values_list("page", flat=True)
        # Exclude all pages with disallowed ids
        pages = pages.exclude(id__in=disallowed_ids)

    return pages
Другие вопросы по тегам