如何限制不同类型门户用户(例如员工和家长)的菜单 (website.menu) 访问权限?

问题描述 投票:0回答:1

我试图根据登录的不同类型的门户用户来限制菜单(website.menu),

我尝试从基础继承计算可见性函数,如下所示:

class WebsiteMenu(models.Model):
_inherit = 'website.menu'

restricted = fields.Boolean(string='Restricted', default=False)
parent_menu = fields.Boolean(string='Parent Menu', default=False)
employee_menu = fields.Boolean(string='Employee Menu', default=False)
manager_menu = fields.Boolean(string='Manager Menu', default=False)
need_request_menu = fields.Boolean(string='Need Request Menu', default=False)

def _compute_visible(self):
    """Compute menu visibility"""
    super()._compute_visible()
    for menu in self:
        if not menu.is_visible:
            continue
        employee_id = self.env.user.employee_id or self.env.user.existing_employee_id
        is_user_or_portal = self.env.user.has_group('base.group_user') or self.env.user.has_group(
            'base.group_portal')
        if menu.employee_menu or menu.manager_menu:
            if not employee_id or not is_user_or_portal:
                menu.is_visible = False
                continue
        if menu.manager_menu and employee_id:
            employees = self.env['hr.employee'].sudo().search([('parent_id', '=', employee_id.id)])
            if not employees:
                menu.is_visible = False
                continue
        if menu.need_request_menu and employee_id:
            if not employee_id.need_request:
                menu.is_visible = False
                continue
        is_parent = self.env.user.parent_id
        if menu.parent_menu and not (is_user_or_portal and is_parent):
            menu.is_visible = False
            continue

视图.xml

<record id="parent_payment_menu" model="website.menu">
    <field name="name">Payments</field>
    <field name="url">my/payments</field>
    <field name="parent_id" ref="website.main_menu"/>
    <field name="sequence" type="int">60</field>
    <field name="parent_menu" eval="True"/>
</record>
<record id="leave_main_menu" model="website.menu">
        <field name="name">My Leave Management</field>
        <field name="parent_id" ref="website.main_menu"/>
        <field name="sequence" type="int">50</field>
        <field name="employee_menu" eval="True"/>
    </record>
    <record id="manager_attendances_menu" model="website.menu">
        <field name="name">Employee's Attendances</field>
        <field name="url">manager/employee_attendances</field>
        <field name="parent_id" ref="website.main_menu"/>
        <field name="sequence" type="int">51</field>
        <field name="manager_menu" eval="True"/>
    </record>
        <record id="need_request_main_menu" model="website.menu">
        <field name="name">Need Requests</field>
        <field name="parent_id" ref="website.main_menu"/>
        <field name="sequence" type="int">50</field>
        <field name="need_request_menu" eval="True"/>
    </record>

我仍然无法根据用户限制视图,但我有逻辑来检查登录的用户类型。 如果我遗漏了什么,请告诉我?

或者还有其他方法来处理这些视图吗? 基本上都是门户用户。

odoo odoo-17
1个回答
0
投票

我可能没有完整的答案,因为我在这个主题上只有 Odoo16 的经验。 除了像你一样重写方法之外,在 v16 中还需要通过继承 website.layout 并删除 t-cache 属性来禁用菜单的缓存。 (参见下面的代码块)

似乎在 Odoo17 中这个问题已经得到解决,但不完全是你想要的方式: https://github.com/odoo/odoo/blob/17.0/addons/website/views/website_templates.xml#L160

网站模型中有一个函数,可以检查菜单缓存是否可行: https://github.com/odoo/odoo/blob/17.0/addons/website/models/website.py#L193C9-L193C31

从评论中可以看出,此检查与网站的 URL 以及是否链接到记录有关(在这种情况下,缓存被禁用)。

您可以继承网站模型,覆盖此方法并始终返回 True。 或者,您继承 website.layout 并删除 t-cache 属性(就像我在 v16 中所做的那样)。

<template id="website_layout_menu_no_cache" inherit_id="website.layout" name="No cache on website layer header">
    <xpath expr="//header/t[@t-cache]" position="attributes">
        <attribute name="t-cache"/>
    </xpath>
</template>
© www.soinside.com 2019 - 2024. All rights reserved.