出库时的 stock.move.line 是如何确定的
用通俗但不失源码细节的方式,讲清楚 Odoo 出库时 stock.move.line 的生成逻辑:从 stock.move、stock.quant、移除策略到 lot/serial 拆行。
CATEGORY FOCUS
聚合 Odoo 开发基础、源码理解、ORM、模型、视图、安全与扩展实践。
TOPIC PICKS
用通俗但不失源码细节的方式,讲清楚 Odoo 出库时 stock.move.line 的生成逻辑:从 stock.move、stock.quant、移除策略到 lot/serial 拆行。
从 `ir.rule` 源码看记录规则如何把 `domain_force`、用户组和 `allowed_company_ids` 组合成最终访问域。
Odoo 视图合并不是简单的“后写覆盖前写”。要判断 XPath 真的改到哪里,得先看 locate_node()、apply_inheritance_specs() 和继承树的组合顺序。
从 purchase.order.button_confirm 和 purchase_stock._create_picking 看 Odoo 如何把采购确认变成收货单、stock.move 和后续预留。
手写 SQL 只改了数据库,不会自动走 Odoo 的缓存失效和依赖传播。要让存储计算字段恢复一致,关键是理解 invalidate_recordset()、modified() 与 flush_recordset() 的分工。
很多人把按钮显示问题都归因于 view 继承或权限错配。可从 ir_ui_view 与 web 客户端源码看,Odoo 对按钮的处理至少分三层:服务端先按 groups 裁剪节点,再把 invisible/readonly 条件带到前端求值,最后还会受 create/edit/delete 这类 activeActions 影响。
很多开发者把 `has_group()` 当成一个轻量 if 判断,但从 Odoo 19 的 `res_users.py` 和 `res_groups.py` 看,它背后其实连着 XMLID 解析、组定义缓存、隐含组展开,以及对“是否允许检查别人权限”的访问边界。本文讲清 `has_group()` 真正改变的是什么,以及为什么它常常把 bug 藏得更深。