Wagtail navigation through pages is not very intuitive. If you have users with permissions per page, it's better to set PageChooser root to their root pages and add a menu link to easily edit their root pages.
1. Create a function for checking user root:
app/helpers.py
:
from wagtail.permission_policies.pages import PagePermissionPolicy
from django.urls import reverse
def get_root_page(user):
root_page = PagePermissionPolicy().explorable_root_instance(user)
# we can also get edit_url link and other things…
root_page.edit_url = reverse('wagtailadmin_pages:edit', args=[root_page.id])
return root_page
2. Register a hook to set PageChooser to user root:
app/wagtail_hooks.py
:
from wagtail import hooks
from wagtail.admin.menu import MenuItem
from app.helpers import get_root_page
@hooks.register('construct_page_chooser_queryset')
def show_my_pages_only(pages, request):
print(vars(get_root_page(request.user)))
pages = pages.descendant_of(get_root_page(request.user),inclusive=True)
return pages
3. Register a hook to add menu item that allows to easily edit user root page (if his root is not main Wagtail Root):
app/wagtail_hooks.py
:
@hooks.register('construct_main_menu')
def change_menu_items(request, menu_items):
# let's get root page
root_page = get_root_page(request.user)
# we can also exclude some menus
exclude = [
"help",
"reports",
]
menu_items[:] = [item for item in menu_items if (item.name not in exclude) ]
# now we add edit user root page menu item (if it's not main ROOT)
if (root_page.id and root_page.id!=1):
menu_items += [MenuItem('Main: '+root_page.title, root_page.edit_url, classnames='icon icon-home', order=-99999)]