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
相关产品推荐
相关产品推荐

