# models/models.py from odoo import models, fields, api, tools, _ from collections import defaultdict class MenuControlUnits(models.Model): _name = 'menu.control.units' _rec_name = 'unit_name' _sql_constraints = [ ('unique_unit_name', 'UNIQUE(unit_name)', "'Unit Name' already defined. Please don't confuse me 😤.") ] unit_name = fields.Char(string='Unit Name',required=True) department_ids = fields.Many2many('hr.department') user_ids = fields.Many2many('res.users') def generate_department_user_ids(self): for rec in self: user_ids = self.env['hr.employee'].sudo().search([('department_id','in',rec.department_ids.ids)]).user_id.ids self.write({ 'user_ids': [(6, 0, user_ids)] }) class MenuAccessControl(models.Model): _name = 'menu.access.control' _description = 'Menu Access Control' _rec_name = 'control_unit' _sql_constraints = [ ('unique_control_unit', 'UNIQUE(control_unit)', "Only one service can exist with a specific control_unit. Please don't confuse me 🤪.") ] control_unit = fields.Many2one('menu.control.units',required=True) user_ids = fields.Many2many('res.users', string="Users", related='control_unit.user_ids') access_menu_line_ids = fields.One2many( 'menu.access.line', 'access_control_id', string="Accessible Menus" ) def action_generate_menus(self): """Button to fetch active top-level menus and populate access lines.""" menu_lines = [] active_menus = self.env['ir.ui.menu'].search([ ('parent_id', '=', False), # top-level menus ('active', '=', True) ]) for menu in active_menus: menu_lines.append((0, 0, { 'menu_id': menu.id, 'is_main_menu': True })) self.access_menu_line_ids = menu_lines class MenuAccessLine(models.Model): _name = 'menu.access.line' _description = 'Menu Access Line' _rec_name = 'menu_id' access_control_id = fields.Many2one('menu.access.control', ondelete='cascade') menu_id = fields.Many2one('ir.ui.menu', string="Menu") is_main_menu = fields.Boolean(string="Is Main Menu", default=True)