diff --git a/wagtail/wagtailadmin/templates/wagtailadmin/pages/listing/_buttons.html b/wagtail/wagtailadmin/templates/wagtailadmin/pages/listing/_buttons.html
index 3887ced9cf..bb0f2e7990 100644
--- a/wagtail/wagtailadmin/templates/wagtailadmin/pages/listing/_buttons.html
+++ b/wagtail/wagtailadmin/templates/wagtailadmin/pages/listing/_buttons.html
@@ -1,3 +1,5 @@
{% for button in buttons %}
+ {% if button.show %}
{{ button|safe }}
+ {% endif %}
{% endfor %}
diff --git a/wagtail/wagtailadmin/widgets.py b/wagtail/wagtailadmin/widgets.py
index f99ce1c721..dc2c0f2a72 100644
--- a/wagtail/wagtailadmin/widgets.py
+++ b/wagtail/wagtailadmin/widgets.py
@@ -10,6 +10,7 @@ from django.forms.utils import flatatt
from django.template.loader import render_to_string
from django.utils.encoding import python_2_unicode_compatible
from django.utils.formats import get_format
+from django.utils.functional import cached_property
from django.utils.html import format_html
from django.utils.translation import ugettext_lazy as _
from taggit.forms import TagWidget
@@ -191,6 +192,8 @@ class AdminPageChooser(AdminChooser):
@python_2_unicode_compatible
@total_ordering
class Button(object):
+ show = True
+
def __init__(self, label, url, classes=set(), attrs={}, priority=1000):
self.label = label
self.url = url
@@ -234,12 +237,13 @@ class BaseDropdownMenuButton(Button):
def __init__(self, *args, **kwargs):
super(BaseDropdownMenuButton, self).__init__(*args, url=None, **kwargs)
- def get_buttons_in_dropdown(self):
+ @cached_property
+ def dropdown_buttons(self):
raise NotImplementedError
def render(self):
return render_to_string(self.template_name, {
- 'buttons': self.get_buttons_in_dropdown(),
+ 'buttons': self.dropdown_buttons,
'label': self.label,
'title': self.attrs.get('title'),
'is_parent': self.is_parent})
@@ -256,7 +260,12 @@ class ButtonWithDropdownFromHook(BaseDropdownMenuButton):
super(ButtonWithDropdownFromHook, self).__init__(label, **kwargs)
- def get_buttons_in_dropdown(self):
+ @property
+ def show(self):
+ return bool(self.dropdown_buttons)
+
+ @cached_property
+ def dropdown_buttons(self):
button_hooks = hooks.get_hooks(self.hook_name)
return sorted(itertools.chain.from_iterable(
hook(self.page, self.page_perms, self.is_parent)