python怎么完成工作流_工作流的实现

工作流也是要使用按钮进行控制,和普通按钮最大的不同就是,当工作流终止的时候是不能回滚的,也就是不能返回的,而普通的按钮则是可以返回的

想编写一段完整的工作流,首先要有详细的设计,知道自己应该增加几个按钮,每个按钮需要跳转的位置,同时状态的变化是什么,这可以用图表的方式展示出来

例:流程:草稿»已提交»成功»失败要求中间任意状态可以向后退回

首先确定使用了四种状态,因为需要向后退回,从图中可以明显的看出来一共需要四个按钮

然后确定使用的动作,图中每一条线就是一个动作,所以我们可以看出需要四个动作,而且每一个动作都需要一个方法,所以在py文件中要写四个方法,这与动作时一一对应的分析完成后,开始具体的写代码

首先根据自己的设计确定每个方法的名字,最好是以状态的变化命名,方便查看(例:draft_to_review),确定名字后先在xml中新增四个按钮,对应四个动作

需要注意的是type的内容,在openerp中有三种不同的类型:

Object , Action和

workflow.其默认值是workflow三者的却别在于:

Object:用于调用py程序中写的方法(method) action:用于调用xml文件中写的动作(action),比如, 如果你点击一个按钮后, 想让它打开一个向导(wizard),那么就可以使用

type="action" workflow:用于调用工作流

这样动作按钮就全部完成了

然后在模块的文件夹中新添加一个新的xml文件,作为工作流的xml(此例名为wkf.xml),首先在wkf中创建工作流

Id:自己定义的名字,任意值,唯一标识本工作流。 Model:系统规定的工作流的模块名字(取固定值:“workflow”)

osv:本工作流关联的对象模型,是OpenERP模块中定义的某对象名 name:工作流的名字,自己随意定义的,但一般为方便也使用主class的name on_create:每当系统新产生一个osv中定义的对象的实例时,是否对应的产生一个和该对象实例关联的工作流实例。默认值是True,表示创建工作流实例

很明显,工作流分为基本事件(即状态)和事件跳转(即动作),所以我们可以先定义所有的基本事件

首先我们要先确定工作流开始的位置,(我这将草稿状态设置为工作流的开始)

​同样,id为自己定义的名字,为了方便查找,一般名字和状态有关model​为系统规定的添加项目(即工作流内的事件和跳转)的模块名(固定取值“workflow.active”) wkf_id:​本Active所属的工作流id flow_start​:表示流程开始的节点,Ture表示此事件为工作流的开始,如果不是开始可以不写此项name​:自己定义的,一般为事件的名字action​:事件的动作,就是py中的方法名,就是需要什么方法能达到此状态kind:本Active的类型,有dummy,function,subflow,stopall四种。

​Kind说明,如果流程到达本节点,系统应该执行的动作类别。dummy表示不执行任何动作,即action中的代码不会被执行function表示执行action中定义的python代码subflow表示触发subflow_id中指定的工作流.

Stopall表示流程到此节点结束,但结束前,系统仍会执行action中的代码

​signal_send:执行完本节点的动作(action)后,应想别的工作流发往的signal,格式是:subflow.signal。subflow_id和signal_send必须配合使用,subflow_id表示,触发子工作流subflow_id,在该子工作流中,通常必须定义signal_send,定义父流程中的某个signal,表示子流程处理结束后触发父流程中的信号subflow.signal split_mode:有三个选项,XOR,OR,AND,默认是XOR。XOR表示,有本节点始发的出迁移中,沿着第一个满足迁移条件的迁移跳转。OR表示由本节点始发的迁移中,只要满足迁移条件即沿该迁移跳转。AND表示本节点始发的迁移中,只有所有的迁移皆满足迁移条件才跳转,而且是同时沿所有迁移跳转。XOR只有一个跳转,OR有零或多个跳转,AND有零或全部跳转join_mode:有两个选项,XOR,AND,默认值是XOR。XOR表示,以本节点为终点的入迁移中,只要有一个跳至本节点,即执行本节点的action。AND表示,以本节点为终点的入迁移中,只有所有的迁移都已经跳转至本节点,才执行本节点的action

这样工作流的开始事件就写完了

然后就是中间事件,所有的属性都在开始事件能找到,在这就不解释了

定义工作流的结束:即最后多一个属性

flow_stop:很明显,flow_stop表示是否是工作流的结束,True表示是结束,不是可以不写此属性

这样基本事件就结束了,下面开始定义事件迁移(即动作)

name:自己随便定义的model则是系统规定的工作流事件跳转的模块(固定值“workflow.transition”)

act_from:表示迁移起始节点ref为前面定义的此事件的id

act_to:表示迁移终止节点ref为前面定义的此事件的id

signal:触发本迁移的信号,表示,如果系统收到signal定义的信号,则触发本迁移。触发信号有三种方式:1.最常见的是用户点击视图中“name=本处定义的signal”的button,此时相当于向系统发送迁移信号量。系统会根据视图中的对象id,找到对象关联的workflow,再找到与button

name相同的signal,触发之。2.调用workflow_server的方法:trg_validate(self,uid,res_type,res_id,signal,cr),此方法表示,触发对象类型res_type关联的workflow的signal信号,工作流实例关联的对象实例是res_id。3.子流程的signal发出的信号condition:迁移的条件,是一段python代码,通常是一个函数调用。当系统收到signal中定义的信号时候,检查此处的条件,条件为真则实际触发迁移。trigger_model和trigger_expr_id:此二字段表示启动一个新工作流实例。trigger_model定义对象类型,trigger_expr_id定义一段python代码,返回trigger_model类型的对象id。此二字段表示,如果act_from中的action执行完毕且condition条件ok,则系统中插入一个trigger_model类型,trigger_expr_id返回的对象id关联的工作流实例。然后,可以调用workflow_service的方法trg_validate(self,uid,res_type,res_id,signal,cr)实际执行该工作流group_id:表示只有该权限组可以触发本迁移

其他的事件跳转也一样

最后定义结束时的事件跳转

同事件的结束定义一样

这样wkf.xml就完成了

最后是py中添加方法,注意定义的方法名字和前面的要一一对应

本方法主要是更新state字段,修改其状态,其他方法类似

这样工作流就完成了,特别注意几点:

1.工作流修改的时候必须卸载模块,修改后重新安装才能看到效果

2.各个方法,按钮,和事件的action必须一一对应

怎么使用代码触发工作流:

首先按照正确的方式建立一个简单的工作流

为测试方便,我新建了一个按钮,触发review_to_draft迁移,也就是页面的状态从review跳转到draft,首先,在xml中创建一个按钮(type

= ‘object’)

然后在py中创建begin方法

其中 wf_service = netsvc.LocalService("workflow")是固定的

wf_service.trg_validate(uid, 'oecn.training.lesson', ids[0],

'review_to_draft', cr)中

oecn.training.lesson表示你要触发的工作流所在的model

ids[0]表示需要触发工作流的页面的id

review_to_draft是你要触发的迁移的signal

这样就完成了。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部