mirror of https://github.com/veops/cmdb.git
fix(api): multi-line search
This commit is contained in:
parent
d0129439cd
commit
b253fdfea0
|
@ -1145,13 +1145,14 @@ class CITypeAttributeGroupManager(object):
|
||||||
else:
|
else:
|
||||||
group_pos = group2pos[group['name']]
|
group_pos = group2pos[group['name']]
|
||||||
|
|
||||||
attr = None
|
|
||||||
for i in items:
|
for i in items:
|
||||||
if i.attr_id in id2attr:
|
if i.attr_id in id2attr:
|
||||||
attr = id2attr[i.attr_id]
|
attr = id2attr[i.attr_id]
|
||||||
attr['inherited'] = group['inherited']
|
attr['inherited'] = group['inherited']
|
||||||
attr['inherited_from'] = group.get('inherited_from')
|
attr['inherited_from'] = group.get('inherited_from')
|
||||||
result[group_pos]['attributes'].append(attr)
|
result[group_pos]['attributes'].append(attr)
|
||||||
|
else:
|
||||||
|
continue
|
||||||
|
|
||||||
if i.attr_id in attr2pos:
|
if i.attr_id in attr2pos:
|
||||||
result[attr2pos[i.attr_id][0]]['attributes'].remove(attr2pos[i.attr_id][1])
|
result[attr2pos[i.attr_id][0]]['attributes'].remove(attr2pos[i.attr_id][1])
|
||||||
|
|
|
@ -43,7 +43,7 @@ class ScanHistoryManager(DBMixin):
|
||||||
|
|
||||||
if kwargs.get('ips'):
|
if kwargs.get('ips'):
|
||||||
from api.lib.cmdb.ipam.address import IpAddressManager
|
from api.lib.cmdb.ipam.address import IpAddressManager
|
||||||
IpAddressManager().assign_ips(kwargs['ips'], None, kwargs.get('cidr'),
|
IpAddressManager().assign_ips(kwargs['ips'], ci_id, kwargs.get('cidr'),
|
||||||
**{IPAddressBuiltinAttributes.IS_USED: 1})
|
**{IPAddressBuiltinAttributes.IS_USED: 1})
|
||||||
|
|
||||||
scan_rule = IPAMSubnetScan.get_by(ci_id=ci_id, first=True, to_dict=False)
|
scan_rule = IPAMSubnetScan.get_by(ci_id=ci_id, first=True, to_dict=False)
|
||||||
|
|
|
@ -142,7 +142,7 @@ class Search(object):
|
||||||
if str(ci_type.id) in self.type_id_list:
|
if str(ci_type.id) in self.type_id_list:
|
||||||
self.type_id_list.remove(str(ci_type.id))
|
self.type_id_list.remove(str(ci_type.id))
|
||||||
type_id_list.remove(str(ci_type.id))
|
type_id_list.remove(str(ci_type.id))
|
||||||
sub.extend([i for i in queries[1:] if isinstance(i, six.string_types)])
|
sub.extend([i for i in queries[1:] if isinstance(i, (six.string_types, list))])
|
||||||
|
|
||||||
sub.insert(0, "_type:{}".format(ci_type.id))
|
sub.insert(0, "_type:{}".format(ci_type.id))
|
||||||
queries.append(dict(operator="|", queries=sub))
|
queries.append(dict(operator="|", queries=sub))
|
||||||
|
@ -434,11 +434,14 @@ class Search(object):
|
||||||
if not q.startswith("("):
|
if not q.startswith("("):
|
||||||
raise SearchError(ErrFormat.ci_search_Parentheses_invalid)
|
raise SearchError(ErrFormat.ci_search_Parentheses_invalid)
|
||||||
|
|
||||||
operator, q = self._operator_proc(q)
|
if ":" not in q: # multi-line search
|
||||||
if q.endswith(")"):
|
result.append(q[1:-1].split(';'))
|
||||||
result.append(dict(operator=operator, queries=[q[1:-1]]))
|
else:
|
||||||
|
operator, q = self._operator_proc(q)
|
||||||
|
if q.endswith(")"):
|
||||||
|
result.append(dict(operator=operator, queries=[q[1:-1]]))
|
||||||
|
|
||||||
sub = dict(operator=operator, queries=[q[1:]])
|
sub = dict(operator=operator, queries=[q[1:]])
|
||||||
elif q.endswith(")") and sub:
|
elif q.endswith(")") and sub:
|
||||||
sub['queries'].append(q[:-1])
|
sub['queries'].append(q[:-1])
|
||||||
result.append(copy.deepcopy(sub))
|
result.append(copy.deepcopy(sub))
|
||||||
|
@ -526,16 +529,17 @@ class Search(object):
|
||||||
query_sql = ""
|
query_sql = ""
|
||||||
|
|
||||||
for q in queries:
|
for q in queries:
|
||||||
|
# current_app.logger.debug(q)
|
||||||
_query_sql = ""
|
_query_sql = ""
|
||||||
if isinstance(q, dict):
|
if isinstance(q, dict):
|
||||||
current_app.logger.debug("Dict query content: queries=%s, operator=%s", q['queries'], q['operator'])
|
|
||||||
if len(q['queries']) == 1 and ";" in q['queries'][0]:
|
if len(q['queries']) == 1 and ";" in q['queries'][0]:
|
||||||
values = q['queries'][0].split(";")
|
values = q['queries'][0].split(";")
|
||||||
in_values = ",".join("'{0}'".format(v) for v in values)
|
in_values = ",".join("'{0}'".format(v) for v in values)
|
||||||
_query_sql = QUERY_CI_BY_NO_ATTR_IN.format(in_values, alias)
|
_query_sql = QUERY_CI_BY_NO_ATTR_IN.format(in_values, alias)
|
||||||
operator = q['operator']
|
operator = q['operator']
|
||||||
else:
|
else:
|
||||||
alias, _query_sql, operator = self.__query_build_by_field(q['queries'], True, True, alias, is_sub=True)
|
alias, _query_sql, operator = self.__query_build_by_field(q['queries'], True, True, alias,
|
||||||
|
is_sub=True)
|
||||||
operator = q['operator']
|
operator = q['operator']
|
||||||
|
|
||||||
elif ":" in q and not q.startswith("*"):
|
elif ":" in q and not q.startswith("*"):
|
||||||
|
@ -543,10 +547,13 @@ class Search(object):
|
||||||
elif q == "*":
|
elif q == "*":
|
||||||
continue
|
continue
|
||||||
elif q:
|
elif q:
|
||||||
q = q.replace("'", "\\'")
|
if not isinstance(q, list):
|
||||||
q = q.replace('"', '\\"')
|
q = q.replace("'", "\\'")
|
||||||
q = q.replace("*", "%").replace('\\n', '%')
|
q = q.replace('"', '\\"')
|
||||||
_query_sql = QUERY_CI_BY_NO_ATTR.format(q, alias)
|
q = q.replace("*", "%").replace('\\n', '%')
|
||||||
|
_query_sql = QUERY_CI_BY_NO_ATTR.format(q, alias)
|
||||||
|
else:
|
||||||
|
_query_sql = QUERY_CI_BY_NO_ATTR_IN.format(",".join("'{0}'".format(v) for v in q), alias)
|
||||||
|
|
||||||
if is_first and _query_sql and not self.only_type_query:
|
if is_first and _query_sql and not self.only_type_query:
|
||||||
query_sql = "SELECT * FROM ({0}) AS {1}".format(_query_sql, alias)
|
query_sql = "SELECT * FROM ({0}) AS {1}".format(_query_sql, alias)
|
||||||
|
|
Loading…
Reference in New Issue