ai动态报表
This commit is contained in:
@@ -8,33 +8,13 @@ class IrUiMenu(models.Model):
|
||||
_inherit = 'ir.ui.menu'
|
||||
|
||||
def _get_menu_pinyin(self, name):
|
||||
"""计算菜单名的全拼+首字母,不存库"""
|
||||
"""计算菜单名的全拼+首字母"""
|
||||
if not name:
|
||||
return ''
|
||||
full_pinyin = ''.join(pypinyin.lazy_pinyin(name)).lower()
|
||||
first_letters = ''.join([p[0] for p in pypinyin.pinyin(name)]).lower()
|
||||
return f"{full_pinyin} {first_letters}"
|
||||
|
||||
def _name_has_pinyin(self, name, search_term):
|
||||
"""检查菜单名(含拼音后缀)是否匹配搜索词"""
|
||||
if not name or not search_term:
|
||||
return False
|
||||
name_str = f"{name} [{self._get_menu_pinyin(name)}]".lower()
|
||||
return search_term in name_str
|
||||
|
||||
def load_menus(self, debug):
|
||||
"""重写 load_menus,把拼音拼到菜单名后面,让 Ctrl+K 能搜到"""
|
||||
menus = super().load_menus(debug)
|
||||
for menu_id, menu_data in menus.items():
|
||||
if not isinstance(menu_data, dict) or not menu_data.get('name'):
|
||||
continue
|
||||
name = menu_data['name']
|
||||
pinyin = self._get_menu_pinyin(name)
|
||||
if pinyin:
|
||||
# 格式: "通知公告 [tongzhigonggao tzgg]"
|
||||
menu_data['name'] = f"{name} [{pinyin}]"
|
||||
return menus
|
||||
|
||||
def name_search(self, name='', args=None, operator='ilike', limit=100):
|
||||
"""支持全拼/首字母搜索菜单"""
|
||||
if args is None:
|
||||
@@ -46,6 +26,10 @@ class IrUiMenu(models.Model):
|
||||
if not search_term:
|
||||
return super().name_search(name=name, args=args, operator=operator, limit=limit)
|
||||
|
||||
# 生成搜索词的拼音和首字母
|
||||
search_pinyin = ''.join(pypinyin.lazy_pinyin(search_term)).lower()
|
||||
search_first = ''.join([p[0] for p in pypinyin.pinyin(search_term)]).lower()
|
||||
|
||||
# 原名搜索
|
||||
name_domain = expression.AND([args, [('name', operator, name)]])
|
||||
name_ids = self.search(name_domain, limit=limit).ids
|
||||
@@ -55,8 +39,11 @@ class IrUiMenu(models.Model):
|
||||
pinyin_ids = []
|
||||
for menu in all_menus:
|
||||
if menu.id in name_ids:
|
||||
continue # 已经原名匹配了
|
||||
if self._name_has_pinyin(menu.name, search_term):
|
||||
continue
|
||||
if not menu.name:
|
||||
continue
|
||||
pinyin = self._get_menu_pinyin(menu.name)
|
||||
if search_term in pinyin or search_pinyin in pinyin or search_first in pinyin:
|
||||
pinyin_ids.append(menu.id)
|
||||
|
||||
all_ids = list(dict.fromkeys(name_ids + pinyin_ids))[:limit]
|
||||
|
||||
Reference in New Issue
Block a user