当前位置: 首页 > news >正文

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

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

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

http://www.lryc.cn/news/17449.html

相关文章:

  • Python概述 基础语法 判断 循环
  • 什么是品牌营销?学会正确推广您的业务
  • Golang学习Day1
  • 《设计模式》工厂模式
  • JS - 原型对象、原型链是什么
  • STM32f103 CubeMX封装 led程序
  • 智慧教室系统--温湿度控制系统
  • 只要一直向前定能到达远方,社科院与杜兰大学金融管理硕士项目为你注入动力
  • Java性能-回收算法-Throughout回收算法
  • 立项近7年,索尼产品经理分享PS VR2开发背后的故事
  • Kubernetes 如何通过ingress-nginx实现应用灰度发布?
  • 华为OD机试 - 密室逃生游戏(Java) | 机试题+算法思路+考点+代码解析 【2023】
  • redis的主从复制细节
  • SparkSQL
  • Python|每日一练|栈|数组|字典树|数组|树|广度优先搜索|单选记录:逆波兰表达式求值|回文对|二叉树的层序遍历
  • 慧教室系统--远程控制系统
  • OSCP-课外1(http万能密码、hydra密码暴力破解http、代码审计、Win缓存区溢出)
  • ELK日志分析--Logstash
  • Mysql插入数据从指定选项中随机选择、插入时间从指定范围随机生成、Navicat使用存储过程模拟插入测试数据
  • 【基础算法】关于高精度计算的问题【很高位数数据的加减乘除(相关代码用C++实现)】
  • 事理知识图谱
  • 多綫程之python爬蟲構建
  • 【干货】Redis在Java开发中的基本使用和巧妙用法
  • 历时半年,我终于阿里上岸了,附面经和Java非科班学习心得
  • ArkUI实战,自定义饼状图组件PieChart
  • 工作实战之系统交互api调用认证设计
  • 学习系统编程No.5【虚拟地址空间】
  • Linux常用指令(未完待续。。。)
  • 用D写裸机
  • (二十五)、实现评论功能(5)【uniapp+uinicloud多用户社区博客实战项目(完整开发文档-从零到完整项目)】