Можно ли переопределить функцию wagtail.hooks.register с помощью пользовательской функции?

Возможно ли переопределить функцию трясогузки @hooks.register пользовательской функцией или вообще отменить регистрацию функции?

Одним из примеров того, чего я хотел бы добиться, является редактирование функции register_styleguide_menu_item в wagtail/contrib/styleguide/wagtail_hooks.py так, чтобы руководство по стилю показывалось только суперпользователям.

Например, я хотел бы переопределить текущую функцию:

@hooks.register("register_settings_menu_item")
def register_styleguide_menu_item():
    return MenuItem(
        _("Styleguide"), reverse("wagtailstyleguide"), icon_name="image", order=1000
    )

с этим:

@hooks.register("register_settings_menu_item")
def register_styleguide_menu_item():
    return AdminOnlyMenuItem(
        _("Styleguide"), reverse("wagtailstyleguide"), icon_name="image", order=1000
    )

(обратите внимание на изменение MenuItem на AdminOnlyMenuItem в третьей строке)

Документация по крючкам wagtail доступна на https://docs.wagtail.org/en/stable/reference/hooks.html, но она не охватывает этот сценарий.

Существует ли механизм для достижения этого?

Для изменения пунктов меню на основе request необходимо использовать другой хук.

Либо construct_main_menu для главного меню, либо construct_settings_menu для меню настроек.

from wagtail.core import hooks

@hooks.register('construct_settings_menu')
def hide_styleguide_menu_item(request, menu_items):
  if not request.user.is_superuser:
    menu_items[:] = [item for item in menu_items if item.name != 'styleguide']

Примечание: имя элемента может быть не совсем 'styleguide' оно может быть 'Styleguide'.

Вернуться на верх