Search History: Adding Page Privacy in Wagtail Programmatically

Versions:

  • Wagtail 2.1.1
  • Django 1.11
  • Python 3.6

This week I needed to manipulate the privacy of a Wagtail page programmatically. The Wagtail docs show you how to edit page privacy in the admin UI, but it doesn't peek behind the curtain to show you the code. The example here is a result of my Google searching.

page_privacy.jpg

For this example, assume we have a group called "members," and we need to restrict a page to be seen only by members of that group. This code assumes you have a page instance from a model that inherits from Wagtail's Page model, and that you have already defined your group.

from django.contrib.auth.models import Group
from wagtail.core.models import PageViewRestriction
from app.models import MyPage

members_group = Group.objects.get(name='members')
my_page = MyPage.objects.get(slug='my-slug')

Once you have retrieved the group and the page you want to restrict, create a new PageViewRestriction object. Because the groups attribute on the PageViewRestriction model is a ManyToMany field, you must create the restriction instance before you add the group.

restriction = PageViewRestriction.objects.create(
    page=my_page, 
    restriction_type=PageViewRestriction.GROUPS,
)

Now add the group that is allowed to see the page.

restriction.groups.add(members_group)

See the code for the PageViewRestriction class, and the available RESTRICTION_CHOICES (where I got PageViewRestriction.GROUPS) in the BaseViewRestriction class.

Thanks to Jeff Triplett for proofreading a draft of this article.