from odoo import models, fields, api, _ from odoo.exceptions import ValidationError class QuickMenuConfig(models.Model): _name = "quick.menu.config" _description = "Quick Menu Configuration" _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个快捷菜单!"))