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

Odoo 17按经销商分类标签限制用户查看产品及合作伙伴

Odoo 经销商标签权限控制实现方案

需求说明

仅允许用户查看与其拥有至少一个共同dealer_category_ids标签的产品及合作伙伴,即用户与产品/合作伙伴存在共同标签时才可查看。

现有基础代码

from odoo import api, fields, models

class ResUser(models.Model):
    _inherit = 'res.users'

    dealer_category_ids = fields.Many2many(
        string="Dealer Category Tags",
        comodel_name='rgb.dealer.category',
        relation='user_tag_rgb_dealer_category_rel',
    )

class ProductTemplate(models.Model):
    _inherit = 'product.template'

    dealer_category_ids = fields.Many2many(
        string="Dealer Category Tags",
        comodel_name='rgb.dealer.category',
        relation='product_tag_rgb_dealer_category_rel',
    )

class ResPartner(models.Model):
    _inherit = 'res.partner'

    dealer_category_ids = fields.Many2many(
        string="Dealer Category Tags",
        comodel_name='rgb.dealer.category',
        relation='partner_tag_rgb_dealer_category_rel',
    )

权限控制实现方案

推荐使用Odoo的记录规则(Record Rules)实现,符合官方权限体系,具体代码如下:

1. 产品模板权限控制

在product.template继承类中添加记录规则逻辑:

class ProductTemplate(models.Model):
    _inherit = 'product.template'

    # 保留原有字段定义
    dealer_category_ids = fields.Many2many(
        string="Dealer Category Tags",
        comodel_name='rgb.dealer.category',
        relation='product_tag_rgb_dealer_category_rel',
    )

    @api.model
    def _get_dealer_category_domain(self):
        current_user = self.env.user
        # 系统管理员不受权限限制
        if current_user.has_group('base.group_system'):
            return []
        user_tag_ids = current_user.dealer_category_ids.ids
        # 无标签用户无法查看任何产品(可根据需求调整)
        if not user_tag_ids:
            return [('id', '=', False)]
        # 匹配拥有共同标签的产品
        return [('dealer_category_ids', 'in', user_tag_ids)]

    def init(self):
        # 创建或更新记录规则
        rule = self.env['ir.rule'].search([
            ('name', '=', 'Product Template: Only view with shared dealer category'),
            ('model_id', '=', self.env.ref('product.model_product_template').id),
        ])
        domain_str = str(self._get_dealer_category_domain())
        if rule:
            rule.write({'domain_force': domain_str})
        else:
            self.env['ir.rule'].create({
                'name': 'Product Template: Only view with shared dealer category',
                'model_id': self.env.ref('product.model_product_template').id,
                'domain_force': domain_str,
                'groups': [(6, 0, self.env.ref('base.group_user').ids)],
            })

2. 合作伙伴权限控制

在res.partner继承类中添加对应逻辑:

class ResPartner(models.Model):
    _inherit = 'res.partner'

    # 保留原有字段定义
    dealer_category_ids = fields.Many2many(
        string="Dealer Category Tags",
        comodel_name='rgb.dealer.category',
        relation='partner_tag_rgb_dealer_category_rel',
    )

    @api.model
    def _get_dealer_category_domain(self):
        current_user = self.env.user
        # 系统管理员不受权限限制
        if current_user.has_group('base.group_system'):
            return []
        user_tag_ids = current_user.dealer_category_ids.ids
        # 无标签用户无法查看任何合作伙伴(可根据需求调整)
        if not user_tag_ids:
            return [('id', '=', False)]
        # 匹配拥有共同标签的合作伙伴
        return [('dealer_category_ids', 'in', user_tag_ids)]

    def init(self):
        # 创建或更新记录规则
        rule = self.env['ir.rule'].search([
            ('name', '=', 'Res Partner: Only view with shared dealer category'),
            ('model_id', '=', self.env.ref('base.model_res_partner').id),
        ])
        domain_str = str(self._get_dealer_category_domain())
        if rule:
            rule.write({'domain_force': domain_str})
        else:
            self.env['ir.rule'].create({
                'name': 'Res Partner: Only view with shared dealer category',
                'model_id': self.env.ref('base.model_res_partner').id,
                'domain_force': domain_str,
                'groups': [(6, 0, self.env.ref('base.group_user').ids)],
            })

关键说明

  • 系统管理员不受此规则限制,可查看所有数据;
  • 无标签用户默认无法查看任何产品/合作伙伴,若需调整可修改_get_dealer_category_domain方法中的空标签逻辑;
  • 规则自动应用于所有base.group_user组用户,确保权限控制覆盖普通用户。

内容的提问来源于stack exchange,提问作者Ragab Mahmoud

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 20:48:26