mirror of https://github.com/veops/cmdb.git
feat(api): custom attribute display (#478)
This commit is contained in:
parent
00b022d620
commit
11dc7a6013
|
@ -92,6 +92,9 @@ class CITypeManager(object):
|
||||||
for type_dict in ci_types:
|
for type_dict in ci_types:
|
||||||
attr = AttributeCache.get(type_dict["unique_id"])
|
attr = AttributeCache.get(type_dict["unique_id"])
|
||||||
type_dict["unique_key"] = attr and attr.name
|
type_dict["unique_key"] = attr and attr.name
|
||||||
|
if type_dict.get('show_id'):
|
||||||
|
attr = AttributeCache.get(type_dict["show_id"])
|
||||||
|
type_dict["show_name"] = attr and attr.name
|
||||||
type_dict['parent_ids'] = CITypeInheritanceManager.get_parents(type_dict['id'])
|
type_dict['parent_ids'] = CITypeInheritanceManager.get_parents(type_dict['id'])
|
||||||
if resources is None or type_dict['name'] in resources:
|
if resources is None or type_dict['name'] in resources:
|
||||||
res.append(type_dict)
|
res.append(type_dict)
|
||||||
|
@ -192,7 +195,7 @@ class CITypeManager(object):
|
||||||
CITypeAttributeManager.update(type_id, [attr])
|
CITypeAttributeManager.update(type_id, [attr])
|
||||||
|
|
||||||
ci_type2 = ci_type.to_dict()
|
ci_type2 = ci_type.to_dict()
|
||||||
new = ci_type.update(**kwargs)
|
new = ci_type.update(**kwargs, filter_none=False)
|
||||||
|
|
||||||
CITypeCache.clean(type_id)
|
CITypeCache.clean(type_id)
|
||||||
|
|
||||||
|
@ -680,6 +683,9 @@ class CITypeAttributeManager(object):
|
||||||
|
|
||||||
CITypeAttributeCache.clean(type_id, attr_id)
|
CITypeAttributeCache.clean(type_id, attr_id)
|
||||||
|
|
||||||
|
if ci_type.show_id == attr_id:
|
||||||
|
ci_type.update(show_id=None, filter_none=False)
|
||||||
|
|
||||||
CITypeHistoryManager.add(CITypeOperateType.DELETE_ATTRIBUTE, type_id, attr_id=attr.id,
|
CITypeHistoryManager.add(CITypeOperateType.DELETE_ATTRIBUTE, type_id, attr_id=attr.id,
|
||||||
change=attr and attr.to_dict())
|
change=attr and attr.to_dict())
|
||||||
|
|
||||||
|
|
|
@ -297,6 +297,9 @@ class PreferenceManager(object):
|
||||||
|
|
||||||
for type_id in id2type:
|
for type_id in id2type:
|
||||||
id2type[type_id] = CITypeCache.get(type_id).to_dict()
|
id2type[type_id] = CITypeCache.get(type_id).to_dict()
|
||||||
|
id2type[type_id]['unique_name'] = AttributeCache.get(id2type[type_id]['unique_id']).name
|
||||||
|
id2type[type_id]['show_name'] = AttributeCache.get(
|
||||||
|
id2type[type_id]['show_id']).name if id2type[type_id]['show_id'] else None
|
||||||
|
|
||||||
return result, id2type, sorted(name2id, key=lambda x: x[1])
|
return result, id2type, sorted(name2id, key=lambda x: x[1])
|
||||||
|
|
||||||
|
|
|
@ -21,6 +21,7 @@ from api.lib.cmdb.resp_format import ErrFormat
|
||||||
from api.lib.cmdb.search.ci.db.search import Search as SearchFromDB
|
from api.lib.cmdb.search.ci.db.search import Search as SearchFromDB
|
||||||
from api.lib.cmdb.search.ci.es.search import Search as SearchFromES
|
from api.lib.cmdb.search.ci.es.search import Search as SearchFromES
|
||||||
from api.lib.cmdb.utils import TableMap
|
from api.lib.cmdb.utils import TableMap
|
||||||
|
from api.lib.cmdb.utils import ValueTypeMap
|
||||||
from api.lib.perm.acl.acl import ACLManager
|
from api.lib.perm.acl.acl import ACLManager
|
||||||
from api.lib.perm.acl.acl import is_app_admin
|
from api.lib.perm.acl.acl import is_app_admin
|
||||||
from api.models.cmdb import CI
|
from api.models.cmdb import CI
|
||||||
|
@ -340,10 +341,21 @@ class Search(object):
|
||||||
def search_full(self, type_ids):
|
def search_full(self, type_ids):
|
||||||
def _get_id2name(_type_id):
|
def _get_id2name(_type_id):
|
||||||
ci_type = CITypeCache.get(_type_id)
|
ci_type = CITypeCache.get(_type_id)
|
||||||
attr = AttributeCache.get(ci_type.show_id) or AttributeCache.get(ci_type.unique_id)
|
|
||||||
value_table = TableMap(attr=attr).table
|
|
||||||
|
|
||||||
return {i.ci_id: i.value for i in value_table.get_by(attr_id=attr.id, to_dict=False)}
|
attr = AttributeCache.get(ci_type.unique_id)
|
||||||
|
value_table = TableMap(attr=attr).table
|
||||||
|
serializer = ValueTypeMap.serialize[attr.value_type]
|
||||||
|
unique_value = {i.ci_id: serializer(i.value) for i in value_table.get_by(attr_id=attr.id, to_dict=False)}
|
||||||
|
|
||||||
|
attr = AttributeCache.get(ci_type.show_id)
|
||||||
|
if attr:
|
||||||
|
value_table = TableMap(attr=attr).table
|
||||||
|
serializer = ValueTypeMap.serialize[attr.value_type]
|
||||||
|
show_value = {i.ci_id: serializer(i.value) for i in value_table.get_by(attr_id=attr.id, to_dict=False)}
|
||||||
|
else:
|
||||||
|
show_value = unique_value
|
||||||
|
|
||||||
|
return show_value, unique_value
|
||||||
|
|
||||||
self.level = int(self.level)
|
self.level = int(self.level)
|
||||||
|
|
||||||
|
@ -365,7 +377,8 @@ class Search(object):
|
||||||
item = dict(id=int(i),
|
item = dict(id=int(i),
|
||||||
type_id=type_ids[0],
|
type_id=type_ids[0],
|
||||||
isLeaf=False,
|
isLeaf=False,
|
||||||
title=id2name.get(int(i)),
|
title=id2name[0].get(int(i)),
|
||||||
|
uniqueValue=id2name[1].get(int(i)),
|
||||||
children=[])
|
children=[])
|
||||||
result.append(item)
|
result.append(item)
|
||||||
id2children[str(i)] = item['children']
|
id2children[str(i)] = item['children']
|
||||||
|
@ -381,25 +394,26 @@ class Search(object):
|
||||||
key, prefix = [i for i in level_ids], REDIS_PREFIX_CI_RELATION2
|
key, prefix = [i for i in level_ids], REDIS_PREFIX_CI_RELATION2
|
||||||
else:
|
else:
|
||||||
key, prefix = [i.split(',')[-1] for i in level_ids], REDIS_PREFIX_CI_RELATION
|
key, prefix = [i.split(',')[-1] for i in level_ids], REDIS_PREFIX_CI_RELATION
|
||||||
|
|
||||||
res = [json.loads(x).items() for x in [i or '{}' for i in rd.get(key, prefix) or []]]
|
res = [json.loads(x).items() for x in [i or '{}' for i in rd.get(key, prefix) or []]]
|
||||||
res = [[i for i in x if (not id_filter_limit or (key[idx] not in id_filter_limit or
|
res = [[i for i in x if (not id_filter_limit or (key[idx] not in id_filter_limit or
|
||||||
int(i[0]) in id_filter_limit[key[idx]]) or
|
int(i[0]) in id_filter_limit[key[idx]]) or
|
||||||
int(i[0]) in id_filter_limit)] for idx, x in enumerate(res)]
|
int(i[0]) in id_filter_limit)] for idx, x in enumerate(res)]
|
||||||
|
|
||||||
_level_ids = []
|
_level_ids = []
|
||||||
type_id = type_ids[lv]
|
type_id = type_ids[lv]
|
||||||
id2name = _get_id2name(type_id)
|
id2name = _get_id2name(type_id)
|
||||||
for idx, _id in enumerate(level_ids):
|
for idx, node_path in enumerate(level_ids):
|
||||||
for child_id, _ in (res[idx] or []):
|
for child_id, _ in (res[idx] or []):
|
||||||
item = dict(id=int(child_id),
|
item = dict(id=int(child_id),
|
||||||
type_id=type_id,
|
type_id=type_id,
|
||||||
isLeaf=True if lv == self.level - 1 else False,
|
isLeaf=True if lv == self.level - 1 else False,
|
||||||
title=id2name.get(int(child_id)),
|
title=id2name[0].get(int(child_id)),
|
||||||
|
uniqueValue=id2name[1].get(int(child_id)),
|
||||||
children=[])
|
children=[])
|
||||||
id2children[_id.split(',')[-1]].append(item)
|
id2children[node_path].append(item)
|
||||||
id2children[child_id] = item['children']
|
|
||||||
_level_ids.append("{},{}".format(_id, child_id))
|
_node_path = "{},{}".format(node_path, child_id)
|
||||||
|
_level_ids.append(_node_path)
|
||||||
|
id2children[_node_path] = item['children']
|
||||||
|
|
||||||
level_ids = _level_ids
|
level_ids = _level_ids
|
||||||
|
|
||||||
|
|
|
@ -46,13 +46,17 @@ class CIType(Model):
|
||||||
name = db.Column(db.String(32), nullable=False)
|
name = db.Column(db.String(32), nullable=False)
|
||||||
alias = db.Column(db.String(32), nullable=False)
|
alias = db.Column(db.String(32), nullable=False)
|
||||||
unique_id = db.Column(db.Integer, db.ForeignKey("c_attributes.id"), nullable=False)
|
unique_id = db.Column(db.Integer, db.ForeignKey("c_attributes.id"), nullable=False)
|
||||||
|
show_id = db.Column(db.Integer, db.ForeignKey("c_attributes.id"))
|
||||||
enabled = db.Column(db.Boolean, default=True, nullable=False)
|
enabled = db.Column(db.Boolean, default=True, nullable=False)
|
||||||
is_attached = db.Column(db.Boolean, default=False, nullable=False)
|
is_attached = db.Column(db.Boolean, default=False, nullable=False)
|
||||||
icon = db.Column(db.Text)
|
icon = db.Column(db.Text)
|
||||||
order = db.Column(db.SmallInteger, default=0, nullable=False)
|
order = db.Column(db.SmallInteger, default=0, nullable=False)
|
||||||
default_order_attr = db.Column(db.String(33))
|
default_order_attr = db.Column(db.String(33))
|
||||||
|
|
||||||
unique_key = db.relationship("Attribute", backref="c_ci_types.unique_id")
|
unique_key = db.relationship("Attribute", backref="c_ci_types.unique_id",
|
||||||
|
primaryjoin="Attribute.id==CIType.unique_id", foreign_keys=[unique_id])
|
||||||
|
show_key = db.relationship("Attribute", backref="c_ci_types.show_id",
|
||||||
|
primaryjoin="Attribute.id==CIType.show_id", foreign_keys=[show_id])
|
||||||
|
|
||||||
uid = db.Column(db.Integer, index=True)
|
uid = db.Column(db.Integer, index=True)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue