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)