1

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

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

我有三种类型的用户——您的常规管理员/超级用户、每个组织的版主和普通员工。

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

版主可以在其组织内编辑/发布任何内容。例如,如果您属于 Org A 版主组,则您对 Org 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())

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

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

4

1 回答 1

0

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

@hooks.register('construct_homepage_panels')
def add_org_moderation_panel(request, panels):
    panels.append(OrgPagesForModerationPanel(request))
于 2020-07-09T09:00:09.090 回答