You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 23:36:04