Odoo14如何基于用户默认公司更新res users表单并控制权限组可见性
Odoo14 根据用户默认公司动态过滤权限组的实现方案
以下方案可实现用户表单权限组按所属公司动态显示、切换公司时自动刷新权限可选范围的需求:
步骤1:扩展权限基础模型,新增可见公司配置字段
首先需要给权限组分类、权限组两个模型新增「允许可见的公司」字段,用于管理员后台配置对应权限的可见范围:
from odoo import models, fields class ResGroupsCategory(models.Model): _inherit = 'res.groups.category' allowed_company_ids = fields.Many2many( 'res.company', string='允许可见的公司', help='仅选中的公司下的用户可以看到该权限分类' ) class ResGroups(models.Model): _inherit = 'res.groups' allowed_company_ids = fields.Many2many( 'res.company', string='允许可见的公司', help='仅选中的公司下的用户可以看到该权限组' )
同时可以在对应模型的表单视图中添加该字段的编辑入口,方便管理员配置权限的可见范围。
步骤2:继承用户模型,实现动态过滤逻辑
继承res.users模型,添加company_id变更的触发逻辑,动态过滤可选的权限组范围:
class ResUsers(models.Model): _inherit = 'res.users' @api.onchange('company_id') def _onchange_company_id_filter_groups(self): # 超级用户跳过过滤逻辑,避免丢失全量权限配置能力 if self.env.user.id == 1: return {'domain': {'groups_id': []}} # 过滤当前公司允许可见的权限组,空值默认全公司可见 allowed_groups = self.env['res.groups'].search([ '|', ('allowed_company_ids', '=', False), ('allowed_company_ids', 'in', self.company_id.id) ]) return {'domain': {'groups_id': [('id', 'in', allowed_groups.ids)]}}
步骤3:修改用户表单视图,隐藏未授权的权限分类
在用户表单的视图继承中,给权限分类的渲染节点添加动态隐藏属性:
<odoo> <record id="view_users_form_inherit_company_filter" model="ir.ui.view"> <field name="name">res.users.form.inherit.company.filter</field> <field name="model">res.users</field> <field name="inherit_id" ref="base.view_users_form"/> <field name="arch" type="xml"> <xpath expr="//div[hasclass('o_groups_category')]" position="attributes"> <attribute name="attrs"> {'invisible': [ '&', ('category_id.allowed_company_ids', '!=', False), ('category_id.allowed_company_ids', 'not in', [company_id]) ]} </attribute> </xpath> </field> </record> </odoo>
注意事项
- 多公司场景下如果需要同时适配用户所属的所有公司(
company_ids),可修改过滤逻辑中的判断条件,将self.company_id替换为self.company_ids即可 - 所有代码修改完成后升级对应自定义模块即可生效
内容的提问来源于stack exchange,提问作者Thayif kabir
相关产品推荐
相关产品推荐

