diff --git a/wagtail/admin/action_menu.py b/wagtail/admin/action_menu.py
index fc11c4fca..02424c288 100644
--- a/wagtail/admin/action_menu.py
+++ b/wagtail/admin/action_menu.py
@@ -5,6 +5,7 @@ from django.urls import reverse
from django.utils.translation import ugettext_lazy as _
from wagtail.core import hooks
+from wagtail.core.models import UserPagePermissionsProxy
class ActionMenuItem:
@@ -111,20 +112,53 @@ class DeleteMenuItem(ActionMenuItem):
return reverse('wagtailadmin_pages:delete', args=(context['page'].id,))
-PAGE_ACTION_MENU_ITEMS = None
+BASE_PAGE_ACTION_MENU_ITEMS = None
-def _get_action_menu_items():
- global PAGE_ACTION_MENU_ITEMS
+def _get_base_page_action_menu_items():
+ """
+ Retrieve the global list of menu items for the page action menu,
+ which may then be customised on a per-request basis
+ """
+ global BASE_PAGE_ACTION_MENU_ITEMS
- if PAGE_ACTION_MENU_ITEMS is None:
- PAGE_ACTION_MENU_ITEMS = [
+ if BASE_PAGE_ACTION_MENU_ITEMS is None:
+ BASE_PAGE_ACTION_MENU_ITEMS = [
UnpublishMenuItem(order=10),
DeleteMenuItem(order=20),
PublishMenuItem(order=30),
SubmitForModerationMenuItem(order=40),
]
for hook in hooks.get_hooks('register_page_action_menu_item'):
- PAGE_ACTION_MENU_ITEMS.append(hook())
+ BASE_PAGE_ACTION_MENU_ITEMS.append(hook())
- return PAGE_ACTION_MENU_ITEMS
+ return BASE_PAGE_ACTION_MENU_ITEMS
+
+
+class PageActionMenu:
+ template = 'wagtailadmin/pages/action_menu/menu.html'
+
+ def __init__(self, request, **kwargs):
+ self.request = request
+ self.context = kwargs
+ self.context['user_page_permissions'] = UserPagePermissionsProxy(self.request.user)
+
+ self.menu_items = [
+ menu_item
+ for menu_item in _get_base_page_action_menu_items()
+ if menu_item.is_shown(self.request, self.context)
+ ]
+
+ self.menu_items.sort(key=lambda item: item.order)
+
+ for hook in hooks.get_hooks('construct_page_action_menu'):
+ hook(self.menu_items, self.request, self.context)
+
+ def render_html(self):
+ return render_to_string(self.template, {
+ 'show_menu': bool(self.menu_items),
+ 'rendered_menu_items': [
+ menu_item.render_html(self.request, self.context)
+ for menu_item in self.menu_items
+ ]
+ }, request=self.request)
diff --git a/wagtail/admin/templates/wagtailadmin/pages/create.html b/wagtail/admin/templates/wagtailadmin/pages/create.html
index 538b17572..bc7a506ae 100644
--- a/wagtail/admin/templates/wagtailadmin/pages/create.html
+++ b/wagtail/admin/templates/wagtailadmin/pages/create.html
@@ -28,7 +28,7 @@
- {% page_action_menu action_menu_items view='create' parent_page=parent_page %}
+ {{ action_menu.render_html }}
diff --git a/wagtail/admin/templates/wagtailadmin/pages/edit.html b/wagtail/admin/templates/wagtailadmin/pages/edit.html
index 79ada04bb..749261454 100644
--- a/wagtail/admin/templates/wagtailadmin/pages/edit.html
+++ b/wagtail/admin/templates/wagtailadmin/pages/edit.html
@@ -40,7 +40,7 @@
- {% page_action_menu action_menu_items view=view_type page=page %}
+ {{ action_menu.render_html }}
diff --git a/wagtail/admin/templatetags/wagtailadmin_tags.py b/wagtail/admin/templatetags/wagtailadmin_tags.py
index ece3fef76..0359e3ad5 100644
--- a/wagtail/admin/templatetags/wagtailadmin_tags.py
+++ b/wagtail/admin/templatetags/wagtailadmin_tags.py
@@ -395,28 +395,3 @@ def avatar_url(user, size=50):
return gravatar_url
return static('wagtailadmin/images/default-user-avatar.png')
-
-
-@register.inclusion_tag("wagtailadmin/pages/action_menu/menu.html", takes_context=True)
-def page_action_menu(context, menu_items, **kwargs):
- menu_item_context = kwargs
- menu_item_context.update({
- 'user_page_permissions': _get_user_page_permissions(context),
- })
-
- visible_menu_items = [
- menu_item for menu_item in menu_items
- if menu_item.is_shown(context['request'], menu_item_context)
- ]
- visible_menu_items.sort(key=lambda item: item.order)
-
- for hook in hooks.get_hooks('construct_page_action_menu'):
- hook(visible_menu_items, context['request'], menu_item_context)
-
- return {
- 'show_menu': bool(visible_menu_items),
- 'rendered_menu_items': [
- menu_item.render_html(context['request'], menu_item_context)
- for menu_item in visible_menu_items
- ]
- }
diff --git a/wagtail/admin/views/pages.py b/wagtail/admin/views/pages.py
index 9c534d8db..cd1f3555d 100644
--- a/wagtail/admin/views/pages.py
+++ b/wagtail/admin/views/pages.py
@@ -18,7 +18,7 @@ from django.views.decorators.vary import vary_on_headers
from django.views.generic import View
from wagtail.admin import messages, signals
-from wagtail.admin.action_menu import _get_action_menu_items
+from wagtail.admin.action_menu import PageActionMenu
from wagtail.admin.forms.pages import CopyForm
from wagtail.admin.forms.search import SearchForm
from wagtail.admin.navigation import get_explorable_root_page
@@ -304,7 +304,7 @@ def create(request, content_type_app_name, content_type_model_name, parent_page_
'page_class': page_class,
'parent_page': parent_page,
'edit_handler': edit_handler,
- 'action_menu_items': _get_action_menu_items(),
+ 'action_menu': PageActionMenu(request, view='create', parent_page=parent_page),
'preview_modes': page.preview_modes,
'form': form,
'next': next_url,
@@ -528,13 +528,12 @@ def edit(request, page_id):
page_for_status = page
return render(request, 'wagtailadmin/pages/edit.html', {
- 'view_type': 'edit',
'page': page,
'page_for_status': page_for_status,
'content_type': content_type,
'edit_handler': edit_handler,
'errors_debug': errors_debug,
- 'action_menu_items': _get_action_menu_items(),
+ 'action_menu': PageActionMenu(request, view='edit', page=page),
'preview_modes': page.preview_modes,
'form': form,
'next': next_url,
@@ -1138,14 +1137,13 @@ def revisions_revert(request, page_id, revision_id):
))
return render(request, 'wagtailadmin/pages/edit.html', {
- 'view_type': 'revisions_revert',
'page': page,
'revision': revision,
'is_revision': True,
'content_type': content_type,
'edit_handler': edit_handler,
'errors_debug': None,
- 'action_menu_items': _get_action_menu_items(),
+ 'action_menu': PageActionMenu(request, view='revisions_revert', page=page),
'preview_modes': page.preview_modes,
'form': form, # Used in unit tests
})