【问题标题】:Support multi-site approval based workflow on wagtail支持基于 wagtail 的多站点审批工作流
【发布时间】:2021-08-11 08:41:24
【问题描述】:

目标

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

开发 -> 质量检查 -> 发布 -> 生产

说明

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

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

问题

是否可以在 wagtail 中设置具有批准策略的发布链?我试着研究了一下,但只能找到“工作流程”和“工作流程任务”。我是否需要对工作流任务进行自定义编码才能实现这一目标?

【问题讨论】:

  • 这应该是可能的,但是您将 100% 需要编写自定义代码来执行此操作,最好在此处阅读有关自定义任务的文档docs.wagtail.io/en/stable/advanced_topics/custom_tasks.html 您可能需要考虑这里有很多边缘情况,例如如果页面从开发站点移动到 QA 站点并且父级不存在,或者如何找到合适的父级加入。

标签: content-management-system wagtail wagtail-admin


【解决方案1】:

这应该是可能的,但您需要考虑在“移动”步骤方面您真正想要做什么,您是想将 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 文档中找到。

【讨论】:

    猜你喜欢
    • 2010-10-25
    • 2023-03-30
    • 2014-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多