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