0

I'm wondering if anyone has examples of how to create permissions in Wagtail for collections and pages and then give specific users access to that role. I see how to create the Collections and AuthGroups easily, but I don't see how to specify the AuthGroup permissions in detail.

Edit: In my case, the answer below in addition, to this bit of code for module permissions allowed for everything to be automatically added for a group:

try:
  perm = course_group.permissions.get(codename=x.codename, content_type=x.content_type)
except Permission.DoesNotExist:
  perm_created = course_group.permissions.add(x)

1 Answers1

0

I have some code like this in a population script. In this example, I want a group named Team to be able to add, change and choose wagtail images and documents in any collection. I also want them to be able to add, edit and publish any pages on the site. This example can hopefully be modified to suit another setup.

from wagtail.models import Page
from wagtail.core.models import Collection, GroupCollectionPermission, GroupPagePermission
from django.contrib.auth.models import Group, Permission

team_group, created = Group.objects.get_or_create(name='Team')
if created:
    #This is only done once, when the group didn't already exist
    root_collection = Collection.get_first_root_node()
    GroupCollectionPermission.objects.create(group=team_group, collection=root_collection, permission=Permission.objects.get(content_type__app_label='wagtailimages', codename='add_image'))
    GroupCollectionPermission.objects.create(group=team_group, collection=root_collection, permission=Permission.objects.get(content_type__app_label='wagtailimages', codename='change_image'))
    GroupCollectionPermission.objects.create(group=team_group, collection=root_collection, permission=Permission.objects.get(content_type__app_label='wagtailimages', codename='choose_image'))

    GroupCollectionPermission.objects.create(group=team_group, collection=root_collection, permission=Permission.objects.get(content_type__app_label='wagtaildocs', codename='add_document'))
    GroupCollectionPermission.objects.create(group=team_group, collection=root_collection, permission=Permission.objects.get(content_type__app_label='wagtaildocs', codename='change_document'))
    GroupCollectionPermission.objects.create(group=team_group, collection=root_collection, permission=Permission.objects.get(content_type__app_label='wagtaildocs', codename='choose_document'))

    root_page = Page.objects.get(id=1)
    GroupPagePermission.objects.create(group=team_group, page=root_page, permission_type='add')
    GroupPagePermission.objects.create(group=team_group, page=root_page, permission_type='edit')
    GroupPagePermission.objects.create(group=team_group, page=root_page, permission_type='publish')

To find the available wagtail content types and list their identifiers, I ran

for x in Permission.objects.order_by().values('content_type__app_label').distinct():
    print(x['content_type__app_label'])

To find the permission codenames of a given content type, I ran

for x in Permission.objects.filter(content_type__app_label='wagtailimages'):
    print(x.codename)

For the GroupPagePermission parameter permission_type, I found the options in the wagtail source. It lists these options:

PAGE_PERMISSION_TYPES = [
    ('add', _("Add"), _("Add/edit pages you own")),
    ('edit', _("Edit"), _("Edit any page")),
    ('publish', _("Publish"), _("Publish any page")),
    ('bulk_delete', _("Bulk delete"), _("Delete pages with children")),
    ('lock', _("Lock"), _("Lock/unlock pages you've locked")),
    ('unlock', _("Unlock"), _("Unlock any page")),
]

In my project I'm not adding users to groups programmatically, but hopefully this answer helps

Ada Fuge
  • 26
  • 6