巧用_filter_access_rule方法实现记录自动过滤
需求背景
我们先来假设一个场景,有一家叫做白日梦科技的公司,它有一个销售员叫云天河,无采购权限。它还有一个采购员叫韩菱纱。这个公司经过二次开发,将关联的采购订单号显示在了销售订单上面:
@api.depends("order_line.purchase_line_ids")
def _compute_purchase_ids(self):
self.purchase_order_ids = [(6,0,self.order_line.purchase_line_ids.order_id.ids)]
purchase_order_ids = fields.Many2many("purchase.order",string="Purchase Orders",compute="_compute_purchase_ids",store=True)
<field name="purchase_order_ids" widget="many2many_tags"/>
有一天,由销售员云天河做的销售订单SO0004,并生成了两个采购订单PO0003和PO0004, PO0003由采购员韩菱纱负责,PO0004由管理员负责。

按系统原生逻辑,因为云天河没有采购权限,因此看不到任何采购订单。当他打开了关联了采购订单的销售订单SO0004时,系统会提示无权限访问。

这时,老板玄霄说,
云天河应该虽然没有采购权限,但他应该能够看到自己订单(SO0004)关联的采购订单。
问,如何实现老板的需求?
使用compute_sudo属性赋权
因为老板允许云天河以关联订单的权限来查看采购订单,那么我们就可以临时给这个查看动作临时提权,从而达到查看的目的。即,我们在上面的计算字段添加compute_sudo属性,即可解决这个问题:
purchase_order_ids = fields.Many2many("purchase.order",string="Purchase Orders",compute="_compute_purchase_ids",compute_sudo=True)