From 8079cad7df8e0661d73c7936a181435a9ce35cd4 Mon Sep 17 00:00:00 2001 From: Matt Westcott Date: Fri, 6 Oct 2023 14:11:14 +0100 Subject: [PATCH] Add a view_name argument to register_page_header_buttons --- docs/reference/hooks.md | 5 +++-- .../wagtailadmin/pages/page_listing_header.html | 2 +- .../shared/headers/page_edit_header.html | 2 +- wagtail/admin/templatetags/wagtailadmin_tags.py | 6 ++++-- wagtail/admin/tests/test_buttons_hooks.py | 17 +++++++++++++---- wagtail/admin/wagtail_hooks.py | 2 +- .../contrib/simple_translation/wagtail_hooks.py | 2 +- 7 files changed, 24 insertions(+), 12 deletions(-) diff --git a/docs/reference/hooks.md b/docs/reference/hooks.md index ffd1063954..d0d417ac17 100644 --- a/docs/reference/hooks.md +++ b/docs/reference/hooks.md @@ -551,7 +551,7 @@ This example will add a simple button to the secondary dropdown menu: from wagtail.admin import widgets as wagtailadmin_widgets @hooks.register('register_page_header_buttons') -def page_header_buttons(page, user, next_url=None): +def page_header_buttons(page, user, view_name, next_url=None): yield wagtailadmin_widgets.Button( 'A dropdown button', '/goes/to/a/url/', @@ -563,12 +563,13 @@ The arguments passed to the hook are as follows: - `page` - the page object to generate the button for - `user` - the logged-in user +- `view_name` - either `index` or `edit`, depending on whether the button is being generated for the page listing or edit view - `next_url` - the URL that the linked action should redirect back to on completion of the action, if the view supports it The `priority` argument controls the order the buttons are displayed in the dropdown. Buttons are ordered from low to high priority, so a button with `priority=10` will be displayed before a button with `priority=60`. ```{versionchanged} 5.2 -The hook function now receives a `user` argument instead of a `page_perms` argument. To check the user's permissions on the page, use `page.permissions_for_user(user)`. +The hook function now receives a `user` argument instead of a `page_perms` argument, and a `view_name` argument. To check the user's permissions on the page, use `page.permissions_for_user(user)`. ``` ## Editor workflow diff --git a/wagtail/admin/templates/wagtailadmin/pages/page_listing_header.html b/wagtail/admin/templates/wagtailadmin/pages/page_listing_header.html index bcb4f75f77..b9184addb1 100644 --- a/wagtail/admin/templates/wagtailadmin/pages/page_listing_header.html +++ b/wagtail/admin/templates/wagtailadmin/pages/page_listing_header.html @@ -11,7 +11,7 @@ {# Actions divider #}
{# Page actions dropdown #} - {% page_header_buttons parent_page user=request.user %} + {% page_header_buttons parent_page user=request.user view_name="index" %} {% endblock %} {% block actions %} {% if not parent_page.is_root %} diff --git a/wagtail/admin/templates/wagtailadmin/shared/headers/page_edit_header.html b/wagtail/admin/templates/wagtailadmin/shared/headers/page_edit_header.html index 715634a414..0ba3870f55 100644 --- a/wagtail/admin/templates/wagtailadmin/shared/headers/page_edit_header.html +++ b/wagtail/admin/templates/wagtailadmin/shared/headers/page_edit_header.html @@ -11,7 +11,7 @@ {# Actions divider #}
{# Page actions dropdown #} - {% page_header_buttons page user=request.user %} + {% page_header_buttons page user=request.user view_name="edit" %} {% endblock %} {% block actions %} diff --git a/wagtail/admin/templatetags/wagtailadmin_tags.py b/wagtail/admin/templatetags/wagtailadmin_tags.py index 552377a6fe..509d24e87b 100644 --- a/wagtail/admin/templatetags/wagtailadmin_tags.py +++ b/wagtail/admin/templatetags/wagtailadmin_tags.py @@ -505,7 +505,7 @@ def page_listing_buttons(context, page, user): @register.inclusion_tag( "wagtailadmin/pages/listing/_page_header_buttons.html", takes_context=True ) -def page_header_buttons(context, page, user): +def page_header_buttons(context, page, user, view_name): next_url = context["request"].path page_perms = page.permissions_for_user(user) button_hooks = hooks.get_hooks("register_page_header_buttons") @@ -513,7 +513,9 @@ def page_header_buttons(context, page, user): buttons = [] for hook in button_hooks: if accepts_kwarg(hook, "user"): - buttons.extend(hook(page=page, user=user, next_url=next_url)) + buttons.extend( + hook(page=page, user=user, next_url=next_url, view_name=view_name) + ) else: # old-style hook that accepts page_perms instead of user warn( diff --git a/wagtail/admin/tests/test_buttons_hooks.py b/wagtail/admin/tests/test_buttons_hooks.py index 8cfab69d12..19fbd85134 100644 --- a/wagtail/admin/tests/test_buttons_hooks.py +++ b/wagtail/admin/tests/test_buttons_hooks.py @@ -345,10 +345,13 @@ class TestPageHeaderButtonsHooks(TestButtonsHooks): self.assertContains(response, "Another useless header button") def test_register_page_header_buttons_new_signature(self): - def custom_page_header_buttons(page, user, next_url=None): + def custom_page_header_buttons(page, user, view_name, next_url=None): if not isinstance(user, AbstractBaseUser): raise TypeError("expected a user instance") + if view_name != "edit": + raise ValueError("expected view_name to be 'edit'") + yield wagtailadmin_widgets.Button( "Another useless header button", "/custom-url", priority=10 ) @@ -378,7 +381,9 @@ class TestPageHeaderButtonsHooks(TestButtonsHooks): next_url = "a/random/url/" full_url = base_url + "?" + urlencode({"next": next_url}) - buttons = page_header_buttons(page, self.user, next_url=next_url) + buttons = page_header_buttons( + page, self.user, view_name="index", next_url=next_url + ) delete_button = next(button for button in buttons if button.label == "Delete") self.assertEqual(delete_button.url, full_url) @@ -395,7 +400,9 @@ class TestPageHeaderButtonsHooks(TestButtonsHooks): base_url = reverse("wagtailadmin_pages:delete", args=[page.id]) next_url = reverse("wagtailadmin_explore", args=[page.id]) - buttons = page_header_buttons(page, self.user, next_url=next_url) + buttons = page_header_buttons( + page, self.user, view_name="index", next_url=next_url + ) delete_button = next(button for button in buttons if button.label == "Delete") @@ -405,7 +412,9 @@ class TestPageHeaderButtonsHooks(TestButtonsHooks): base_url = reverse("wagtailadmin_pages:delete", args=[page.id]) next_url = reverse("wagtailadmin_pages:edit", args=[page.id]) - buttons = page_header_buttons(page, self.user, next_url=next_url) + buttons = page_header_buttons( + page, self.user, view_name="index", next_url=next_url + ) delete_button = next(button for button in buttons if button.label == "Delete") diff --git a/wagtail/admin/wagtail_hooks.py b/wagtail/admin/wagtail_hooks.py index 4aab53401a..d35fe95f20 100644 --- a/wagtail/admin/wagtail_hooks.py +++ b/wagtail/admin/wagtail_hooks.py @@ -442,7 +442,7 @@ def page_listing_more_buttons(page, user, next_url=None): @hooks.register("register_page_header_buttons") -def page_header_buttons(page, user, next_url=None): +def page_header_buttons(page, user, view_name, next_url=None): page_perms = page.permissions_for_user(user) yield PageListingEditButton( page=page, diff --git a/wagtail/contrib/simple_translation/wagtail_hooks.py b/wagtail/contrib/simple_translation/wagtail_hooks.py index 6c464f720e..443ead7fd9 100644 --- a/wagtail/contrib/simple_translation/wagtail_hooks.py +++ b/wagtail/contrib/simple_translation/wagtail_hooks.py @@ -64,7 +64,7 @@ def page_listing_more_buttons(page, user, next_url=None): @hooks.register("register_page_header_buttons") -def page_header_buttons(page, user, next_url=None): +def page_header_buttons(page, user, view_name, next_url=None): if not page.is_root() and user.has_perm("simple_translation.submit_translation"): # If there's at least one locale that we haven't translated into yet, # show "Translate this page" button