From 9b3e0c15e0f59cc1d1dc6bedad0632a0538d7916 Mon Sep 17 00:00:00 2001 From: Matt Westcott Date: Wed, 19 Sep 2018 12:32:20 +0100 Subject: [PATCH] Replace the page_action_menu template tag with a PageActionMenu class to manage rendering --- wagtail/admin/action_menu.py | 48 ++++++++++++++++--- .../templates/wagtailadmin/pages/create.html | 2 +- .../templates/wagtailadmin/pages/edit.html | 2 +- .../admin/templatetags/wagtailadmin_tags.py | 25 ---------- wagtail/admin/views/pages.py | 10 ++-- 5 files changed, 47 insertions(+), 40 deletions(-) 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 @@
  • 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 @@ 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 })