Wagtail, как фильтровать страницы, к которым у пользователя есть доступ для просмотра через свои группы - PullRequest
0 голосов
/ 01 октября 2019

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

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

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

1 Ответ

0 голосов
/ 01 октября 2019

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

Изучив исходный код 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
...