diff --git a/hide_menu_user/models/res_user.py b/hide_menu_user/models/res_user.py index a70a32842..b4ae56a6f 100644 --- a/hide_menu_user/models/res_user.py +++ b/hide_menu_user/models/res_user.py @@ -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) diff --git a/hide_menu_user/security/security.xml b/hide_menu_user/security/security.xml index ad9d5ec3b..48260b8ec 100644 --- a/hide_menu_user/security/security.xml +++ b/hide_menu_user/security/security.xml @@ -6,4 +6,4 @@ [('restrict_user_ids','not in',user.id)] - \ No newline at end of file + diff --git a/hide_menu_user/views/res_users.xml b/hide_menu_user/views/res_users.xml index 831b7f770..37de31b50 100644 --- a/hide_menu_user/views/res_users.xml +++ b/hide_menu_user/views/res_users.xml @@ -33,4 +33,4 @@ - \ No newline at end of file +