在 wagtail 管理主页上自定义页面等待审核面板
Customizing Pages Awaiting Moderation panel on the wagtail admin home page
我正在尝试找出一种方法来覆盖 wagtail 管理主页上“等待审核的页面”面板中显示的内容。我在网站前端的内容结构如下所示:
首页
- 组织
- 组织 A
- 组织 B
- 等等
- 人
- 个人资料第 1 页
- 个人资料第 2 页
- 等等
我有三种类型的用户 - 您的普通用户 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))
我正在尝试找出一种方法来覆盖 wagtail 管理主页上“等待审核的页面”面板中显示的内容。我在网站前端的内容结构如下所示:
首页
- 组织
- 组织 A
- 组织 B
- 等等
- 人
- 个人资料第 1 页
- 个人资料第 2 页
- 等等
我有三种类型的用户 - 您的普通用户 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))