Odoo 权限到底按什么顺序卡你:ACL、记录规则、sudo 与多公司上下文讲透
从 Odoo 19 源码出发,讲清一次访问为什么会先过 ACL、再过记录规则,以及 sudo 和 allowed_company_ids 为什么会让同一段代码在不同环境下表现完全不同。
ARTICLE LIBRARY
持续记录源码理解、业务流程、模块开发经验与踩坑总结。
从 Odoo 19 源码出发,讲清一次访问为什么会先过 ACL、再过记录规则,以及 sudo 和 allowed_company_ids 为什么会让同一段代码在不同环境下表现完全不同。
从交货后的 Reverse Transfer、退货单、Repair Order 绑定、维修部件 stock.move、完工落库存,到返还客户的标准边界与二开设计,讲清 Odoo 维修场景里“客户发回待维修产品”到底是怎么流转的。
Odoo 的上传反馈之所以看起来顺滑,不是因为某个上传框“更高级”,而是因为前端把三件事明确拆开了:`file_upload` service 负责传输和任务状态,`overlay` service 负责临时覆盖层生命周期,`notification` 负责轻量错误与结果反馈。本文基于 web 源码把这三层边界讲透。
很多人把 Odoo 销售里的商品配置器理解成一个前端弹窗:选属性、改数量、点确认。但从 `product_configurator_dialog.js`、`product_product.js` 和 `sale_order.py` 看,官方真正维护的是一条“组合选择 → 服务器校验 → 价格回写 → 销售行落地”的接力链。本文把这条链路讲透。
很多人以为 Odoo 的多公司切换只是“点一下菜单,然后整页刷新”。但从 `switch_company_menu.js` 和 `user.js` 看,官方真正维护的是一套前端用户上下文:cookie 记录当前公司集合,`allowed_company_ids` 驱动 RPC 上下文,`userBus` 负责广播变化,路由层再决定是局部栈回退还是整页刷新。本文把这套链路讲透。
很多人以为 Odoo 会计里上传发票附件只是“前端传一个文件,后端存成 attachment”。但从 `document_file_uploader.js` 到 `account/models/ir_attachment.py` 的实现看,官方实际拆成了三段:先把原始文件安全落成附件,再把附件批量交给业务模型识别生成单据,最后由附件后处理把会计对象和附件关系补齐。本文把这条链路讲透。