如何在Odoo 10中修改自定义模块里noupdate="1"的XML记录
搞定Odoo中noupdate="1"规则的失效问题
嘿,我太懂你遇到的这个麻烦了!Odoo里把记录放在noupdate="1"的<data>标签里时,常规的XML更新操作会直接被忽略,所以要让task_visibility_rule失效,得绕个小弯子分两步来操作:
步骤1:先解锁目标规则的「不可更新」限制
首先得打破原记录的“更新锁”,我们可以在自定义模块的XML里调用ir.model.data的写入方法,把对应记录的noupdate字段改成False,这样后续就能正常修改规则了。
直接上能用的代码:
<odoo> <data> <!-- 找到project模块里task_visibility_rule对应的ir_model_data记录,修改noupdate属性 --> <function model="ir.model.data" name="write"> <function model="ir.model.data" name="search" eval="[('module', '=', 'project'), ('name', '=', 'task_visibility_rule')]"/> <value eval="{'noupdate': False}"/> </function> <!-- 现在可以正常更新规则,把它置为失效状态 --> <record id="project.task_visibility_rule" model="ir.rule"> <field name="active" eval="False"/> </record> </data> </odoo>
步骤2:模块配置的小细节
- 记得在你的自定义模块的
__manifest__.py里,把project加到depends列表里,确保模块加载顺序正确,能找到目标规则。 - 升级自定义模块后,Odoo会先解锁目标规则的不可更新属性,再把它的
active字段设为False,这样就能成功让规则失效了。
备选方案:用Python钩子实现(灵活性更高)
如果你更喜欢用代码控制整个流程,也可以在自定义模块的初始化钩子里面做这件事:
from odoo import api, SUPERUSER_ID def post_init_hook(cr, registry): env = api.Environment(cr, SUPERUSER_ID, {}) # 定位到目标规则的ir_model_data记录 ir_data_rec = env['ir.model.data'].search( [('module', '=', 'project'), ('name', '=', 'task_visibility_rule')], limit=1 ) if ir_data_rec: # 解锁不可更新属性 ir_data_rec.write({'noupdate': False}) # 获取规则记录并置为失效 task_rule = env['ir.rule'].browse(ir_data_rec.res_id) task_rule.write({'active': False}) # 可选:如果担心后续原模块更新覆盖设置,可以改回noupdate=True # ir_data_rec.write({'noupdate': True})
把这段代码放到模块的__init__.py里,升级模块时就会自动执行啦。
内容的提问来源于stack exchange,提问作者forvas
相关产品推荐
相关产品推荐

