from odoo import models, fields, api, _ from odoo.exceptions import ValidationError class QuickMenuConfig(models.Model): _name = 'quick.menu.config' _description = '快捷菜单配置' _order = 'sequence, id' _sql_constraints = [ ('user_menu_uniq', 'unique(user_id, menu_id)', '同一用户不能重复配置相同的菜单!') ] def _get_next_sequence(self): """获取当前用户的下一个序号(从1开始递增)""" user_id = self.env.user.id max_sequence = self.env['quick.menu.config'].search([ ('user_id', '=', user_id), ('active', '=', True) ], order='sequence desc', limit=1).sequence or 0 return max_sequence + 1 name = fields.Char(string='名称', required=True) user_id = fields.Many2one('res.users', string='用户', required=True, default=lambda self: self.env.user, ondelete='cascade') menu_id = fields.Many2one('ir.ui.menu', string='菜单', required=True, ondelete='cascade', domain=[('action', '!=', False)]) # 只允许选择有action的菜单 sequence = fields.Integer(string='序号', default=lambda self: self._get_next_sequence()) icon = fields.Selection([ ('fa-star', '星星'), ('fa-heart', '心形'), ('fa-user', '用户'), ('fa-cog', '设置'), ('fa-home', '主页'), ('fa-list', '列表'), ('fa-calendar', '日历'), ('fa-envelope', '信封'), ('fa-bell', '铃铛'), ('fa-file', '文件') ], string='图标', required=True, default='fa-star') color = fields.Char(string='颜色', default='#2ECC71', help='菜单项的颜色,可以使用HEX颜色代码,例如 #FF0000 表示红色') active = fields.Boolean(string='启用', default=True) show_title = fields.Boolean(string='默认显示标题', default=False, help='如果勾选,该菜单项的标题将在菜单展开时默认显示,无需鼠标悬停') @api.constrains('menu_id') def _check_menu_count(self): """检查每个用户的快捷菜单数量不超过8个""" for record in self: menu_count = self.search_count([ ('user_id', '=', record.user_id.id), ('active', '=', True), ('id', '!=', record.id) ]) if menu_count >= 8: raise ValidationError(_('每个用户最多只能配置8个快捷菜单!'))