(09)odoo工作流

* 工作流
查到相对应的工作流 设置->工作流->工作流
对应的模型 workflow 对应的表格 是 wkf 开头的表

工作流中的节点叫 “活动(activity)” 弧线连接叫“转变(transition)”
转变可以增加属性如 条件、信号、触发器

工作流功效:
# 关于记录如何演变的描述
# 根据多样的弹性的条件建立自动化行动机制
# 管理公司流程和确认规则
# 管理对象间的互动
# 在他们的生命期内一个可视化的流程图

定义工作流对象:
<record id=”wkf_qingjia” model=”workflow” >
<field name=”name”>wkf.qingjia</field>
<field name=”osv”>qingjia.qingjd</field>
<field name=”on_create”>True</field>
</record>

id 很重要
model=workflow
name 本工作流的name,随意
osv 这个很重要,对应的具体的那个模型
on_create 一般设置为True, 工作流会根据每一个模型新建一个对象再实例化一次

创建节点:
<record id=”act_draft” model=”workflow.activity” >
<field name=”wkf_id” ref=”wkf_qingjia” />
<field name=”name”>draft</field>
<field name=”flow_start” eval=”True”/>
<field name=”kind”>function</field>
<field name=”action”>draft()</field>
</record>
flow_start 如果设置为 True 工作流会从这里开始
wkt_id 属于某个工作流对象我们看到这里的 ref 语法如果是引用本模型内的对象则可以省略
kind 有四种 dummy function subflow stop all
action 具体的动作(于模型上)
flow_stop 一个工作流的完成就是所有的活动有 flow_stop 属性的都设置为了 True

创建连接:
<record model=”workflow.transition” id=”holiday_draft2confirm”> <!-- 1. draft->submitted (confirm signal) -->
<field name=”act_from” ref=”act_draft” />
<field name=”act_to” ref=”act_confirm” />
<field name=”signal”>confirm</field>
<field name=”condition”>can_reset</field>
<field name=”group_id” ref=”base.group_user”/>
</record>

转变对象属于 workflow.transition 模型。
act_from 何活动出发 act_to 到何活动去 signal


来一个完整的工作流文件 
<?xml version=”1.0” ?>
<openerp>
<data noupdate=”0”>
<record id=”wkf_qingjia” model=”workflow” >
<field name=”name”>wkf.qingjia</field>
<field name=”osv”>qingjia.qingjd</field>
<field name=”on_create”>True</field>
</record>
<record id=”act_draft” model=”workflow.activity” >
<field name=”wkf_id” ref=”wkf_qingjia” />
<field name=”name”>draft</field>
<field name=”flow_start” eval=”True”/>
<field name=”kind”>function</field>
<field name=”action”>draft()</field>
</record>
<record id=”act_confirm” model=”workflow.activity” >
<field name=”wkf_id” ref=”wkf_qingjia” />
<field name=”name”>confirm</field>
<field name=”kind”>function</field>
<field name=”action”>confirm()</field>
</record>
<record id=”act_accept” model=”workflow.activity” >
<field name=”wkf_id” ref=”wkf_qingjia” />
<field name=”name”>accept</field>
<field name=”kind”>function</field>
<field name=”flow_stop”>True</field>
<field name=”action”>accept()</field>
</record>
<record id=”act_reject” model=”workflow.activity” >
<field name=”wkf_id” ref=”wkf_qingjia” />
<field name=”name”>reject</field>
<field name=”kind”>function</field>
<field name=”action”>reject()</field>
</record>

<record model=”workflow.transition” id=”qingjia_draft2confirm”>
<field name=”act_from” ref=”act_draft” />
<field name=”act_to” ref=”act_confirm” />
<field name=”signal”>btn_confirm</field>
</record>
<record model=”workflow.transition” id=”qingjia_confirm2accept”>
<field name=”act_from” ref=”act_confirm” />
<field name=”act_to” ref=”act_accept” />
<field name=”signal”>btn_accept</field>
<field name=”condition”>is_manager</field>
</record>
<record model=”workflow.transition” id=”qingjia_confirm2reject”>
<field name=”act_from” ref=”act_confirm” />
<field name=”act_to” ref=”act_reject” />
<field name=”signal”>btn_reject</field>
<field name=”condition”>is_manager</field>
</record>
</data>
</openerp>

----- 对应的模型支持
from openerp import models, fields, api
import logging

class Qingjd(models.Model):
_name = ’qingjia.qingjd’
name = fields.Many2one(’hr.employee’, string=” 申请人”, readonly=True)
manager = fields.Many2one(’hr.employee’, string=” 主管”,readonly=True)
beginning = fields.Datetime(string=” 开始时间”, required=True,
default = fields.Datetime.now())
ending = fields.Datetime(string=” 结束时间”, required=True)
reason = fields.Text(string=” 请假事由”,required=True)
accept_reason = fields.Text(string=” 同意理由”,default=” 同意。 ”)
#########compute 没有写入数据库 on the fly 可以被 workflow 的 condition 调用
current_name = fields.Many2one(’hr.employee’, string=” 当前登录人”,compute=”_get_current_name”)
is_manager = fields.Boolean(compute=’_get_is_manager’)
######
state = fields.Selection([
(’draft’, ” 草稿”),
(’confirmed’, ’ 待审核’),
(’accepted’, ’ 批准’),
(’rejected’, ’ 拒绝’),
],string=’ 状态’,default=’draft’,readonly=True)

@api.model# 使用新的 api
def _get_default_name(self):
uid = self.env.uid
res = self.env[’resource.resource’].search([(’user_id’,’=’,uid)])
name = res.name
employee = self.env[’hr.employee’].search(
[(’name_related’,’=’,name)])
# for i in self.env.user:# 说明其是 recordset
# print(’hello’)
return employee

@api.model
def _get_default_manager(self):# 单记录 recordset 可以直接用点记号读取属性值
uid = self.env.uid
res = self.env[’resource.resource’].search([(’user_id’,’=’,uid)])
name = res.name
employee = self.env[’hr.employee’].search(
[(’name_related’,’=’,name)])
logging.info(”myinfo {}”.format(employee.parent_id))
return employee.parent_id # 似乎有这种数字引用方法值得我们注意
_defaults = {
’name’ : _get_default_name ,
’manager’ : _get_default_manager ,
}

def _get_is_manager(self):### 这里 return 不起作用
print(’----------test’)
print(self.current_name, self.manager,self.env.uid)
if self.current_name == self.manager:
self.is_manager = True
else:
self.is_manager = False

def _get_current_name(self):
uid = self.env.uid
res = self.env[’resource.resource’].search([(’user_id’,’=’,uid)])
name = res.name
employee = self.env[’hr.employee’].search(
[(’name_related’,’=’,name)])
self.current_name = employee
##############################
def draft(self, cr, uid, ids, context=None):
if context is None:
context={}
self.write(cr,uid,ids,{’state’:’draft’},context=context)
return True

def confirm(self, cr, uid, ids, context=None):
if context is None:
context={}
self.write(cr,uid,ids,{’state’:’confirmed’},context=context)
return True

def accept(self, cr, uid, ids, context=None):
if context is None:
context={}
self.write(cr,uid,ids,{’state’:’accepted’},context=context)
print(’ 你的请假单被批准了’)
return True

def reject(self, cr, uid, ids, context=None):
if context is None:
context={}
self.write(cr,uid,ids,{’state’:’rejected’},context=context)
print(’ 抱歉,你的请假单没有被批准。 ’)
return True

----- 对应的视图支持
<?xml version=”1.0”?>
<openerp>
<data>
<!--
打开请假单动作
-->
<act_window id=”action_qingjia_qingjd”
name=” 请假单”
res_model=”qingjia.qingjd”
view_mode=”tree,form” />
<!--
表单视图
-->
<record id=”qingjia_qingjd_form” model=”ir.ui.view”>
<field name=”name”>qing jia dan form</field>
<field name=”model”>qingjia.qingjd</field>
<field name=”arch” type=”xml”>
<form>

<header>
<button name=”btn_confirm” type=”workflow” states=”draft”
string=” 发送” class=”oe_highlight” />
<button name=”btn_accept” type=”workflow” states=”confirmed”
string=” 批准” class=”oe_highlight”/>
<button name=”btn_reject” type=”workflow” states=”confirmed”
string=” 拒绝” class=”oe_highlight”/>
<field name=”state” widget=”statusbar” statusbar_visible=”draft,confirmed,accepted,rejected” class=”oe_highlight” type=”workflow 
”/>
</header>

<sheet>
<group name=”group_top” string=” 请假单”>
<group name=”group_left”>
<field name=”name”/>
<field name=”beginning”/>
</group>
<group name=”group_right”>
<field name=”manager”/>
<field name=”ending”/>
</group>
</group>

<group name=”group_below”>
<field name=”reason”/>
</group>
</sheet>
</form>
</field>
</record>
<!--
tree 视图
-->
<record id=”qingjia_qingjd_tree” model=”ir.ui.view”>
<field name=”name”>qing jia dan tree</field>
<field name=”model”>qingjia.qingjd</field>
<field name=”arch” type=”xml”>
<tree>
<field name=”name”/>
<field name=”beginning”/>
<field name=”ending”/>
<field name=”state”/>
</tree>
</field>
</record>
<!--
加入菜单
-->
<menuitem id=”menu_qingjia” name=” 请假” sequence=”0”></menuitem>
<menuitem id=”menu_qingjia_qingjiadan” name=” 请假单” parent=”menu_qingjia”></menuitem>
<menuitem id=”menu_qingjia_qingjiadan_qingjiadan” parent=”menu_qingjia_qingjiadan” action=”action_qingjia_qingjd”></menuitem>
</data>
</openerp>

作者:陈伟明 | 联系 : QQ 942923305 | 微信 toby942923305 | E-mail: toby2chen@hotmail.com


转载于:https://my.oschina.net/toby2chen/blog/611320

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值