3.6. 定义工作流¶
3.6.1. 一般¶
工作流描述了某些实体必须如何在不同状态之间演变。因此,我们有一组状态和一个“转换图”,即从一个状态到另一个状态的一组可能的转换。
我们将为博客定义一个简单的工作流,只有以下两种状态: submitted 和 published .你可能想看看 创建一个简单的博客 CubicWeb 如果要快速设置运行日志的实例。
3.6.2. 设置工作流¶
我们希望创建一个工作流来控制在实例上提交的Blogentry的质量。当用户创建Blogentry时,其状态应为 submitted .要让所有人都能看到,它必须处于状态 published .把它从 submitted 到 published 我们需要一个我们可以称之为 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,则添加新权限而不是替换旧权限。

您可以注意到,在Blogentry的“操作”框中,现在会列出状态以及工作流定义的当前状态的可能转换。
只有具有正确权限的用户才能显示转换。在我们的示例中,转换 approve_blogentry 仅为属于该组的用户显示 moderators 或 managers .
3.6.2.2. 两位警告¶
我们可以完美地使用管理界面来执行这些操作。有时做一些方便的事情(做开发时,快速检查)。但建议不要超出这个范围,因为正确地执行它有点复杂,而且它将只在您的实例本地(或者说,有点不同,这样的工作流只存在于实例数据库中)。此外,您不能针对部署的实例编写单元测试,经验表明,对于任何稍微复杂的工作流设置都必须进行测试。
实际上,如果通过用户界面创建状态和转换,下次初始化数据库时,必须重新创建所有工作流实体。用户界面应该只作为查看状态和转换的参考,而不是定义应用程序工作流的适当界面。