Files
2026-06-04 14:24:28 +08:00

93 lines
2.8 KiB
Python

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个快捷菜单!"))