扫码阅读
手机扫码阅读

Odoo丨Odoo框架源码研读三:异常处理与定制化开发

203 2023-09-22

doo


Odoo

神州数码云基地

在 Odoo 上的尝试、调研与分享



本期内容

Odoo源码研读:

异常与定制化开发

前两期我们一起探讨了Odoo源码的前后端交互、ORM和日志:


电梯直达:

《Odoo框架源码研读二:ORM与日志》

《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对接数据库的具体细节、以及包括前端的框架的介绍等,这些都是后面努力的方向。

本期的分享就到这了,文中如果有不当之处,欢迎大家指出,不吝赐教!~

Odoo框架源码解读干货

用心奉上,欢迎交流~

你有更好思路或疑问

快来加入社群一起讨论哦⬇


本期作者

黄华信


原文链接: http://mp.weixin.qq.com/s?__biz=Mzg5MzUyOTgwMQ==&mid=2247519451&idx=1&sn=65aac745f1db4f172007426135398d49&chksm=c02fb77df7583e6bddf15c5c75e3d7be2d8ab05a7f44b838ce0d256bd5e5d6d65970bf3f7a68#rd