Odoo丨Odoo框架源码研读三:异常处理与定制化开发
Odoo源码研读的第三期内容:异常处理与定制化开发。
*异常处理*
Odoo中的Exception是对Python内置异常做了继承和封装,设定了自己核心的几个Exception。
而对异常的处理和Python内置异常的处理方式并无不同。
异常处理:
raise:通过raise来主动抛出异常。
try-except-finally:捕获异常进行处理。
*流程引擎与业务流程*
流程引擎:
作为ERP产品,必然要处理很多流程,对于流程的控制,Odoo是通过状态值的变化来进行控制的,也就是简单的状态机。
以销售模块为例:
一个销售订单从报价(Draft)到销售订单(Sale),实际上就是订单状态的改变。
业务流程:
模块之间的跳转一般都是基于视图跳转,而视图的跳转都是通过Action来进行跳转。
一般都是通过添加按钮来调用Action动作进行视图跳转,完成流程的跳转。
*定制化开发*
手动编码
Odoo的定制化开发主要都是通过新建module继承原module对原module进行拓展。
而拓展的内容分四个方面:
# Model的拓展
通过对原Model的继承(三种继承方式,详见官方文档),增加Field和重写Method等。
# XML视图的拓展
通过对视图继承,可以在原有视图上增添元素,比如按钮、字段等。
还有就是qweb自定义视图,这个通过qweb语法去创建自定义的视图。
# 前端组件的拓展
通过include/extend来重写或者继承原有前端js组件,创建自定义组件,然后通过xml将创建的js引入即可。
# controller的拓展
原有的公共Controllers已经不能满足特定需求,可以模仿系统自带的Controller创建自己Controller和Api方法。
配置化开发:
Odoo Studio模块开发者模式下,对视图XML的修改会因为模块升级而丢失。
究其原因,主要还是开发者模式下,是直接修改数据库存储的视图XML内容,模块下次升级时,会把XML内容覆盖,导致修改丢失。
而Studio通过新建module的方式去做module继承、视图继承、model继承来对原有的模块做拓展,这样的话,原模块的升级并不会影响新建模块,所以不会丢失修改。
商业版Odoo中存在Studio模块,支持通过拖拽方式进行配置新模块或对原模块进行拓展。
通过解读Studio模块的代码可以看出,Studio提供了创建App、编辑View视图、设置背景图片等接口,这也就解释了Studio拖拽配置页面的背后,实际是调用了这些封装的接口。
再深入到接口内,可以看出实际上是操作了视图相关的model(ir.ui.menu,ir.ui.action,…)。
比如创建App这个操作,我们来看其中逻辑 ⬇
- 1)ir.model给新module创建新的model(ir.model);
- 2)通过创建好的model,来创建model的默认的action(ir.actions.window);
- 3)创建module对应的菜单树(ir.ui.menu),以及关联的action。
这个流程看起来和Odoo提供的官方文档上创建模块的流程是不是非常一致?
与之不同的是,这里是直接在数据库创建对象,省去了模块安装的过程。
同样,对其他试图、model等的拓展实际和官方文档的流程并无区别。
*总结*
本文通篇着眼于Odoo后端对于请求的处理流程,从请求流转的过程来看Odoo的后端架构。
但对很多地方都是一带而过,其中包括threadLocal、cache缓存、orm对接数据库的具体细节、以及包括前端的框架的介绍等,这些都是后面努力的方向。
分享就到这了,文中如果有不当之处,欢迎大家指出,不吝赐教!