【Odoo 模块开发】(一)Wokflow 教程
2016-03-25 本文已影响3061人
誓词倾城
工作流概念:“ 工作流,指的是一系列相互衔接、自动进行的业务活动或任务。” -百度百科
我的个人理解,工作流就是执行一个任务的一系列过程(步骤),每个步骤可能需要设计不同“模块”,而且步骤之间又有着各种各样的联系。以企业的采购为例:采购过程包括 采购申请→采购批准→采购订单→审核采购订单→…… ;其中采购申请可能是A部门申请,批准可能是B部门批准……这就是一个简单的工作流。
- 本文将使用Odoo框架,开发一个简单的workflow模块,代码解释将嵌套在源码中
文件结构
文件结构Model创建(models.py)
- 注意在init.py 文件中导入你的“ models.py ”模块
- Odoo 框架中的代码跟平时开发时代码规范有些许出入
- 关于@api.one 链接
# -*- coding: utf-8 -*-
from openerp import models, fields, api
class workflow_demo(models.Model):
"""
Author : SXY
Date : 2016/3/24 9:28
Version : 1.0
"""
_name = 'workflow_demo.workflow_demo'
WORKFLOW_STATE_SELECTION = [
('init', '初始'),
('start', '开始'),
('confirm', '确认'),
('complete', '完成'),
]
name = fields.Char(string="姓名")
state = fields.Selection(WORKFLOW_STATE_SELECTION, default='init', string="状态", readonly=True)
# 注意使用新版本定义方法是,需要添加装饰器@api.one/@api.multi
# 将state 置于开始状态
@api.one
def do_start(self):
print "------------self.state = 'start'"
self.state = 'start'
return True
# 将state 置于确认状态
@api.one
def do_confirm(self):
print "------------self.state = 'confirm'"
self.state = 'confirm'
return True
# 将state 置于完成状态
@api.one
def do_complete(self):
print "------------self.state = 'complete'"
self.state = 'complete'
return True
View 创建 (workflow_view.xml)
- 注意,关于field,官网(链接)(参见lists中的field)有如下要求:要求同一个name只能使用一次。如 <field name="state" /> 中这个“state”只能使用一次,如果多次使用,那么只显示最后使用这个"state"的标签
<?xml version="1.0" encoding="UTF-8"?>
<openerp>
<data>
<!-- form 视图-->
<record id="workflow_demo_form_view" model="ir.ui.view">
<field name="name">Workflow</field>
<field name="type">form</field>
<field name="model">workflow_demo.workflow_demo</field>
<field name="arch" type="xml">
<form string="Workflow单">
<!-- workflow 声明-->
<!-- 添加header标签用来显示workflow中的按钮-->
<header>
<!-- 首先指明button的type为workflow类型 -->
<!-- name 对应于workflow.transition中的signal-->
<!-- states 属性用来控制button显示隐藏,例如states="init",当state属性为init时,这个button显示,否则不显示 -->
<button name="workflow_start" states="init" string="开始" type="workflow" class="oe_highlight"/>
<button name="workflow_confirm" states="start" string="确认" type="workflow" class="oe_highlight"/>
<button name="workflow_end" states="confirm" string="完成" type="workflow" class="oe_highlight"/>
<!-- 右上角 进度显示。注意在此处已经使用的state属性,所以在接下来的tree标签里面就不能再次声明<field name="state"/>了如果再次声明此处的进度显示便会失去作用 -->
<field name="state" widget="statusbar" statusbar_visible="start,confirm,complete"/>
</header>
<sheet>
<group col="4">
<field name="name"/>
</group>
</sheet>
</form>
</field>
</record>
<!-- tree(list)视图 -->
<record id="workflow_demo_tree_view" model="ir.ui.view">
<field name="name">workflow_demo</field>
<field name="type">tree</field>
<field name="model">workflow_demo.workflow_demo</field>
<field name="arch" type="xml">
<tree string="Workflow">
<field name="name"/>
</tree>
</field>
</record>
<record id="workflow_demo_action" model="ir.actions.act_window">
<field name="name">Workflow</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">workflow_demo.workflow_demo</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="help" type="html">
<p class="oe_view_nocontent_create">创建Workflow单</p>
</field>
</record>
<!-- 菜单 -->
<menuitem id="workflow_demo_main_menu" name="Workflow演示"/>
<menuitem id="workflow_demo_sub_menu" name="Workflow演示" parent="workflow_demo_main_menu"/>
<menuitem id="workflow_demo_item_menu" name="Workflow" parent="workflow_demo_sub_menu"
action="workflow_demo_action" sequence="1"/>
</data>
</openerp>
Workflow 创建(workflow_demo.xml)
- workflow 介绍
- Workflow transitions 中的group 属性可以进行操作权限控制
<?xml version="1.0" encoding="UTF-8"?>
<openerp>
<data>
<!-- Workflow 工作流 -->
<!-- https://www.odoo.com/documentation/8.0/reference/workflows.html -->
<!-- 设置record的model为系统自带的 “workflow” -->
<record model="workflow" id="workflow_demo">
<field name="name">workflow_demo</field>
<!-- 关联的model -->
<field name="osv">workflow_demo.workflow_demo</field>
<!-- 是否主动被实例化 -->
<field name="on_create">True</field>
</record>
<!-- workflow.activity 用来指定要调用的model里的方法,一般用来更改state状态-->
<record model="workflow.activity" id="activity_one">
<!-- wkf_id 这个activity对应于哪个workflow,这里对应于上面声明的workflow-->
<field name="wkf_id" ref="workflow_demo"/>
<field name="name">workflow.demo.activity.one</field>
<!-- dummy 类型用来指定这个activity 是workflow的开始还是结束-->
<field name="kind">dummy</field>
<!-- 开始是flow_start 结束是flow_end-->
<field name="flow_start">True</field>
</record>
<record model="workflow.activity" id="activity_two">
<field name="wkf_id" ref="workflow_demo"/>
<field name="name">workflow.demo.activity.two</field>
<!-- function 表示要执行model中的方法-->
<field name="kind">function</field>
<!-- 对应model中的方法-->
<field name="action">do_start()</field>
</record>
<record model="workflow.activity" id="activity_three">
<field name="wkf_id" ref="workflow_demo"/>
<field name="name">workflow.demo.activity.three</field>
<field name="kind">function</field>
<field name="action">do_confirm()</field>
</record>
<record model="workflow.activity" id="activity_four">
<field name="wkf_id" ref="workflow_demo"/>
<field name="name">workflow.demo.activity.four</field>
<field name="kind">function</field>
<field name="action">do_complete()</field>
</record>
<record model="workflow.activity" id="activity_five">
<field name="wkf_id" ref="workflow_demo"/>
<field name="name">workflow.temp.activity.five</field>
<field name="kind">dummy</field>
<field name="flow_end">True</field>
</record>
<!-- 相当于一个转换器,用来接受button传来的信号,调用相关的activity-->
<record model="workflow.transition" id="transition_one">
<!-- 表示上一个执行的activity,与上面声明的activity对应-->
<field name="act_from" ref="activity_one"/>
<!-- 表示上一个将要执行的activity-->
<field name="act_to" ref="activity_two"/>
<!-- 用来做一个严重,当满足条件是才能执行,可省略-->
<field name="condition">state == 'init'</field>
<!-- 接收的信号 -->
<field name="signal">workflow_start</field>
</record>
<record model="workflow.transition" id="transition_two">
<field name="act_from" ref="activity_two"/>
<field name="act_to" ref="activity_three"/>
<field name="condition">state == 'start'</field>
<field name="signal">workflow_confirm</field>
</record>
<record model="workflow.transition" id="transition_three">
<field name="act_from" ref="activity_three"/>
<field name="act_to" ref="activity_four"/>
<field name="condition">state == 'confirm'</field>
<field name="signal">workflow_end</field>
</record>
</data>
</openerp>
xml声明(openerp.py)
部分代码:
'data': [
# 声明workflow的相关xml
'views/workflow_view.xml',
'views/workflow_demo.xml',
],
切记添加完workflow之后,一定要在此做一下声明,好让模块加载过程中能够对workflow进行实例化。
到此,workflow 已经基本实现
测试
- 安装模块
- 测试
小结
workflow 该功能的开发要注意,workflow、workflow_activity、workflow_transition三者的关系
Odoo 相比较于现在的workflow声明方式,还有另外一种简单的方式,这种方式要在下一章节给大家介绍。
源码地址 http://git.oschina.net/tobe/OdooDemo (workflow_demo)