93 lines
2.8 KiB
Python
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个快捷菜单!"))
|