使用 CSV 而不是 XML 的工作流定义的 GenericSetup 导入器和导出器
项目描述
作者:Martin Aspeli < optilude @ gmail 。com >
该软件包包含用于通过电子表格(或更确切地说是 CSV 格式)处理 DC 工作流定义的工具以及调试辅助工具,以便更轻松地在 Zope 2 和 Plone 中使用安全性和工作流。
它包括:
可以将工作流定义转储到 CSV 文件的 GenericSetup 导出器
可以从 CSV 文件创建工作流定义的 GenericSetup 导入器
用于检查工作流程的浏览器内工具
一次性将站点中的工作流转储为 CSV 的浏览器视图
显示给定上下文中用户角色的浏览器视图
- 用于触发对象自动转换的实用功能,以及
在它的父母身上。
CSV 导入/导出
请注意,CSV 格式并不完全等同于基于 XML 的标准 GenericSetup 格式来导入/导出工作流定义。如果您需要 DCWorkflow 的全部功能,您应该继续使用基于 XML 的格式。这不是(只是)因为懒惰 - CSV 格式已被简化以简化常见操作。
有关示例 CSV 文件,请参阅
集体/wtf/tests/profiles/testing/test_wf.csv。
要作为 GenericSetup 扩展配置文件的一部分导入,这样的文件通常会进入
配置文件/默认/workflow_csv/wf_name.csv
其中 wf_name 是 portal_workflow 中工作流的名称。
请注意,如果确实存在完整的工作流定义(例如在profiles/default/workflows/my_workflow/definition.xml 中),CSV 导入器将 不会尝试运行导入,以免发生冲突或覆盖更改。
要一次性下载 CSV 格式的工作流定义,请在浏览器中键入如下 URL:
http://localhost:8080/Plone/portal_workflow/my_workflow/@@to-csv
这里,“Plone”是 Plone 实例的名称,“my_workflow”是您的工作流定义的名称。系统将要求您下载 CSV 文件。
工作流程健全性检查器
要调用健全性检查器,请在浏览器中输入如下 URL:
http://localhost:8080/Plone/portal_workflow/my_workflow/@@sanity-check
同样,“Plone”是 Plone 实例的名称,“my_workflow”是工作流定义的名称。输出将以纯文本形式写入浏览器窗口。
其他调试辅助
要在给定上下文中查看给定用户的当前角色,请在以 Manager 用户身份登录时在浏览器中键入如下 URL:
http://localhost:8080/Plone/context/@@display-roles-in-context ?user=<user>
同样,“Plone”是 Plone 实例的名称。“上下文”可以是任何对象。<user> 应替换为您要为其获取角色的用户的登录名/ID。输出将以纯文本形式写入浏览器窗口。
CSV 文件规范
本节详细介绍 CSV 文件格式。
一般的
CSV 文件格式通常依赖于键值对,其中键位于第一列 (A),值位于第二列 (B)。键名不区分大小写,可以用连字符代替空格,并且可以选择包含尾随冒号。例如,以下都是等价的:
Some key:,some_value some key:,some_value some-key , some_value
该文件被细分为多个部分。一个部分以包含方括号中的部分名称的行开始,并以至少一个空白行结束。例如:
[SomeSection] Some key:,some_value Some other key:,another_value [AnotherSection] ...
下面更详细地列出了各个部分。
[工作流程] 部分
这通常是文件中的第一部分。它包含有关整个工作流程的信息,具有以下键。标有 * 的键是必需的。
Id* – 将安装在 portal_workflow 中的工作流的名称。
- 初始状态* – 工作流初始状态的名称。必须匹配
文件中其他地方的 [State] 部分的 id。
标题 - 工作流的人性化标题。
描述 - 对工作流的人性化描述。
- 类型 – 工作流的元类型。默认为“工作流”,即
标准 DCWorkflow 定义类型。请注意,如果您有自定义工作流,则无法保证collective.wtf 能够解析它,所以要小心。
- 状态变量 – 保存当前状态的工作流变量。为了
Plone 内容对象的主要工作流程,这应该是“review_state”,这是默认值。但是,如果您在多工作流链中设计辅助工作流,它可能需要不同的状态变量。
例如:
[Workflow] Id:,test_workflow Title:,Test workflow Description:,Description of workflow Initial state:,state_one
[状态] 部分
本节定义单个工作流状态。它必须以权限表结尾 - 见下文。
Id* – 状态的唯一名称。
Title* – 一个人性化的标题。
描述——人性化的描述。
- 转换 – 以逗号分隔的转换列表。请注意,这应该
仅限于单个单元格。因此,您需要在列表两边加上双引号,例如“transition_1,transition_2”。列出的每个转换必须与文件中其他地方的 [Transition] 部分的 id 匹配。
- 工作清单 – 处于此状态的对象的工作清单名称(如果有的话)
必需的。
工作清单标签——工作清单的人性化标签。
- 工作清单保护权限 – 用于保护工作清单的权限名称
工作清单(如果需要)。
- Worklist guard expression – 用于保护工作列表的 TALES 表达式,
如果需要。
- 工作清单保护角色 – 用于保护工作清单的角色的名称,如果
必需的。
例如:
[State] Id:,state_one Title:,State one Description:,Description of state one Transitions:,"to_state_two,to_state_three" Worklist:,State one worklist Worklist label:,Worklist stuff goes here Worklist guard permission:,Review portal content Worklist guard expression:,python:True==True Worklist guard role:,Manager Permissions, Acquire, Manager, Member, Owner View, Y, Y, N, Y Access contents information, Y, Y, N, Y Modify portal content, N, Y, N, N
权限表
在 [State] 部分的末尾,在表示该部分结束的空白行之前,必须有该状态的权限表。该表可能如下所示:
Permissions, Acquire, Manager, Member, Owner View, Y, Y, N, Y Access contents information, Y, Y, N, Y Modify portal content, N, Y, N, N
请注意,此处的额外空格纯粹是为了便于阅读,并且是可选的。
权限表是通过 A 列中的伪键“权限”创建的。B 列用于指示是否从父对象获取给定权限。按照惯例,标题行应在此处包含“获取”一词。后续行应包含角色名称。
在标题行下方,第一列应包含权限名称。后续列指示给定角色在此工作流状态下是否具有给定权限。不区分大小写的值“Y”、“*”、“X”或“是”表示真。任何其他值(包括空格、“N”或“No”)都表示错误。
[过渡] 部分
本节定义了两种状态之间的转换。它可能包含以下键:
Id* – 转换的唯一标识符
标题 – 过渡的人性化标题。
描述 – 对过渡的人性化描述。
- URL – 包含用户点击时将使用的 URL 的字符串
工作流菜单中的过渡。可能包含特殊变量 %(portal_url)s、%(folder_url)s、%(content_url)s 和 %(user_id)s。如果没有给出,将使用默认视图。
- 目标状态 – 在此之后工作流应移动到的状态
已执行过渡。如果省略,则转换不会导致状态更改。如果包含,它必须与文件中其他地方定义的 [State] 部分的 id 匹配。
- 触发器——“用户”或“自动”之一。默认为“用户”。一个自动
转换是在工作流进入自动转换是有效退出转换的状态时自动运行的转换。自动转换通常与转换保护一起使用以在某些情况下自动推进工作流程,和/或与在自动转换上执行的转换脚本一起使用。
- Guard 权限 – 在此之前需要的权限名称
过渡可用。
- Guard expression – 一个 TALES 表达式,在此之前必须为真
过渡可用。
- Guard role – 当前用户之前必须拥有的角色名称
这个过渡是可用的。
- Script before – 在转换影响状态之前执行的脚本
改变。这可能包含一个简单的字符串,在这种情况下,它必须与文件中其他地方的 [Script] 部分的 id 匹配,或者是外部方法的点名称,例如 'my.product.Extensions.script_name.function_name',其中“my.product”是包含 Extensions/ 文件夹的产品的名称,“script_name”是该 Extensions/ 文件夹中的 .py 文件的名称,“function_name”是该 .py 文件中的函数名称. 该函数必须接受两个参数:self 和一个 state_change,一个 StateChangeInfo 对象。在这种情况下,导入器将使用适当的模块('my.product.script_name')和函数('function_name')创建一个新的外部方法,并根据脚本和函数名称(在这种情况下,' script_name.function_name'),并将其设置为之前的脚本。
- Script after – 在转换影响状态后执行的脚本
改变。这可能包含与之前的 Script 相同的值。
例如:
[Transition] Id:,to_state_one Title:,Make it state one Description:,Make it go to state one Target state:,state_one Trigger:,User Guard permission:,Modify portal content,View Guard expression:,python:True==True Guard role:,Manager Script before:,shared_script Script after:,collective.wtf.Extensions.test_scripts.inline_test_one
[脚本] 部分
这可用于显式定义脚本。仅支持外部方法脚本。请注意,可以使用上面“[Transition] 部分”中描述的符号“内联”定义一次性外部方法。
Id* – 脚本的 ID
- 类型* – 应该是“外部方法”。将来,其他类型的脚本
可能会得到支持。
- Module* – 定义外部方法的模块。请注意,这
不应包含“扩展”目录。
- Function* – 外部方法时要执行的函数的名称
正在运行。
例如:
[Script] Id:,shared_script Type:,External Method Module:, collective.wtf.test_scripts Function:,script_section_test
变更日志
1.0b9
不要对导入时的 csv 方言做出假设。相反,嗅探前 1024 个字节。[兆焦耳]
1.0b8
避免在当前目录中创建 ghost workflow_csv 文件夹。[光学]
1.0b7
添加 CMF 2.2 / Plone 4 支持。请注意,新的工作流程选项(如“经理绕过”和“创建保护”)尚不支持。[光学]
1.0b6
添加对设置状态变量的支持,将“状态变量”选项添加到主工作流部分。[光学]
1.0b5
现在导入/导出 meta_type,以支持使用collective.reactiveworkflow 定义的工作流。这使用主工作流部分中的“类型”选项。[优化]
1.0b5
添加了实用方法来触发自身和父级的自动转换,从 Products.ReactiveWorkflow 借用,但可以直接从脚本中使用,而不仅仅是在事件处理程序中使用。[光学]
改进文档 [optilude]
添加内联脚本支持 [optilude]
1.0b4
添加脚本支持 [elro]
1.0b2
通过简单的浏览器视图添加在任何上下文中显示角色的能力 [optilude]