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

Odoo智能按钮权限配置:伙伴表单非客服用户访问异常处理

解决Odoo伙伴表单智能按钮权限问题

问题原因

非客服用户打开伙伴表单触发访问错误,是因为他们没有权限访问helpdesk.ticket模型相关的统计字段(helpdesk_ticket_count)或动作方法(action_view_helpdesk_tickets),但视图默认会加载所有字段,导致权限校验失败。

解决方案

通过权限组控制可见性,让智能按钮仅对客服用户可见,同时避免非授权用户加载敏感字段/方法:

1. 修改视图代码,添加权限组控制

给按钮和统计字段加上groups属性,绑定到Odoo客服模块的默认权限组:

<odoo>
    <data>
        <record id="helpdesk_ticket_smart_button" model="ir.ui.view">
            <field name="name">partner.helpdesk.ticket.smart.buttons</field>
            <field name="model">res.partner</field>
            <field name="inherit_id" ref="base.view_partner_form" />
            <field name="arch" type="xml">
                <div name="button_box" position="inside">
                    <!-- 仅客服用户/管理员可见按钮 -->
                    <button 
                        class="oe_stat_button" 
                        type="object" 
                        name="action_view_helpdesk_tickets" 
                        icon="fa-ticket"
                        groups="helpdesk.group_helpdesk_user,helpdesk.group_helpdesk_manager"
                    >
                        <!-- 统计字段同样绑定权限组 -->
                        <field 
                            string="Tickets" 
                            name="helpdesk_ticket_count" 
                            widget="statinfo"
                            groups="helpdesk.group_helpdesk_user,helpdesk.group_helpdesk_manager"
                        />
                    </button>
                </div>
            </field>
        </record>
    </data>
</odoo>

2. 模型层补充权限控制

在res.partner模型的计算字段定义中,同样添加groups属性,确保非授权用户不会加载该字段:

from odoo import fields, models, _
from odoo.exceptions import AccessError

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

    helpdesk_ticket_count = fields.Integer(
        compute='_compute_helpdesk_ticket_count',
        # 绑定客服权限组
        groups='helpdesk.group_helpdesk_user,helpdesk.group_helpdesk_manager'
    )

    def _compute_helpdesk_ticket_count(self):
        for partner in self:
            partner.helpdesk_ticket_count = self.env['helpdesk.ticket'].search_count(
                [('partner_id', '=', partner.id)]
            )

    def action_view_helpdesk_tickets(self):
        self.ensure_one()
        # 额外添加权限校验,防止绕过视图限制
        if not self.env['helpdesk.ticket'].check_access_rights('read', raise_exception=False):
            raise AccessError(_("您没有访问客服工单的权限。"))
        return {
            'name': _('客服工单'),
            'type': 'ir.actions.act_window',
            'res_model': 'helpdesk.ticket',
            'view_mode': 'tree,form',
            'domain': [('partner_id', '=', self.id)],
            'context': {'default_partner_id': self.id}
        }

3. 权限组说明

  • helpdesk.group_helpdesk_user:普通客服用户组
  • helpdesk.group_helpdesk_manager:客服管理员组

如果使用自定义的客服权限组,替换成对应的组外部ID即可。

效果

修改后:

  • 非客服用户打开伙伴表单时,不会加载该智能按钮及统计字段,避免权限错误
  • 仅拥有客服权限组的用户能看到并使用智能按钮,正常访问对应工单

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 13:41:01