Odoo10.0中的工作流
Odoo10.0中可以通过两种方式来实现工作流(workflow)
一种的官网API中给出的方式,链接:https://www.odoo.com/documentation/10.0/reference/workflows.html
还有一种是通过查看Odoo10.0的源码,发现自带模块中使用的方式;
先来说下第一种方式:
首先,创建文件目录:
接下来编写model及XML文件:
model文件:
# -*- coding: utf-8 -*- from odoo import models, fields, api class WorkflowDemo(models.Model):
_name = 'workflow_demo.leave'
_description = u'工作流请假测试' name = fields.Char(u'请假说明')
start_date = fields.Datetime(u'开始时间')
end_date = fields.Datetime(u'结束时间') state = fields.Selection(
[
('init', u'初始'),
('start', u'开始'),
('confirm', u'确认'),
('complete', u'完成'),
],
default='init',
string=u'状态',
copy=False,
readonly=True,
) @api.one
def do_start(self):
print '-' * 40
print 'do_start'
self.state = 'start' @api.one
def do_confirm(self):
print '-' * 40
print 'do_confirm'
self.state = 'confirm' @api.one
def do_complete(self):
print '-' * 40
print 'do_complete'
self.state = 'complete'
view.xml文件:
<odoo>
<data>
<record model="ir.ui.view" id="workflow_demo.list">
<field name="name">workflow_demo list</field>
<field name="model">workflow_demo.leave</field>
<field name="arch" type="xml">
<tree>
<field name="name"/>
<field name="start_date"/>
<field name="end_date"/>
<field name="state"/>
</tree>
</field>
</record> <record model="ir.ui.view" id="workflow_demo.form">
<field name="name">workflow_demo form</field>
<field name="model">workflow_demo.leave</field>
<field name="arch" type="xml">
<form string="请假单">
<header>
<button name="leave_start" states="init" string="开始" groups="workflow_demo.workflow_leave_group_employee" type="workflow" class="oe_highlight"/>
<button name="leave_confirm" states="start" string="确认" groups="workflow_demo.workflow_leave_group_manager" type="workflow" class="oe_highlight"/>
<button name="leave_complete" states="confirm" string="完成" groups="workflow_demo.workflow_leave_group_leader" type="workflow" class="oe_highlight"/> <field name="state" widget="statusbar" statusbar_visible="start,confirm,complete"/>
</header>
<group>
<field name="name"/>
<field name="start_date"/>
<field name="end_date"/>
</group>
</form>
</field>
</record> <record model="ir.actions.act_window" id="workflow_demo.action_window">
<field name="name">workflow_demo window</field>
<field name="res_model">workflow_demo.leave</field>
<field name="view_mode">tree,form</field>
<field name="help" type="html">
<p class="oe_view_nocontent_create">创建请假单</p>
</field>
</record> <!-- Top menu item -->
<menuitem name="workflow_demo" id="workflow_demo.menu_root"/> <!-- menu categories -->
<menuitem name="Menu 1" id="workflow_demo.menu_1" parent="workflow_demo.menu_root"/> <!-- actions -->
<menuitem name="List" id="workflow_demo.menu_1_list" parent="workflow_demo.menu_1"
action="workflow_demo.action_window"/> </data>
</odoo>
leave_security.xml文件:
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<!--
noupdate
0,升级模块时更新数据
1,只在安装时创建数据,开发时可设置为0,定版后改回1
-->
<data noupdate="0">
<record id="model_workflow_leave_category" model="ir.module.category">
<field name="name">请假管理</field>
</record> <record id="workflow_leave_group_employee" model="res.groups">
<field name="name">团队成员</field>
<field name="category_id" ref="model_workflow_leave_category"/>
<field name="implied_ids" eval="[(4, ref('base.group_user'))]"/>
<field name="comment">团队成员</field>
</record>
<record id="workflow_leave_group_manager" model="res.groups">
<field name="name">项目经理</field>
<field name="category_id" ref="model_workflow_leave_category"/>
<field name="implied_ids" eval="[(4, ref('workflow_demo.workflow_leave_group_employee'))]"/>
<field name="comment">项目经理</field>
</record>
<record id="workflow_leave_group_leader" model="res.groups">
<field name="name">领导</field>
<field name="category_id" ref="model_workflow_leave_category"/>
<field name="implied_ids" eval="[(4, ref('workflow_demo.workflow_leave_group_manager'))]"/>
<field name="users" eval="[(4, ref('base.user_root'))]"/>
<field name="comment"></field>
</record>
</data>
</odoo>
ir.model.access.csv文件:
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_workflow_demo_workflow_demo,workflow_demo.leave,model_workflow_demo_leave,workflow_leave_group_leader,1,1,1,0
access_workflow_demo_workflow_demo,workflow_demo.leave,model_workflow_demo_leave,workflow_leave_group_manager,1,1,1,1
access_workflow_demo_workflow_demo,workflow_demo.leave,model_workflow_demo_leave,workflow_leave_group_employee,1,1,1,1
leave_workflow.xml文件:
<odoo>
<data>
<!-- 设置record为系统自带的workflow -->
<record model="workflow" id="workflow_leave">
<field name="name">workflow_demo</field>
<!-- 关联model -->
<field name="osv">workflow_demo.leave</field>
<!-- 是否主动被实例化 -->
<field name="on_create">True</field>
</record> <!-- workflow.activity 用来指定要调用的model里的方法, 一般用来更改state的状态 -->
<!--<record model="workflow.activity" id="activity_start">-->
<!--<!– wkf_id 指定上面生命的workflow –>-->
<!--<field name="wkf_id" ref="workflow_leave" />-->
<!--<field name="name">workflow_demo.leave start</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_do_start">
<field name="wkf_id" ref="workflow_leave" />
<field name="name">workflow_demo.leave do start</field>
<field name="flow_start">True</field>
<!-- function 表示要执行model中的方法 -->
<field name="kind">function</field>
<!-- 对应model中的方法 -->
<field name="action">do_start()</field>
</record> <record model="workflow.activity" id="activity_do_confirm">
<field name="wkf_id" ref="workflow_leave" />
<field name="name">workflow_demo.leave do confirm</field>
<!-- function 表示要执行model中的方法 -->
<field name="kind">function</field>
<!-- 对应model中的方法 -->
<field name="action">do_confirm()</field>
</record> <record model="workflow.activity" id="activity_do_complete">
<field name="wkf_id" ref="workflow_leave" />
<field name="name">workflow_demo.leave do complete</field>
<field name="flow_end">True</field>
<!-- function 表示要执行model中的方法 -->
<field name="kind">function</field>
<!-- 对应model中的方法 -->
<field name="action">do_complete()</field>
</record> <!--<record model="workflow.activity" id="activity_end">-->
<!--<field name="wkf_id" ref="workflow_leave" />-->
<!--<field name="name">workflow_demo.leave end</field>-->
<!--<field name="kind">dummy</field>-->
<!--<field name="flow_end">True</field>-->
<!--</record>--> <!-- Transitions control how the workflow progresses from activity to activity. -->
<!-- Transitions 来控制activity的走向 -->
<record model="workflow.transition" id="transition_one">
<field name="act_from" ref="activity_start" />
<field name="act_to" ref="activity_do_start" />
<field name="condition">state == 'init'</field>
<field name="signal">leave_start</field>
</record> <record model="workflow.transition" id="transition_two">
<field name="act_from" ref="activity_do_start" />
<field name="act_to" ref="activity_do_confirm" />
<field name="condition">state == 'start'</field>
<field name="signal">leave_confirm</field>
</record> <record model="workflow.transition" id="transition_three">
<field name="act_from" ref="activity_do_confirm" />
<field name="act_to" ref="activity_do_complete" />
<field name="condition">state == 'confirm'</field>
<field name="signal">leave_complete</field>
</record> </data>
</odoo>
__mainfest__.py文件:
# -*- coding: utf-8 -*-
{
'name': "工作流Demo",
'summary': """
工作流测试
""",
'description': """
Long description of module's purpose
""",
'author': "ed",
'website': "http://www.yourcompany.com",
'category': 'Uncategorized',
'version': '0.1',
'application': True,
# any module necessary for this one to work correctly
'depends': ['base'],
'sequence': 10,
# always loaded
'data': [
'security/leave_security.xml',
'security/ir.model.access.csv',
'views/leave_workflow.xml',
'views/views.xml',
],
# only loaded in demonstration mode
'demo': [
],
}
使用这种方式定义workflow,FromView中有两处需要注意:
1.button中的name属性对应workflow.transition中的signal;
2.button的type属性必须设置为workflow,否则会报错;
接下来第二种方式定义workflow,这种方式相比较第一种方式,要简单一些
原理是直接在button中调用model中定义的方法来修改state的状态,但是此处button的type属性需要定义为object
具体如下:
__mainfest__.py文件中注释掉该行
# 'views/leave_workflow.xml',
view.xml中需要将header中的button坐下调整:
<header>
<button name="do_start" states="init" string="开始" groups="workflow_demo.workflow_leave_group_employee" type="object" class="oe_highlight"/>
<button name="do_confirm" states="start" string="确认" groups="workflow_demo.workflow_leave_group_manager" type="object" class="oe_highlight"/>
<button name="do_complete" states="confirm" string="完成" groups="workflow_demo.workflow_leave_group_leader" type="object" class="oe_highlight"/> <field name="state" widget="statusbar" statusbar_visible="start,confirm,complete"/>
</header>
其中name属性为model中的方法,type属性修改为object,其他不用修改。
以上两种方式我自己都本地验证过,是没有问题的,有疑问的伙伴可以留言
大家共同学习,共同进步
Odoo10.0中的工作流的更多相关文章
- odoo-10.0 create database 失败
在初始化数据库的界面点击[create database] create database 失败 报错如下 2017-01-05 20:15:18,529 4652 INFO ? werkzeug: ...
- 通过配置文件启动odoo-10.0
odoo-10.0文件夹中找到odoo-bin,这是10.0的启动文件,也是一个py文件 使用pycharm启动后,找到run->edit configuration 找到odoo-bin 找到 ...
- odoo10.0在odoo12.0环境的基础上搭建环境
在前边的文章中,讲述了如何搭建12.0的环境,现由业务的需要需要在此基础上搭建基于python2.7的10.0版本. 第一步,安装python2.7 sudo apt- 第二步,安装python-de ...
- [译] C# 5.0 中的 Async 和 Await (整理中...)
C# 5.0 中的 Async 和 Await [博主]反骨仔 [本文]http://www.cnblogs.com/liqingwen/p/6069062.html 伴随着 .NET 4.5 和 V ...
- Spring.Net在Mvc4.0中应用的说明
案例Demo:http://yunpan.cn/cJ5aZrm7Uybi3 访问密码 414b Spring.Net在Mvc4.0中应用的说明 1.引用dll 2.修改Global文件 (Spring ...
- WCF学习之旅—WCF4.0中的简化配置功能(十五)
六 WCF4.0中的简化配置功能 WCF4.0为了简化服务配置,提供了默认的终结点.绑定和服务行为.也就是说,在开发WCF服务程序的时候,即使我们不提供显示的 服务终结点,WCF框架也能为我们的服务提 ...
- 看看C# 6.0中那些语法糖都干了些什么(终结篇)
终于写到终结篇了,整个人像在梦游一样,说完这一篇我得继续写我的js系列啦. 一:带索引的对象初始化器 还是按照江湖老规矩,先扒开看看到底是个什么玩意. 1 static void Main(strin ...
- 看看C# 6.0中那些语法糖都干了些什么(中篇)
接着上篇继续扯,其实语法糖也不是什么坏事,第一个就是吃不吃随你,第二个就是最好要知道这些糖在底层都做了些什么,不过有一点 叫眼见为实,这样才能安心的使用,一口气上五楼,不费劲. 一:字符串嵌入值 我想 ...
- FineUI(开源版)v6.0中FState服务器端验证的实现原理
前言 1. FineUI(开源版)是完整开源,最早发起于 2008-04,下载全部源代码:http://fineui.codeplex.com/ 2. 你可以通过捐赠作者来支持FineUI(开源版)的 ...
随机推荐
- 打码(C语言)常见粗心小错误 (前方高能,一定要点)
打码(C语言)常见粗心小错误 标签(空格分隔): 博客 自我介绍 本人学院 (http://sdcs.sysu.edu.cn/) 欢迎访问 本人学号 16340213 目录 打码C语言常见粗心小错误 ...
- Spring Cloud Config Client 超时与重试
简介 有时客户端需要在 config server 无响应时进行重试,以给 config server 时间进行恢复.利用 spring 提供的重试组件,我们可以方便的配置重试机制,包括重试间隔,重试 ...
- STL函数库的应用第三弹——数据结构(栈)
Part 1:栈是什么 栈(stack)又名堆栈,它是一种运算受限的线性表.限定仅在表尾进行插入和删除操作的线性表. 这一端被称为栈顶,相对地,把另一端称为栈底. 向一个栈插入新元素又称作进栈.入栈或 ...
- python 3.7 jupyter中安装 docx报错
from docx import Document报错: Import Error: No module named ‘exceptions‘ 解决办法: 使用下面的命令重新安装docx !pip i ...
- 微信小程序之蓝牙广播信息
期初第一次做蓝牙开锁的时候遇到的最尖锐的问题就是ios设备如何对获取的广播信息进行读取,大概用了4中方式,都无法解决,最后不得不求助官方人员.给了一个方法,大家可以参考.在此附图: 由于mac地址是6 ...
- 最新通达OA-getshell 漏洞复现
0x00 通达简介 通达OA国内常用的办公系统,使用群体,大小公司都可以,其此次安全更新修复的高危漏洞为任意用户登录漏洞.攻击者在远程且未经授权的情况下,通过利用此漏洞,可以直接以任意用户身份登录到系 ...
- Asp.net Core 3.1 引用ORM工具包 yrjw.ORM.Chimp(EF + dapper + Autofac)使用教程
yrjw.ORM.Chimp 介绍 It is not the encapsulation of ORM,a based on EF + dapper + Autofac, is repository ...
- 独立集(bubble) 题解
问题描述 有一天,一个名叫顺旺基的程序员从石头里诞生了.又有一天,他学会了冒泡排序和独立集.在一个图里,独立集就是一个点集,满足任意两个点之间没有边.于是他就想把这两个东西结合在一起.众所周知,独立集 ...
- CentOS 6.x/7.x上安装git
yum安装 # yum info git # yum install -y git 可以通过下面的命令来检查是否安装了git环境 git --version 参考:如何在CentOS 6.x/7.x上 ...
- IDEA常用快捷键Mac os和Windows对照--用到了就会更新
之前公司用了一段的MacBookPro,离职后自己入手了一台MacBookPro.但是现在的公司中使用的电脑是古老的win7,两个系统的键盘有些许差别,而且快捷键也略有不同.最近因为疫情影响,在家远程 ...