3.6. 定义工作流

3.6.1. 一般

工作流描述了某些实体必须如何在不同状态之间演变。因此,我们有一组状态和一个“转换图”,即从一个状态到另一个状态的一组可能的转换。

我们将为博客定义一个简单的工作流,只有以下两种状态: submittedpublished .你可能想看看 创建一个简单的博客 CubicWeb 如果要快速设置运行日志的实例。

3.6.2. 设置工作流

我们希望创建一个工作流来控制在实例上提交的Blogentry的质量。当用户创建Blogentry时,其状态应为 submitted .要让所有人都能看到,它必须处于状态 published .把它从 submittedpublished 我们需要一个我们可以称之为 approve_blogentry .

Blogentry状态不应该被每个用户修改。所以我们必须定义一组用户, moderators ,并且此组将具有发布Blogentry的适当权限。

创建工作流有两种方法:从用户界面,或通过在 migration/postcreate.py .每次新的 cubicweb-ctl db-init 完成了。我们强烈建议在 migration/postcreate.py 现在我们将向您展示如何操作。阅读 Two bits of warning 了解原因。

实体的状态由 in_state 属性,通过从继承可以添加到实体架构中 cubicweb.schema.WorkflowableEntityType .

关于我们的金发碧眼的例子,我们必须:

from cubicweb.schema import WorkflowableEntityType

class BlogEntry(WorkflowableEntityType):
    ...

3.6.2.1. 创建状态、转换和组权限

这个 postcreate 脚本在特殊环境中执行,添加几个 CubicWeb 可以使用的基元。

它们都是在 ServerMigrationHelper 类。在本例中,我们只讨论用于创建工作流的方法。

工作流是类型为的实体的集合 State 和类型 Transition 哪个是标准的 CubicWeb 实体类型。

要为blogdemo定义工作流,请将以下行添加到 migration/postcreate.py

from cubicweb import _


moderators = add_entity('CWGroup', name=u"moderators")

这增加了 moderators 用户组。

wf = add_workflow(u'blog publication workflow', 'BlogEntry')

首先,用温和的描述和相关的实体类型(这个可以是多值的元组)来表示一个新的工作流对象。

submitted = wf.add_state(_('submitted'), initial=True)
published = wf.add_state(_('published'))

这将创建两个类型的实体 State 一个名为“已提交”,另一个名为“已发布”。

add_state 应将要创建的状态的名称作为第一个参数,并使用可选参数来说明它是否应为实体类型的初始状态。

wf.add_transition(_('approve_blogentry'), (submitted,), published, ('moderators', 'managers'),)

这将创建类型为的实体 Transition 有名字 approve_blogentry 它将链接到 State 以前创建的实体。

add_transition 预期

  • 作为第一个参数:转换的名称

  • 然后是可以触发转换的状态列表,

  • 过渡的目标状态,

  • 以及权限(例如,可以应用转换的用户组列表;用户必须至少属于所列组中的一个才能执行该操作)。

注解

不要忘记添加 _() 在创建工作流时,在所有状态和转换名称前面,以便通过i18n目录脚本识别它们。

除了用户组(用户需要属于其中一个组)之外,我们还可以添加一个RQL条件。在这种情况下,只有满足这两个条件,用户才能执行操作。

如果在转换中使用RQL条件,可以使用以下变量:

  • X ,我们可以通过过渡的实体

  • U ,可能通过转换的执行用户

还可以从工作流使用中获得给定的转换(在迁移中可用) transition_by_name(trname) . 要更新与转换关联的权限,请使用 set_permissions(requiredgroups=(), conditions=(), reset=True) .如果 reset 为False,则添加新权限而不是替换旧权限。

../../../_images/03-transitions-view_en.png

您可以注意到,在Blogentry的“操作”框中,现在会列出状态以及工作流定义的当前状态的可能转换。

只有具有正确权限的用户才能显示转换。在我们的示例中,转换 approve_blogentry 仅为属于该组的用户显示 moderatorsmanagers .

3.6.2.2. 两位警告

我们可以完美地使用管理界面来执行这些操作。有时做一些方便的事情(做开发时,快速检查)。但建议不要超出这个范围,因为正确地执行它有点复杂,而且它将只在您的实例本地(或者说,有点不同,这样的工作流只存在于实例数据库中)。此外,您不能针对部署的实例编写单元测试,经验表明,对于任何稍微复杂的工作流设置都必须进行测试。

实际上,如果通过用户界面创建状态和转换,下次初始化数据库时,必须重新创建所有工作流实体。用户界面应该只作为查看状态和转换的参考,而不是定义应用程序工作流的适当界面。

3.6.3. 声明工作流的替代方法