workflow中的‘非典型’自动触发器trigger_model

Openerp中workflow的设计机制


工作流程系统在OpenERP里是非常有用的机制,可以用于即时描述单据(模型)状态的演进过程。工作流实现了状态流转的可配置,通过迁移的
condition代替python代码中的判断语句,通过迁移的signal增加审批按钮,增加了系统的灵活性。工作流程是完全可以定制的,这些流程可
以调整适用于几乎所有公司的作业流程和交易逻辑。 这个工作流程系统使OpenERP非常有弹性,
而且可以不用编程增加新功能,就可以支持不断变化的需要。对于单据的审批,以及对应的的动作,都可以在OE的工作流中定义解决,而不需要全在对象上进行编
码。即工作流实现了流程处理与对象的业务逻辑的代码相分离,降低了不同处理代码的耦合性,增加了系统功能的柔软性。

如上所说工作流定义了对某一类型的对象,为model的处理流程,每当系统新产生一个model的实例(resource)时候,则对应产生一个工作流实例(workinstance)。如:创建sale.order实例时系统自动启动一个对应的工作流实例

简而言之就是工作流定义流程,工作流实例记录对象在流程的哪个阶段,如SO中,SO1在draft状态,SO2已经审批通过。

上面一方的大论过后,下面我们来揭开trigger_model的神秘面纱

工作流就像是隐藏在对象幕后的一个灵敏而又聪明的监视器,闻风而动,它并不会傻傻的每时每刻去检查这些条件,只有当对象发生了变化,这个监视器才会敏锐的捕获信息,随后去检查条件是否满足,可否迁移,当然,仅有这聪明和敏锐是难成大事的,所谓大师就是看到别人看不到的东西,下面我们看看:

当你创建了一张Sale Order,你想当它发货确认以后,就让Sale order的状态为Done,你确认Sale
order的时候,它乖乖的会检查一次,当前处在未发货状态,condition为False,状态不能变,但是过几天我们发货了,这时你发现这工作流装
死,它不给你的Sale Order状态改为
Done,你怒了,把这小子狠批一顿,工作流委屈的说,那是别人家的事(外部的对象)你得让他和我打个招呼…,于是你想想也有道理,于是你跑去别人家也装
了监视器(子工作流),那边有变化就发个信号过来

这个监视器是这样设计的(子工作流):当Activity为subflow的类型时,进入该状态节点(activity)触发“subflow_id”中
指定的工作流。在sale模块的workflow “wkf_sale”中,
需要开发票时候,它触发流程account模块中的工作流“account.invioce.basic” (field name=”subflow_id”
ref=”account.wkf”)。 account.wkf处理完成后,发出信号subflow.paid 通知wkf_sale流程(field
name=”signal_send”>subflow.paid<)。
销售订单的工作流中从invioce子工作流节点到invioce_end节点的transition条件中定义了信号
subflow.paid=True,当条件满足时就实现状态跳转,用于父子流程通信的工作流signal必须是形如subflow.*

可是过几天麻烦来了,有人家不让你装这个监视器(有些对象没有定义工作流如stock.move),这可咋办,你为难了,这时候trigger_model闪亮登场

?





1

2

<field name="trigger_model">stock.move</field>

<field name="trigger_expr_id">[move_id.id]</field>

trigger_model:触发你去检查迁移条件的外部对象类型

trigger_expr_id:trigger_model类型的对象ids,可以是一段Python代码,也可以定义一个方法,返回ids

大喜之余,立马动手

?





1

2

3

4

5

6

7

<record id="ship_to_ongoing"
model="workflow.transition">

   <field name="act_from"
ref="state_ship"
/>

   <field name="act_to"
ref="state_ongoing"
/>

   <field name="trigger_model">stock.picking</field>

   <field name="trigger_expr_id">[out_picking_id.id]</field>

   <field name="condition">test_out_shipping_done()</field>

</record>

沾沾自喜,再一次再一次被耍了,我改变picking对象状态的时候,它没有在去检查condition

What Amazing Happens! 低头grep…,目标出现。。。

?





1

2

./procurement/procurement_workflow.xml:171:            <field name="trigger_model">stock.move</field>

./procurement/procurement.py:431:            wf_service.trg_trigger(uid, ‘procurement.order‘, id, cr)

映衬标题,‘非典型’触发器trigger_model,它并不是那么自动,你得在定义的模块中手动调用wf_service.trg_trigger方法,第一次触发的时候它在数据库中写入wkf_trigger:

1 model = trigger_model

2 res_ids = trigger_expr_id定义的ids

3 workitem_id = workitem id of act_from activity

4 inst_id = instance id of the wrk_flw (参见addons/base/ir/workflow/work.py
下的wkf_triggers)

wkf_trigger就像是一个过滤器,只有哪些对象的特定记录改变了,才会让这工作流去check

trigger_model这个神奇的利器在OpenERP 7.0却仅有中account.move.line, procurement.order 和
stock.move中 用到了

越厉害的东西越危险,高内聚低耦合的设计理念,openerp玩转自如,面纱已落地….

时间: 2024-10-28 23:16:49

workflow中的‘非典型’自动触发器trigger_model的相关文章

Spring 3.0 学习-DI 依赖注入_创建Spring 配置-使用一个或多个XML 文件作为配置文件,使用自动注入(byName),在代码中使用注解代替自动注入,使用自动扫描代替xml中bea

文章大纲 在xml中声明bean和注入bean 在xml中声明bean和自动注入bean 自动扫描bean和自动注入bean 对自动扫描bean增加约束条件 首次接触spring请参考 Spring 3.0 学习-环境搭建和三种形式访问 1.典型的Spring XML 配置文件表头 <?xml version="1.0" encoding="UTF-8"?><!-- 一般化的Spring XML 配置 --> <beans xmlns=

SAP成都研究院非典型程序猿,菜园子小哥:当我用UI5诊断工具时我用些什么

身边有些年轻同事曾经向我表达过这种困扰:尽管完成日常工作没有任何问题,但是还想更进一步,把代码写得更好些,做到精益求精.现在写的代码能实现功能,但是不知道可以怎样写得更好. 除了阅读优秀的开源库开源框架,一点一滴积累之外,Jerry的一个建议是大家可以多琢磨琢磨每天工作使用到的一些工具,研究下这些工具里自己感兴趣的那些功能的实现原理.想一想这个功能如果让自己实现,该怎样去设计和编码,琢磨完之后再去看工具的实现,和自己心中所想进行比较.这样一来,既学习了这些工作优秀的设计和实现,又进一步熟悉了工作

非典型SOHO的苦与乐

每天睡到自然醒,有车的不用在路上堵,没车的不用在车里挤,干活累了可以看看苍老师或者股市不用担心老板,要认真时不会被同事的聊天或电话烦扰,想放松时可以在位置上吞云吐雾,有另一半的还可以做饭献献殷勤充实生活-- 这应该是很多人梦想的工作状态,在家上班.作为一名IT老男人,我过去常常想,写程序是最适合在家干的工种之一,每天费时费力来办公室,一大堆人在空气未必流畅的房间里,论效率实在不如远程工作,需要的时候在线聊天,视频会议来沟通和讨论需求,部署调错和解决用户问题也可以远程解决. 在我作为一名自由职业者

关于设置oracle中系统编号SYSID自动编号的问题;

http://liye9801.blog.163.com/blog/static/601970320086210039591/ 如何在oracle里设置自动编号列 2008-07-21 12:00:39| 分类: Oracle | 标签: |字号大中小 订阅 我们知道在oracle里没有这个类型呀!所以我们只能想其他的办法! 趏raclek中,为了方便我常常用触发器及序列结合起来实现,下面就是一个示例,希望对兄弟们有帮助... 先建表.再建序列.然后是触发器,最后测试 =============

WPF中样式和行为和触发器

原文:WPF中样式和行为和触发器 样式简介:样式(style)是组织和重用格式化选项的重要工具,不是使用重复的标记填充XAML,以便设置外边距.内边距.颜色以及字体等细节.而是创建一系列封装所有这些细节的样式,然后在需要之处通过属性来设置样式.名称空间是System.Windows. 1.样式. 为了理解适合使用样式的集合,分析一个简单的示例,设想需要标准化在窗口中使用的字体,最简单的方式是设置包含窗口的字体属性,这些属性都是在Control类中定义的,包括FontFamily.FontSize

myeclipse中配置spring xml自动提示

这是一篇分享技巧的文章:myeclipse中配置spring xml自动提示. ① window -> preferences -> MyEclipse -> Files and Editors -> XML -> XML Catalog ② 选择User Specified Entries,点击add按钮弹出一个选框,填入以下三项 i. Location: D:\baiduyun\Spring\spring_doc\soft\spring-framework-2.5.6\d

[转]Eclipse中的Web项目自动部署到Tomcat

原文地址:http://www.cnblogs.com/ywl925/p/3815173.html 原因 很长时间没用Eclipse了,近期由于又要用它做个简单的JSP项目,又要重新学习了,虽然熟悉的很快,但记忆总是很模糊,偶尔犯错,以前很少写 博客,现在感觉还是很有必要的,编程中每个人对于犯过的错误,解决后不再使用的话,很长时间重新使用,还是会犯同样的错误.(这是人,编程环境,思维方式 共同决定给的) 问题 这里就有个问题,是怎么把Eclipse中的网站项目自动部署到tomcat中.在Ecli

回调函数中调用类中的非静态成员变量或非静态成员函数

有关这方面的问题,首先说一点: 回调函数必须是静态成员函数或者全局函数来实现回调函数,大概原因是普通的C++成员函数都隐含了一个函数参数,即this指针,C++通过传递this指针给成员函数从而实现函数可以访问类的特定对象的数据成员.由于this指针的原因,使得一个普通成员函数作为回调函数时就会因为隐含的this指针问题使得函数参数个数不匹配,从而导致回调函数编译失败. 基于上面的理论,如何在类中封装回调函数呢? 回调函数只能是全局函数或者静态成员函数,但是由于全局函数会破坏封装性,所以只能用静

Eclipse中的Web项目自动部署到Tomcat

一.原因. 1.写java程序有一段时间了,但很久没用eclipse了,所以使用eclipse编写的web项目部署到tomcat 的方式也不是很清楚,下面记录一下将Eclipse 上的web项目自动部署到tomcat 上的方式: 二.部署问题 1.这里就有个问题,是怎么把Eclipse中的网站项目自动部署到tomcat中.在Eclipse中做的Web项目默认是不支持将项目发布到Web服务器上的,会发布到工作空间的某个目录下,因此无法在外部启动Tomcat来运行Web项目,只有打开Eclipse中