|
|
@ -28,41 +28,72 @@ class HideMenuUser(models.Model): |
|
|
|
|
|
|
|
@api.model_create_multi |
|
|
|
def create(self, vals_list): |
|
|
|
""" |
|
|
|
Else the menu will be still hidden even after removing from the list |
|
|
|
""" |
|
|
|
"""Clear caches to ensure menu visibility updates""" |
|
|
|
self.clear_caches() |
|
|
|
return super(HideMenuUser, self).create(vals_list) |
|
|
|
|
|
|
|
def write(self, vals): |
|
|
|
""" |
|
|
|
Else the menu will be still hidden even after removing from the list |
|
|
|
""" |
|
|
|
"""Update menu restrictions and clear caches""" |
|
|
|
res = super(HideMenuUser, self).write(vals) |
|
|
|
for record in self: |
|
|
|
for menu in record.hide_menu_ids: |
|
|
|
menu.write({ |
|
|
|
'restrict_user_ids': [(4, record.id)] |
|
|
|
}) |
|
|
|
if 'hide_menu_ids' in vals: |
|
|
|
for menu in record.hide_menu_ids: |
|
|
|
menu.write({ |
|
|
|
'restrict_user_ids': [(4, record.id)] |
|
|
|
}) |
|
|
|
# Remove user from restrict_user_ids for menus no longer in hide_menu_ids |
|
|
|
menus_to_remove = self.env['ir.ui.menu'].search([ |
|
|
|
('restrict_user_ids', 'in', [record.id]), |
|
|
|
('id', 'not in', record.hide_menu_ids.ids) |
|
|
|
]) |
|
|
|
for menu in menus_to_remove: |
|
|
|
menu.write({ |
|
|
|
'restrict_user_ids': [(3, record.id)] |
|
|
|
}) |
|
|
|
self.clear_caches() |
|
|
|
return res |
|
|
|
def _get_is_admin(self): |
|
|
|
""" |
|
|
|
The Hide specific menu tab will be hidden for the Admin user form. |
|
|
|
Else once the menu is hidden, it will be difficult to re-enable it. |
|
|
|
""" |
|
|
|
|
|
|
|
@api.depends('groups_id') |
|
|
|
def _compute_is_admin(self): |
|
|
|
"""Determine if user is admin to control menu hiding visibility""" |
|
|
|
for rec in self: |
|
|
|
rec.is_admin = False |
|
|
|
if rec.id == self.env.ref('base.user_admin').id: |
|
|
|
rec.is_admin = True |
|
|
|
rec.is_admin = rec.id == self.env.ref('base.user_admin').id or \ |
|
|
|
rec.has_group('base.group_system') |
|
|
|
|
|
|
|
hide_menu_ids = fields.Many2many('ir.ui.menu', string="Menu", store=True, |
|
|
|
help='Select menu items that needs to be ' |
|
|
|
'hidden to this user ') |
|
|
|
is_admin = fields.Boolean(compute=_get_is_admin, string="Admin") |
|
|
|
hide_menu_ids = fields.Many2many( |
|
|
|
'ir.ui.menu', |
|
|
|
string="Hidden Menus", |
|
|
|
store=True, |
|
|
|
help='Select menu items to hide for this user' |
|
|
|
) |
|
|
|
is_admin = fields.Boolean( |
|
|
|
compute='_compute_is_admin', |
|
|
|
string="Is Admin", |
|
|
|
help="Indicates if user has admin privileges" |
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
class RestrictMenu(models.Model): |
|
|
|
_inherit = 'ir.ui.menu' |
|
|
|
|
|
|
|
restrict_user_ids = fields.Many2many('res.users') |
|
|
|
restrict_user_ids = fields.Many2many( |
|
|
|
'res.users', |
|
|
|
string='Restricted Users', |
|
|
|
help='Users for whom this menu is hidden' |
|
|
|
) |
|
|
|
|
|
|
|
@api.model |
|
|
|
def _visible_menu_ids(self, debug=False): |
|
|
|
"""Override to filter out menus restricted for current user""" |
|
|
|
menu_ids = super(RestrictMenu, self)._visible_menu_ids(debug=debug) |
|
|
|
|
|
|
|
# Admin users see all menus |
|
|
|
if self.env.user.has_group('base.group_system'): |
|
|
|
return menu_ids |
|
|
|
|
|
|
|
# Filter out menus where current user is in restrict_user_ids |
|
|
|
restricted_menus = self.search([ |
|
|
|
('id', 'in', list(menu_ids)), |
|
|
|
('restrict_user_ids', 'in', [self.env.user.id]) |
|
|
|
]) |
|
|
|
return set(menu_ids) - set(restricted_menus.ids) |
|
|
|