From e840c9eb3db3407399f55ae00c3fafb1010e722d Mon Sep 17 00:00:00 2001 From: Cybrosys Technologies Date: Tue, 20 May 2025 15:55:32 +0530 Subject: [PATCH] May 20: [FIX] Bug Fixed 'hide_menu_user' --- hide_menu_user/__manifest__.py | 1 - hide_menu_user/models/res_users.py | 38 +++++++++++++++++++++------- hide_menu_user/security/security.xml | 9 ------- 3 files changed, 29 insertions(+), 19 deletions(-) delete mode 100644 hide_menu_user/security/security.xml diff --git a/hide_menu_user/__manifest__.py b/hide_menu_user/__manifest__.py index 690e4664c..030d894cd 100644 --- a/hide_menu_user/__manifest__.py +++ b/hide_menu_user/__manifest__.py @@ -31,7 +31,6 @@ 'website': "https://www.cybrosys.com", 'depends': ['base'], 'data': [ - 'security/security.xml', 'views/res_users_views.xml', ], 'license': 'LGPL-3', diff --git a/hide_menu_user/models/res_users.py b/hide_menu_user/models/res_users.py index 112394fa4..72a7d8293 100644 --- a/hide_menu_user/models/res_users.py +++ b/hide_menu_user/models/res_users.py @@ -19,7 +19,7 @@ # If not, see . # ############################################################################# -from odoo import fields, models +from odoo import fields, models, api class ResUsers(models.Model): @@ -29,16 +29,21 @@ class ResUsers(models.Model): _inherit = 'res.users' def write(self, vals): - """ - Write method for the ResUsers model. - Ensure the menu will not remain hidden after removing it from the list. - """ + # Store old hide_menu_ids per record + old_hide_menu_map = {record.id: record.hide_menu_ids for record in self} res = super(ResUsers, self).write(vals) for record in self: + old_hide_menu_ids = old_hide_menu_map.get(record.id, + self.env['ir.ui.menu']) + + # Add new restrictions for menu in record.hide_menu_ids: - menu.write({ - 'restrict_user_ids': [fields.Command.link(record.id)] - }) + menu.sudo().write({'restrict_user_ids': [(4, record.id)]}) + + # Remove old ones that are no longer selected + removed_menus = old_hide_menu_ids - record.hide_menu_ids + for menu in removed_menus: + menu.sudo().write({'restrict_user_ids': [(3, record.id)]}) return res def _get_is_admin(self): @@ -55,7 +60,7 @@ class ResUsers(models.Model): 'ir.ui.menu', string="Hidden Menu", store=True, help='Select menu items that need to ' 'be hidden to this user.') - is_admin = fields.Boolean(compute=_get_is_admin, string="Is Admin", + is_admin = fields.Boolean(compute='_get_is_admin', string="Is Admin", help='Check if the user is an admin.') @@ -68,3 +73,18 @@ class IrUiMenu(models.Model): restrict_user_ids = fields.Many2many( 'res.users', string="Restricted Users", help='Users restricted from accessing this menu.') + + @api.returns('self') + def _filter_visible_menus(self): + """ + Override to filter out menus restricted for current user. + Applies only to the current user context. + """ + menus = super(IrUiMenu, self)._filter_visible_menus() + + # Allow system admin to see everything + if self.env.user.has_group('base.group_system'): + return menus + + return menus.filtered( + lambda m: self.env.user not in m.restrict_user_ids) diff --git a/hide_menu_user/security/security.xml b/hide_menu_user/security/security.xml deleted file mode 100644 index 3b2e10cf3..000000000 --- a/hide_menu_user/security/security.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - Restrict Menu from Users - - [('restrict_user_ids','not in',user.id)] - -