在Wagtail管理主页上自定义“等待审阅的页面”面板

时间:2020-07-01 23:53:48

标签: python hook wagtail wagtail-admin

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

首页

  • 组织
    • 组织A
    • 组织B
  • 人们
    • 个人资料页面1
    • 个人资料页面2

我有三种类型的用户-您的常规管理员/超级用户,每个组织的主持人和常规员工。

所有普通员工在“人员”部分都有个人资料,可以登录和编辑自己的个人资料,但不能发布。他们只是将其提交审核。

版主可以在其组织内编辑/发布任何内容。例如,如果您属于“组织A主持人”组,则您对组织A页面及其站点树下面的任何内容都具有权限,在“人员”部分中也具有任何权限。您不能编辑其他组织的任何内容。

由于人员个人档案可以属于多个组织(这是通过ParentalManyToMany关系处理的),因此我无法在导航中将所有人员嵌套在其组织下。因此,我还没有找到仅授予主持人组织下的人员编辑权限的方法。但是我认为我可以通过限制主持人的“等待审阅的页面”队列来​​解决这个问题,从而使查询仅返回与其组织相关的项目。

我不知道是需要删除wagtailadmin的home.py设置的PagesForModerationPanel并将其替换为具有自定义查询逻辑的我自己的面板,还是我可以以某种方式覆盖该类而无需删除和替换面板。

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中定义自己的面板类,然后将其添加到主页时,它不起作用。以下代码(目前与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())

我是在语法上执行了错误的操作,还是在错误的文件中尝试执行此操作?我尝试了其他技巧,例如重新排列我的“家庭”应用和“ wagtail.admin”的顺序,这些都包含在我的INSTALLED_APPS中,但这似乎没有什么改变。

这是我第一次尝试自定义wagtail管理员,以解决更复杂的用户工作流程,因此我想我可能会完全把错误的树吠叫,并且有一种在不覆盖审问队列的情况下进行处理的方法。

1 个答案:

答案 0 :(得分:0)

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

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