Replace the page_action_menu template tag with a PageActionMenu class to manage rendering

This commit is contained in:
Matt Westcott 2018-09-19 12:32:20 +01:00 committed by Karl Hobley
parent b48566e735
commit 9b3e0c15e0
5 changed files with 47 additions and 40 deletions

View file

@ -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)

View file

@ -28,7 +28,7 @@
<li class="actions">
<div class="dropdown dropup dropdown-button match-width">
<button type="submit" class="button action-save button-longrunning" tabindex="3" data-clicked-text="{% trans 'Saving…' %}"><span class="icon icon-spinner"></span><em>{% trans 'Save draft' %}</em></button>
{% page_action_menu action_menu_items view='create' parent_page=parent_page %}
{{ action_menu.render_html }}
</div>
</li>

View file

@ -40,7 +40,7 @@
<div class="dropdown dropup dropdown-button match-width {% if is_revision %}warning{% endif %}">
<button type="submit" class="button action-save button-longrunning {% if is_revision %}warning{% endif %}" tabindex="3" data-clicked-text="{% trans 'Saving…' %}" {% if page.locked %}disabled {% endif %}><span class="icon icon-spinner"></span><em>{% if page.locked %}{% trans 'Page locked' %}{% else %}{% if is_revision %}{% trans 'Replace current draft' %}{% else %}{% trans 'Save draft' %}{% endif %}{% endif %}</em></button>
{% page_action_menu action_menu_items view=view_type page=page %}
{{ action_menu.render_html }}
</div>
</li>

View file

@ -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
]
}

View file

@ -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
})