我的目的
我试图使用安全规则来实现以下目的:
我需要在用户模型中添加一个字段,该字段将设置每个用户可以修改哪些仓库。这是因为我想隐藏您不允许看到的库存变动(其他仓库的库存变动)。
我做了什么
我创建了一个多对多字段命名allowed_warehouses
in res.users
模型。从这里,管理员可以选择每个用户可以使用哪些仓库。
然后,我利用Odoo现有的领域,stock.move
模型有一个Many2one字段命名picking_type_id
, 指向stock.picking.type
模型。和stock.picking.type
模型有一个Many2one字段命名warehouse_id
, 指向stock.warehouse
.
所以这条规则在理论上很简单:
<record model="ir.rule" id="poc_stock_move_allowed_warehouses">
<field name="name">stock.move: interaction only allowed if warehouse matches</field>
<field name="model_id" ref="stock.model_stock_move"/>
<field name="domain_force">[('picking_type_id.warehouse_id', 'in', user.allowed_warehouses.mapped('id'))]</field>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_unlink" eval="True"/>
</record>
有了这条规则,我希望用户只能看到他们允许的仓库的库存变动。
结果
一切都几乎正常,我说几乎是因为一些奇怪的事情正在破坏所有的开发。例如,我可以使用所有仓库,并且我通过一个库存移动创建一个新的拣选,此移动具有产品A。我保存了,一切都很顺利。但如果我做完全相同的事情但选择产品B相反,我在单击后立即出现访问错误Save按钮,所以我再也看不到那个选择的动作了。看来这个举动对我来说是被禁止的(尽管我应该看到它),但事实并非如此!如果我去其他视图中寻找这个动作(例如在可追溯性 > 库存变动菜单),我可以在树视图中看到移动,并打开其表单视图,没有错误!如果我修改 PostgreSQL 中的移动并替换产品B with 产品A,我可以从提货视图中看到移动...当然,如果我删除规则并重新启动服务,我可以在提货视图中看到移动,无论产品是否是A or B.
我的结论
必须有一些字段产品B它正在拍摄我的规则,但我无法理解,因为我的规则不受产品字段的影响,如果是的话,为什么我可以在某些视图中看到移动,而在其他视图中看不到?
拜托,任何人都可以帮我至少提供一个想法吗,我已经没有了!