我试图根据登录的不同类型的门户用户来限制菜单(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>
我仍然无法根据用户限制视图,但我有逻辑来检查登录的用户类型。 如果我遗漏了什么,请告诉我?
或者还有其他方法来处理这些视图吗? 基本上都是门户用户。
我可能没有完整的答案,因为我在这个主题上只有 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>