Настройка панели страниц, ожидающих модерации на главной странице администратора трясогузки

Я пытаюсь найти способ переопределить то, что отображается на панели "Страницы, ожидающие модерации" на главной странице администратора трясогузки. Моя структура контента на интерфейсе сайта выглядит так:

Дом

  • Организации
    • Организация А
    • Org B
    • и т.п.
  • люди
    • Страница профиля 1
    • Страница профиля 2
    • и т.п.

У меня есть три типа пользователей - ваш обычный администратор / суперпользователь, модераторы для каждой отдельной организации и обычные сотрудники.

У всех обычных сотрудников есть профили в разделе "Люди", они могут входить в систему и редактировать свои собственные, но не публиковать их. Они просто отправляют их на модерацию.

Модераторы могут редактировать / публиковать что угодно в своей организации. Например, если вы принадлежите к группе модераторов организации A, у вас есть разрешения на странице организации A и на всем, что находится под ней в дереве сайта, а также на любом профиле в разделе "Люди". Вы не можете редактировать ничего, принадлежащее другим организациям.

Поскольку профили людей могут принадлежать нескольким организациям (это обрабатывается через отношение ParentalManyToMany), я не смог вложить всех людей в их организации в навигации. Так что я не придумал способ предоставить доступ на редактирование ТОЛЬКО людям, находящимся в организации модератора. Но я решил, что смогу обойти это достаточно элегантно, ограничив очередь модератора "Страницы, ожидающие модерации", чтобы запрос возвращал только элементы, относящиеся к их организации.

Я не могу понять, нужно ли мне удалить PagesForModerationPanel, который настраивает wagtailadmin's home.py, и заменить его моей собственной панелью с настраиваемой логикой запроса, или я могу каким-то образом переопределить этот класс, не удаляя и не заменяя панель.

https://docs.wagtail.io/en/latest/reference/hooks.html дает простой пример того, как добавить панель приветствия на главную страницу администратора. Я смог заставить это работать. Еще я разобрался, как удалить существующую панель модерации в wagtail_hooks.py:

@hooks.register('construct_homepage_panels')
def remove_moderation_panel(request, panels):
for panel in panels:
  if panel.name == 'pages_for_moderation':
    panels.remove(panel)

Но когда я пытаюсь определить свой собственный класс панели в wagtail_hooks.py, а затем добавить его на домашнюю страницу, это не сработает. Следующий код (который на данный момент имеет ту же логику запроса, что и home.py wagtailadmin; я еще не менял его) приводит к ошибке:

class OrgPagesForModerationPanel:
    name = 'pages_for_moderation'
    order = 200

    def __init__(self, request):
        self.request = request
        user_perms = UserPagePermissionsProxy(request.user)
        self.page_revisions_for_moderation = (user_perms.revisions_for_moderation()
                                              .select_related('page', 'user').order_by('-created_at'))

    def render(self):
        return render_to_string('wagtailadmin/home/pages_for_moderation.html', {
            'page_revisions_for_moderation': self.page_revisions_for_moderation,
        }, request=self.request)

@hooks.register('construct_homepage_panels')
def add_org_moderation_panel(request, panels):
    panels.append(OrgPagesForModerationPanel())

Я что-то делаю неправильно с точки зрения синтаксиса или пытаюсь сделать это в неправильном файле? Я пробовал некоторые другие уловки, такие как изменение порядка моего "домашнего" приложения и "wagtail.admin", включенных в мои INSTALLED_APPS, но, похоже, это не имеет значения.

Это мой первый раз, когда я пытаюсь настроить администратора трясогузки для учета более сложного пользовательского рабочего процесса, поэтому я полагаю, что я мог полностью лаять не на то дерево, и есть способ справиться с этим, не перекрывая очередь модерации.

1 ответ

Решение

Поскольку вы определили __init__ метод, который принимает request аргумент, вам нужно передать запрос при построении панели.

@hooks.register('construct_homepage_panels')
def add_org_moderation_panel(request, panels):
    panels.append(OrgPagesForModerationPanel(request))
Другие вопросы по тегам