gooderp吧 关注:15贴子:13
  • 1回复贴,共1

GoodERP源码解读 core 模块之 猴子补丁

只看楼主收藏回复

https://gitee.com/gooderp-study/GoodERP/blob/master/core/models/core.py
这个文件里,我们利用python的猴子补丁机制对odoo框架层的几个机制进行了全局的修改。
第一个是列表按日期分组时的显示格式,odoo原生按日期字段分组,按天分组时每组的标签用 【 日 月 年】格式显示,按月分组时每组标签用 【月 年】格式显示,非常不符合中国人的阅读习惯,我们通过黑掉 _read_group_process_groupby 方法的方式将其改为了 【年-月-日】和【年-月】的显示方式。实际上按季度分组和按周分组也是倒着显示的,只是这两个不常用,就没有改。
第二个是新模型记录的自动编号,在odoo里的标准实现是继承模型的create方法取指定的sequence记录。但是每个模型都搞这么一段类似的逻辑不符合DRY(不要重复自己)的原则,我们就黑掉了底层的create方法。只要新模型有name字段,而且sequence表里有个和模型匹配的记录存在,就去取下一编号。这个设计至少减少了gooderp早期版本5%的重复冗余代码,对依赖gooderp的新模型也是个很方便的机制。
第三个是模型删除的机制,对于单据类的数据,凡是走完流程的或者生成了后续单据或者更新了其他表,都不应该允许删除的(当然可以撤销为草稿再删除),我们gooderp里会统一使用state字段值为done来表示单据的完结,所以为了避免在定义每个单据的时候都重载unlink方法,我们在这里黑掉底层的方法写了个通用逻辑。普及版这里有个小 bug,因为odoo针对 TransientModel 的记录有个半小时清理的计划任务,如果恰好这些模型有state的字段且记录的这个字段值为done,那么删除会失败。log里会有记录,不影响最终用户使用。确实是我们忽略了这个场景,所以更新版判断了一下模型的 _transient 属性,为真就不保护它的记录了。
第四个是给所有模型增加了一个 cancel 方法,直接改状态值为cancel(这里应该用过去时,可惜修正它会影响到历史数据,只能将错就错了)。所以需要作废状态的单据只需要在状态里有cancel这个可选值,在form view上增加cancel按钮就可以了,省去了新增按钮方法的麻烦。
除了这四个针对odoo底层框架作出的全局修改方便提升开发效率,我们当然也夹带了些私货在里面。就是继承了 ir.ui.view 对象,让所有页面的标题都带着 - GoodERP


1楼2021-06-20 21:32回复
    跟着姐夫学gooderp


    IP属地:江苏2楼2021-06-22 21:13
    回复