58 lines
2.5 KiB
Python
58 lines
2.5 KiB
Python
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个快捷菜单!'))
|