kopia lustrzana https://github.com/wagtail/wagtail
Allow default item in action menu to be overridden with construct_page_action_menu hook
Fixes #5438pull/5615/head
rodzic
0507ec5377
commit
fe2f8644fa
|
@ -566,12 +566,33 @@ Hooks for customising the way users are directed through the process of creating
|
|||
|
||||
Modify the final list of action menu items on the page creation and edit views. The callable passed to this hook receives a list of ``ActionMenuItem`` objects, a request object and a context dictionary as per ``register_page_action_menu_item``, and should modify the list of menu items in-place.
|
||||
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
@hooks.register('construct_page_action_menu')
|
||||
def remove_submit_to_moderator_option(menu_items, request, context):
|
||||
menu_items[:] = [item for item in menu_items if item.name != 'action-submit']
|
||||
|
||||
|
||||
.. _construct_page_action_menu:
|
||||
|
||||
Can also be used to customize default action menu button. The last item in menu_item variable is chosen as the default action. An example on changing the default to publish can be seen below.
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from wagtail.admin.action_menu import UnpublishMenuItem, DeleteMenuItem, SubmitForModerationMenuItem, SaveDraftMenuItem, PublishMenuItem
|
||||
|
||||
@hooks.register('construct_page_action_menu')
|
||||
def make_publish_default_action(menu_items, request, context):
|
||||
menu_items[:] = [
|
||||
UnpublishMenuItem(order=10),
|
||||
DeleteMenuItem(order=20),
|
||||
SubmitForModerationMenuItem(order=30),
|
||||
SaveDraftMenuItem(order=40),
|
||||
PublishMenuItem(order=50),
|
||||
]
|
||||
|
||||
|
||||
.. construct_page_listing_buttons:
|
||||
|
||||
``construct_page_listing_buttons``
|
||||
|
|
|
@ -57,6 +57,7 @@ class ActionMenuItem(metaclass=MediaDefiningClass):
|
|||
|
||||
|
||||
class PublishMenuItem(ActionMenuItem):
|
||||
label = "Publish"
|
||||
name = 'action-publish'
|
||||
template = 'wagtailadmin/pages/action_menu/publish.html'
|
||||
|
||||
|
@ -121,6 +122,17 @@ class DeleteMenuItem(ActionMenuItem):
|
|||
return reverse('wagtailadmin_pages:delete', args=(context['page'].id,))
|
||||
|
||||
|
||||
class SaveDraftMenuItem(ActionMenuItem):
|
||||
name = 'action-save-draft'
|
||||
label = _("Save Draft")
|
||||
template = 'wagtailadmin/pages/action_menu/save_draft.html'
|
||||
|
||||
def get_context(self, request, parent_context):
|
||||
context = super().get_context(request, parent_context)
|
||||
context['is_revision'] = (context['view'] == 'revisions_revert')
|
||||
return context
|
||||
|
||||
|
||||
BASE_PAGE_ACTION_MENU_ITEMS = None
|
||||
|
||||
|
||||
|
@ -137,6 +149,7 @@ def _get_base_page_action_menu_items():
|
|||
DeleteMenuItem(order=20),
|
||||
PublishMenuItem(order=30),
|
||||
SubmitForModerationMenuItem(order=40),
|
||||
SaveDraftMenuItem(order=50),
|
||||
]
|
||||
for hook in hooks.get_hooks('register_page_action_menu_item'):
|
||||
BASE_PAGE_ACTION_MENU_ITEMS.append(hook())
|
||||
|
@ -163,13 +176,16 @@ class PageActionMenu:
|
|||
for hook in hooks.get_hooks('construct_page_action_menu'):
|
||||
hook(self.menu_items, self.request, self.context)
|
||||
|
||||
self.default_item = self.menu_items.pop() if self.menu_items else SaveDraftMenuItem(order=50)
|
||||
|
||||
def render_html(self):
|
||||
return render_to_string(self.template, {
|
||||
'default_menu_item': self.default_item.render_html(self.request, self.context),
|
||||
'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)
|
||||
|
||||
@cached_property
|
||||
|
|
|
@ -1,6 +1,11 @@
|
|||
{% if show_menu %}
|
||||
{{ default_menu_item }}
|
||||
<div class="dropdown-toggle icon icon-arrow-up"></div>
|
||||
<ul>
|
||||
{% for item in rendered_menu_items %}{{ item }}{% endfor %}
|
||||
{% for item in rendered_menu_items %}
|
||||
<li>
|
||||
{{ item }}
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% endif %}
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
<li>
|
||||
{% if url %}
|
||||
<a href="{{ url }}">{{ label }}</a>
|
||||
{% else %}
|
||||
<input type="submit" name="{{ name }}" value="{{ label }}" class="button" />
|
||||
{% endif %}
|
||||
</li>
|
||||
{% if url %}
|
||||
<a class="button" href="{{ url }}">{{ label }}</a>
|
||||
{% else %}
|
||||
<input type="submit" name="{{ name }}" value="{{ label }}" class="button" />
|
||||
{% endif %}
|
||||
|
|
|
@ -1,4 +1,2 @@
|
|||
{% load i18n %}
|
||||
<li>
|
||||
<button type="submit" name="action-publish" value="action-publish" class="button button-longrunning {% if is_revision %}warning{% endif %}" data-clicked-text="{% trans 'Publishing…' %}"><span class="icon icon-spinner"></span><em>{% if is_revision %}{% trans 'Publish this revision' %}{% else %}{% trans 'Publish' %}{% endif %}</em></button>
|
||||
</li>
|
||||
<button type="submit" name="action-publish" value="action-publish" class="button button-longrunning {% if is_revision %}warning{% endif %}" data-clicked-text="{% trans 'Publishing…' %}"><span class="icon icon-spinner"></span><em>{% if is_revision %}{% trans 'Publish this revision' %}{% else %}{% trans 'Publish' %}{% endif %}</em></button>
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
{% load i18n %}
|
||||
<button type="submit" class="button action-save button-longrunning {% if is_revision %}warning{% endif %}" 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>
|
|
@ -26,12 +26,11 @@
|
|||
<footer role="contentinfo">
|
||||
<nav aria-label="{% trans 'Actions' %}">
|
||||
<ul>
|
||||
<li class="actions">
|
||||
<div class="dropdown dropup dropdown-button match-width">
|
||||
<button type="submit" class="button action-save button-longrunning" data-clicked-text="{% trans 'Saving…' %}"><span class="icon icon-spinner"></span><em>{% trans 'Save draft' %}</em></button>
|
||||
{{ action_menu.render_html }}
|
||||
</div>
|
||||
</li>
|
||||
<li class="actions">
|
||||
<div class="dropdown dropup dropdown-button match-width {% if is_revision %}warning{% endif %}">
|
||||
{{ action_menu.render_html }}
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="preview">
|
||||
{% trans 'Preview' as preview_label %}
|
||||
|
|
|
@ -39,8 +39,6 @@
|
|||
<ul>
|
||||
<li class="actions">
|
||||
<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 %}" 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>
|
||||
|
||||
{{ action_menu.render_html }}
|
||||
</div>
|
||||
</li>
|
||||
|
|
|
@ -12,6 +12,9 @@ from django.test import TestCase, modify_settings
|
|||
from django.urls import reverse
|
||||
from django.utils import timezone
|
||||
|
||||
from wagtail.admin.action_menu import (
|
||||
DeleteMenuItem, PublishMenuItem, SaveDraftMenuItem, SubmitForModerationMenuItem,
|
||||
UnpublishMenuItem)
|
||||
from wagtail.admin.tests.pages.timestamps import submittable_timestamp
|
||||
from wagtail.core.models import Page, PageRevision, Site
|
||||
from wagtail.core.signals import page_published
|
||||
|
@ -854,6 +857,75 @@ class TestPageEdit(TestCase, WagtailTestUtils):
|
|||
# page should be edited
|
||||
self.assertEqual(Page.objects.get(id=self.child_page.id).title, "I've been edited!")
|
||||
|
||||
def test_construct_page_action_menu_hook(self):
|
||||
menu = [
|
||||
UnpublishMenuItem(order=10),
|
||||
DeleteMenuItem(order=20),
|
||||
SubmitForModerationMenuItem(order=30),
|
||||
SaveDraftMenuItem(order=40),
|
||||
PublishMenuItem(order=50),
|
||||
]
|
||||
|
||||
default_item = '<button type="submit" name="action-publish" value="action-publish" class="button button-longrunning " data-clicked-text="Publishing…"><span class="icon icon-spinner"></span><em>Publish</em></button>'
|
||||
menu_items_html = '''<ul>
|
||||
<li>
|
||||
<a class="button" href="/admin/pages/{id}/unpublish/">Unpublish</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="button" href="/admin/pages/{id}/delete/">Delete</a>
|
||||
</li>
|
||||
<li>
|
||||
<input type="submit" name="action-submit" value="Submit for moderation" class="button" />
|
||||
</li>
|
||||
<li>
|
||||
<button type="submit" class="button action-save button-longrunning " data-clicked-text="Saving…" ><span class="icon icon-spinner"></span><em>Save draft</em></button>
|
||||
</li>
|
||||
</ul>'''.format(id=self.single_event_page.id)
|
||||
|
||||
def hook_func(menu_items, request, context):
|
||||
menu_items[:] = menu
|
||||
|
||||
with self.register_hook('construct_page_action_menu', hook_func):
|
||||
response = self.client.get(reverse('wagtailadmin_pages:edit',
|
||||
args=(self.single_event_page.id, )))
|
||||
|
||||
self.assertContains(response, default_item, html=True)
|
||||
self.assertContains(response, menu_items_html, html=True)
|
||||
|
||||
for item in menu:
|
||||
if item.template:
|
||||
self.assertTemplateUsed(response, item.template)
|
||||
|
||||
def test_construct_page_action_menu_hook_2(self):
|
||||
menu = [
|
||||
DeleteMenuItem(order=20),
|
||||
SubmitForModerationMenuItem(order=30),
|
||||
]
|
||||
|
||||
default_item = '<input type="submit" name="action-submit" value="Submit for moderation" class="button" />'
|
||||
menu_items_html = '''<ul>
|
||||
<li>
|
||||
<a class="button" href="/admin/pages/{id}/delete/">Delete</a>
|
||||
</li>
|
||||
</ul>'''.format(id=self.single_event_page.id)
|
||||
|
||||
def hook_func(menu_items, request, context):
|
||||
menu_items[:] = menu
|
||||
|
||||
with self.register_hook('construct_page_action_menu', hook_func):
|
||||
response = self.client.get(reverse('wagtailadmin_pages:edit',
|
||||
args=(self.single_event_page.id, )))
|
||||
|
||||
self.assertContains(response, default_item, html=True)
|
||||
self.assertContains(response, menu_items_html, html=True)
|
||||
|
||||
for item in menu:
|
||||
if item.template:
|
||||
self.assertTemplateUsed(response, item.template)
|
||||
|
||||
self.assertTemplateNotUsed(response, "wagtailadmin/pages/action_menu/save_draft.html")
|
||||
self.assertTemplateNotUsed(response, "wagtailadmin/pages/action_menu/publish.html")
|
||||
|
||||
|
||||
class TestPageEditReordering(TestCase, WagtailTestUtils):
|
||||
def setUp(self):
|
||||
|
|
Ładowanie…
Reference in New Issue