Files
gzth/app_web_widget_ztree/models/models.py
T
2025-04-05 17:11:33 +08:00

134 lines
4.9 KiB
Python

# -*- coding: utf-8 -*-
from odoo import models, api
class BaseModelExtend(models.AbstractModel):
_name = 'basemodel.extend'
_description = 'Base Extend for Ztree'
def _register_hook(self):
"""
Register method in BaseModel
type: bar是在superbar中,field是在form中
"""
# name_field 显示的字段
# type = chart 时,只取自己这棵树,使用 parent_path 处理
@api.model
def search_ztree(self, domain=None, context=None, parent_key=None, root_id=None, expend_level=None, name_field=None, limit=None, order=None, type=None,
selected_id=None):
if context:
self = self.with_context
try:
limit = int(limit)
except Exception:
limit = 1000
if not limit:
limit = 1000
if not order:
order = self._order
try:
expend_level = int(expend_level)
if expend_level == 0:
expend_level = 3
except Exception:
expend_level = 3
if name_field:
pass
elif self._fields.get("name"):
name_field = 'name'
elif self._fields.get("display_name"):
name_field = 'display_name'
else:
name_field = self._rec_name
if name_field == 'display_name':
fields = ['id', 'display_name']
else:
fields = ['id', name_field, 'display_name']
# 返回 id, name, value, pId, title, value
def ztree(x):
y = {}
p = parent_key
pid = False
if p and x.get(p):
pid = x[p]
if pid:
pid = pid[0]
y['id'] = x['id']
if x.get(name_field):
y['name'] = x[name_field]
else:
y['name'] = x['display_name']
y['value'] = x[name_field]
y['title'] = x['display_name']
y['pId'] = pid
return y
# 递归展开指定级别,即设定open
def getLevel(node, nodes, level=1):
if not node.get("pId"):
level = 1
else:
try:
level = level + getLevel(nodes[node.get("pId")], nodes)
except Exception:
level = 1
return level
# todo: 检查 root_id 的处理
if not parent_key:
parent_key = self._parent_name or False
if parent_key:
fields.append(parent_key)
if root_id:
r = self.search_read([('id', '=', root_id)], ['parent_path'], limit=1)
path = r[0]['parent_path']
domain += [('parent_path', '=like', path + '%')]
# type=chart时 遍历只取本棵树
elif type == 'chart' and not selected_id:
# 没有当前值,比如创建时,显示空
domain += [('id', '=', False)]
elif type == 'chart' and not self._fields.get("parent_path"):
# 没有parent_path,只显示当前
domain += [('id', '=', selected_id)]
elif type == 'chart' and selected_id:
r = self.search_read([('id', '=', selected_id)], ['parent_path'], limit=1)
if r:
path = r[0]['parent_path']
pos = path.find('/')
if pos > 0:
path = path[0:pos + 1]
domain += [('parent_path', '=like', path + '%')]
else:
domain += [('id', '=', selected_id)]
records = self.search_read(domain or [], fields, 0, limit=limit, order=order)
if not records:
return []
result = records
res = map(ztree, result)
if len(result) < 1:
return result
# reorder read, index: dict, res: list
index = {vals['id']: vals for vals in res}
for key in index:
index[key]["ztree_link"] = '/mail/view?model=%s&res_id=%s' % (self._name, index[key]["id"]),
index[key]["level"] = getLevel(index[key], index, 1)
if index[key]["level"] < expend_level:
index[key]["open"] = True
else:
index[key]["open"] = False
res = [index[record["id"]] for record in records if record["id"] in index]
return res
models.BaseModel.search_ztree = search_ztree
return super(BaseModelExtend, self)._register_hook()