Odoo如何让计算字段继承依赖模型的权限?
实现res.partner计算字段权限继承account.move的方法
要让res.partner里的something计算字段继承account.move的权限,核心是把字段权限和account.move的权限体系绑定,下面是两种实用方案:
方案1:直接绑定account.move的权限组
Odoo字段支持通过groups参数指定能访问该字段的权限组,直接复用account.move对应的核心权限组即可。
首先确认account.move的关键权限组,通常是account.group_account_user(普通会计用户组)或account.group_account_manager(会计经理组),然后给字段加上这个参数:
class ResPartner(models.Model): _inherit = "res.partner" something = fields.Float( 'Something', compute="_compute_something", groups="account.group_account_user" # 绑定account.move的权限组 ) def _compute_something(self): for record in self: moves = self.env['account.move'].search([('partner_id', '=', record.id)]) record.something = sum(moves.mapped('amount_total')) # 示例计算逻辑,可替换成你的代码
这样只有拥有account.move访问权限的用户,才能看到something字段,和account.move的权限保持同步。
方案2:在计算逻辑里主动校验权限
如果需要更细粒度的控制——比如用户能看到partner记录,但没有account.move权限就看不到该字段的计算值,可以在计算方法里主动检查权限:
from odoo.exceptions import AccessError class ResPartner(models.Model): _inherit = "res.partner" something = fields.Float('Something', compute="_compute_something") def _compute_something(self): # 检查当前用户是否有account.move的读取权限 if not self.env['account.move'].check_access_rights('read', raise_exception=False): # 无权限时给默认值,也可以抛出AccessError提示无权限 for record in self: record.something = 0.0 return # 有权限时执行原计算逻辑 for record in self: moves = self.env['account.move'].search(...) # 你的原查询代码 # 补充你的计算逻辑
这种方式下,字段对所有用户可见,但没有account.move权限的用户只能看到默认值,更贴合“字段依赖account.move所以权限继承”的需求。
注意点
- 方案1是从字段可见性层面控制,无权限用户看不到字段;方案2是字段可见但值被限制,根据业务场景选。
- 不确定
account.move的权限组时,可在Odoo后台「设置-用户与公司-权限组」里查看会计模块的权限配置。
内容的提问来源于stack exchange,提问作者David Côté-Tremblay
相关产品推荐
相关产品推荐

