在 wagtail 管理主页上自定义页面等待审核面板

Customizing Pages Awaiting Moderation panel on the wagtail admin home page

我正在尝试找出一种方法来覆盖 wagtail 管理主页上“等待审核的页面”面板中显示的内容。我在网站前端的内容结构如下所示:

首页

我有三种类型的用户 - 您的普通用户 admin/super-user、每个组织的版主和普通员工。

正式员工在人脉部分都有个人资料,可以登录编辑自己的个人资料,但不能发布。他们只是提交审核。

版主可以 edit/publish 其组织内的任何内容。例如,如果您属于 Org A Moderators 组,则您有权访问 Org A 页面及其下方站点树中的任何内容,以及人员部分中的任何配置文件。您不能编辑属于其他组织的任何内容。

由于人员配置文件可以属于多个组织(这是通过 ParentalManyToMany 关系处理的),我无法在导航中将所有人员嵌套在他们的组织下。所以我还没有想出一种方法来只向主持人组织下的人授予编辑权限。但我认为我可以通过限制版主的“页面等待审核”队列来优雅地解决这个问题,以便查询仅 returns 与其组织相关的项目。

我想不通的是我是否需要删除 wagtailadmin home.py 设置的 PagesForModerationPanel 并将其替换为我自己的具有自定义查询逻辑的面板,或者我是否可以以某种方式覆盖 class无需拆卸和更换面板。

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中定义自己的面板class,然后将其添加到主页时,它不起作用。以下代码(目前与 wagtailadmin 的 home.py 具有相同的查询逻辑;我还没有更改它)导致错误:

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())

我是在语法上做错了什么,还是在错误的文件中尝试这样做?我尝试了一些其他技巧,例如重新排列我的 'home' 应用程序和 'wagtail.admin' 包含在我的 INSTALLED_APPS 中的顺序,但这似乎没有什么不同。

这是我第一次尝试自定义 wagtail 管理员以解决更复杂的用户工作流程,所以我想我可能完全找错了树,有一种方法可以在不覆盖审核的情况下处理这个问题排队。

由于您已经定义了一个接受request参数的__init__方法,因此您需要在构建面板时传递请求。

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