支持 wagtail 上基于多站点审批的工作流
Support multi-site approval based workflow on wagtail
Objective
我们想设置带有审批链的多站点鹡鸰。
开发 -> 质量检查 -> 发布 -> 生产
描述
- 开发/内容编辑器转到 wagtail 管理员并创建内容。完成后,发送批准请求以移至 QA 站点。
- QA 版主审核开发网站上的内容。如果获得批准,内容将移至 QA 站点。内容延续到下一阶段审批(发布)。
审批链中的下一个站点将采用相同的流程。
问题
是否可以在 wagtail 中设置带有批准策略的发布链?我试着研究了一下,但只能找到“工作流程”和“工作流程任务”。我是否需要自定义代码才能实现此工作流任务?
这应该是可行的,但您需要考虑关于 'move' 步骤您真正想做什么,您是想将 Page 实例实际移动到新树中的新站点还是复制当前页面(及其历史记录)并移动该副本页面或创建一个副本以代替被移动的页面。
尽管如此,how to add a new Task type 上的文档是最好的起点,它会引导您完成自定义任务类型。
然而,在下面的解决方案中,我认为最简单的方法是创建一个行为与 GroupApprovalTask
完全相同的新模型(包括默认任务,用于审核),但添加一个字段将其链接到Site
型号。
这样,在管理员 UI 中,管理员用户现在可以根据需要创建任意数量的 PublishSiteTask
,每个 Site
(QA/Dev/Prod 等)和那么每一个都可以链接到不同的用户组。重要的是要区分数据库模型(具有某些字段的任务类型)和实例(在 UI 中创建的任务)以及针对每个页面修订(而非页面)创建的实际任务实例,因为工作流程步骤进度。
代码示例
models.py
from django.db import models, transaction
from wagtail.core.models import GroupApprovalTask, Page, Site
# ... other imports
class PublishSiteTask(GroupApprovalTask):
site = models.OneToOneField(Site, on_delete=models.CASCADE)
admin_form_fields = ['site'] + GroupApprovalTask.admin_form_fields
@transaction.atomic
def on_action(self, task_state, user, action_name, **kwargs):
"""Performs an action on a task state determined by the ``action_name`` string passed"""
if action_name == 'approve':
# get the page that this action is referring to via the task_state.page_revision
page = task_state.page_revision.as_page_object()
# find the new parent target at this task's site
# how this is done depends on the site/page structure
new_parent_target = self.site.root_page
# move the page to a new location
# note: this will actually move it from its current tree, you may want to make a copy first
page.move(new_parent_target)
# be sure to preserve any existing task behaviour
super().on_action(task_state, user, action_name, **kwargs)
其他链接
Task
class definition
GroupApprovalTask
class definition
- 您可能需要在代码中做一些准备工作以检查页面是否真的可以移动到不同的站点,每个
Page
都有一个方法 can_move_to
可以提供帮助。
- 上面引用的
move
方法是 Wagtail 代码的一部分,但是该方法的完整文档可以在 Wagtail 用来管理树结构的 Treebeard API 文档中找到。
Objective
我们想设置带有审批链的多站点鹡鸰。
开发 -> 质量检查 -> 发布 -> 生产
描述
- 开发/内容编辑器转到 wagtail 管理员并创建内容。完成后,发送批准请求以移至 QA 站点。
- QA 版主审核开发网站上的内容。如果获得批准,内容将移至 QA 站点。内容延续到下一阶段审批(发布)。
审批链中的下一个站点将采用相同的流程。
问题
是否可以在 wagtail 中设置带有批准策略的发布链?我试着研究了一下,但只能找到“工作流程”和“工作流程任务”。我是否需要自定义代码才能实现此工作流任务?
这应该是可行的,但您需要考虑关于 'move' 步骤您真正想做什么,您是想将 Page 实例实际移动到新树中的新站点还是复制当前页面(及其历史记录)并移动该副本页面或创建一个副本以代替被移动的页面。
尽管如此,how to add a new Task type 上的文档是最好的起点,它会引导您完成自定义任务类型。
然而,在下面的解决方案中,我认为最简单的方法是创建一个行为与 GroupApprovalTask
完全相同的新模型(包括默认任务,用于审核),但添加一个字段将其链接到Site
型号。
这样,在管理员 UI 中,管理员用户现在可以根据需要创建任意数量的 PublishSiteTask
,每个 Site
(QA/Dev/Prod 等)和那么每一个都可以链接到不同的用户组。重要的是要区分数据库模型(具有某些字段的任务类型)和实例(在 UI 中创建的任务)以及针对每个页面修订(而非页面)创建的实际任务实例,因为工作流程步骤进度。
代码示例
models.py
from django.db import models, transaction
from wagtail.core.models import GroupApprovalTask, Page, Site
# ... other imports
class PublishSiteTask(GroupApprovalTask):
site = models.OneToOneField(Site, on_delete=models.CASCADE)
admin_form_fields = ['site'] + GroupApprovalTask.admin_form_fields
@transaction.atomic
def on_action(self, task_state, user, action_name, **kwargs):
"""Performs an action on a task state determined by the ``action_name`` string passed"""
if action_name == 'approve':
# get the page that this action is referring to via the task_state.page_revision
page = task_state.page_revision.as_page_object()
# find the new parent target at this task's site
# how this is done depends on the site/page structure
new_parent_target = self.site.root_page
# move the page to a new location
# note: this will actually move it from its current tree, you may want to make a copy first
page.move(new_parent_target)
# be sure to preserve any existing task behaviour
super().on_action(task_state, user, action_name, **kwargs)
其他链接
Task
class definitionGroupApprovalTask
class definition- 您可能需要在代码中做一些准备工作以检查页面是否真的可以移动到不同的站点,每个
Page
都有一个方法can_move_to
可以提供帮助。 - 上面引用的
move
方法是 Wagtail 代码的一部分,但是该方法的完整文档可以在 Wagtail 用来管理树结构的 Treebeard API 文档中找到。