支持基于鹡鸰的多站点审批工作流



Objective

我们想设置具有审批链的多站点鹡鸰。

开发 -> QA ->发布 ->生产

描述

  • 开发/内容编辑器转到鹡鸰管理员并创建内容。完成后,发送请求以移动到 QA 站点。
  • QA 版主审查开发网站上的内容。如果获得批准,内容将移至 QA 网站。内容将延续到下一阶段的批准(发布)。

审批链中的下一个站点的相同流程。

问题

是否可以在鹡鸰中设置具有审批策略的发布链?我试图研究一下,但只能找到"工作流"和"工作流任务"。我是否需要对工作流任务进行自定义编码才能实现此目的?

这应该是可能的,但您需要考虑在"移动"步骤方面真正想要做什么,您是否要实际将 Page 实例移动到新树中的新站点或复制当前(及其历史记录)并移动该副本页面或制作副本以代替已移动的页面。

尽管如此,有关如何添加新任务类型的文档是最好的起点,它将引导您完成自定义任务类型。

然而,在下面的解决方案中,我认为最简单的方法是创建一个行为与GroupApprovalTask完全相同的新模型(包括默认任务,用于审核),但添加一个将其链接到Site模型的字段。

这样,在管理员UI中,管理员用户现在可以根据需要创建任意数量的PublishSiteTask,每个Site一个(QA/Dev/Prod等),然后每个都可以链接到不同的用户组。区分数据库模型(具有某些字段的任务类型)和实例(在 UI 中创建的任务)以及随着工作流步骤的进行而针对每个页面修订(而不是页面)创建的实际任务实例非常重要。

code example

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类定义
  • GroupApprovalTask类定义
  • 您可能希望在代码中做一些准备工作,以检查页面是否可以实际移动到不同的站点,每个Page都有一个可以提供帮助的方法can_move_to
  • 上面引用的move方法是 Wagtail 代码的一部分,但该方法的完整文档可以在 Wagtail 用于管理树结构的 Treebeard API 文档中找到。

最新更新