mirror of https://github.com/veops/cmdb.git
fix(api): computed attributes for multi values (#577)
This commit is contained in:
parent
daf0254616
commit
d55433c438
|
@ -218,7 +218,7 @@ class CIManager(object):
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def get_ad_statistics(cls):
|
def get_ad_statistics(cls):
|
||||||
return CMDBCounterCache.get_adc_counter()
|
return CMDBCounterCache.get_adc_counter() or {}
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def ci_is_exist(unique_key, unique_value, type_id):
|
def ci_is_exist(unique_key, unique_value, type_id):
|
||||||
|
@ -382,6 +382,7 @@ class CIManager(object):
|
||||||
for _, attr in attrs:
|
for _, attr in attrs:
|
||||||
if attr.is_computed:
|
if attr.is_computed:
|
||||||
computed_attrs.append(attr.to_dict())
|
computed_attrs.append(attr.to_dict())
|
||||||
|
ci_dict[attr.name] = None
|
||||||
elif attr.is_password:
|
elif attr.is_password:
|
||||||
if attr.name in ci_dict:
|
if attr.name in ci_dict:
|
||||||
password_dict[attr.id] = (ci_dict.pop(attr.name), attr.is_dynamic)
|
password_dict[attr.id] = (ci_dict.pop(attr.name), attr.is_dynamic)
|
||||||
|
@ -389,10 +390,7 @@ class CIManager(object):
|
||||||
password_dict[attr.id] = (ci_dict.pop(attr.alias), attr.is_dynamic)
|
password_dict[attr.id] = (ci_dict.pop(attr.alias), attr.is_dynamic)
|
||||||
|
|
||||||
if attr.re_check and password_dict.get(attr.id):
|
if attr.re_check and password_dict.get(attr.id):
|
||||||
value_manager.check_re(attr.re_check, password_dict[attr.id][0])
|
value_manager.check_re(attr.re_check, attr.alias, password_dict[attr.id][0])
|
||||||
|
|
||||||
if computed_attrs:
|
|
||||||
value_manager.handle_ci_compute_attributes(ci_dict, computed_attrs, ci)
|
|
||||||
|
|
||||||
cls._valid_unique_constraint(ci_type.id, ci_dict, ci and ci.id)
|
cls._valid_unique_constraint(ci_type.id, ci_dict, ci and ci.id)
|
||||||
|
|
||||||
|
@ -419,6 +417,9 @@ class CIManager(object):
|
||||||
key2attr = value_manager.valid_attr_value(ci_dict, ci_type.id, ci and ci.id,
|
key2attr = value_manager.valid_attr_value(ci_dict, ci_type.id, ci and ci.id,
|
||||||
ci_type_attrs_name, ci_type_attrs_alias, ci_attr2type_attr)
|
ci_type_attrs_name, ci_type_attrs_alias, ci_attr2type_attr)
|
||||||
|
|
||||||
|
if computed_attrs:
|
||||||
|
value_manager.handle_ci_compute_attributes(ci_dict, computed_attrs, ci)
|
||||||
|
|
||||||
operate_type = OperateType.UPDATE if ci is not None else OperateType.ADD
|
operate_type = OperateType.UPDATE if ci is not None else OperateType.ADD
|
||||||
try:
|
try:
|
||||||
ci = ci or CI.create(type_id=ci_type.id, is_auto_discovery=is_auto_discovery)
|
ci = ci or CI.create(type_id=ci_type.id, is_auto_discovery=is_auto_discovery)
|
||||||
|
@ -464,6 +465,7 @@ class CIManager(object):
|
||||||
for _, attr in attrs:
|
for _, attr in attrs:
|
||||||
if attr.is_computed:
|
if attr.is_computed:
|
||||||
computed_attrs.append(attr.to_dict())
|
computed_attrs.append(attr.to_dict())
|
||||||
|
ci_dict[attr.name] = None
|
||||||
elif attr.is_password:
|
elif attr.is_password:
|
||||||
if attr.name in ci_dict:
|
if attr.name in ci_dict:
|
||||||
password_dict[attr.id] = (ci_dict.pop(attr.name), attr.is_dynamic)
|
password_dict[attr.id] = (ci_dict.pop(attr.name), attr.is_dynamic)
|
||||||
|
@ -471,10 +473,7 @@ class CIManager(object):
|
||||||
password_dict[attr.id] = (ci_dict.pop(attr.alias), attr.is_dynamic)
|
password_dict[attr.id] = (ci_dict.pop(attr.alias), attr.is_dynamic)
|
||||||
|
|
||||||
if attr.re_check and password_dict.get(attr.id):
|
if attr.re_check and password_dict.get(attr.id):
|
||||||
value_manager.check_re(attr.re_check, password_dict[attr.id][0])
|
value_manager.check_re(attr.re_check, attr.alias, password_dict[attr.id][0])
|
||||||
|
|
||||||
if computed_attrs:
|
|
||||||
value_manager.handle_ci_compute_attributes(ci_dict, computed_attrs, ci)
|
|
||||||
|
|
||||||
limit_attrs = self._valid_ci_for_no_read(ci) if not _is_admin else {}
|
limit_attrs = self._valid_ci_for_no_read(ci) if not _is_admin else {}
|
||||||
|
|
||||||
|
@ -487,6 +486,10 @@ class CIManager(object):
|
||||||
ci_dict = {k: v for k, v in ci_dict.items() if k in ci_type_attrs_name}
|
ci_dict = {k: v for k, v in ci_dict.items() if k in ci_type_attrs_name}
|
||||||
key2attr = value_manager.valid_attr_value(ci_dict, ci.type_id, ci.id, ci_type_attrs_name,
|
key2attr = value_manager.valid_attr_value(ci_dict, ci.type_id, ci.id, ci_type_attrs_name,
|
||||||
ci_attr2type_attr=ci_attr2type_attr)
|
ci_attr2type_attr=ci_attr2type_attr)
|
||||||
|
|
||||||
|
if computed_attrs:
|
||||||
|
value_manager.handle_ci_compute_attributes(ci_dict, computed_attrs, ci)
|
||||||
|
|
||||||
if limit_attrs:
|
if limit_attrs:
|
||||||
for k in copy.deepcopy(ci_dict):
|
for k in copy.deepcopy(ci_dict):
|
||||||
if k not in limit_attrs:
|
if k not in limit_attrs:
|
||||||
|
|
|
@ -94,7 +94,7 @@ class AttributeValueManager(object):
|
||||||
except ValueDeserializeError as e:
|
except ValueDeserializeError as e:
|
||||||
return abort(400, ErrFormat.attribute_value_invalid2.format(alias, e))
|
return abort(400, ErrFormat.attribute_value_invalid2.format(alias, e))
|
||||||
except ValueError:
|
except ValueError:
|
||||||
return abort(400, ErrFormat.attribute_value_invalid.format(value))
|
return abort(400, ErrFormat.attribute_value_invalid2.format(alias, value))
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _check_is_choice(attr, value_type, value):
|
def _check_is_choice(attr, value_type, value):
|
||||||
|
@ -123,9 +123,9 @@ class AttributeValueManager(object):
|
||||||
return abort(400, ErrFormat.attribute_value_required.format(attr.alias))
|
return abort(400, ErrFormat.attribute_value_required.format(attr.alias))
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def check_re(expr, value):
|
def check_re(expr, alias, value):
|
||||||
if not re.compile(expr).match(str(value)):
|
if not re.compile(expr).match(str(value)):
|
||||||
return abort(400, ErrFormat.attribute_value_invalid.format(value))
|
return abort(400, ErrFormat.attribute_value_invalid2.format(alias, value))
|
||||||
|
|
||||||
def _validate(self, attr, value, value_table, ci=None, type_id=None, ci_id=None, type_attr=None):
|
def _validate(self, attr, value, value_table, ci=None, type_id=None, ci_id=None, type_attr=None):
|
||||||
ci = ci or {}
|
ci = ci or {}
|
||||||
|
@ -141,7 +141,7 @@ class AttributeValueManager(object):
|
||||||
v = None
|
v = None
|
||||||
|
|
||||||
if attr.re_check and value:
|
if attr.re_check and value:
|
||||||
self.check_re(attr.re_check, value)
|
self.check_re(attr.re_check, attr.alias, value)
|
||||||
|
|
||||||
return v
|
return v
|
||||||
|
|
||||||
|
|
|
@ -579,6 +579,7 @@ class AutoDiscoveryCIType(Model):
|
||||||
|
|
||||||
extra_option = db.Column(db.JSON)
|
extra_option = db.Column(db.JSON)
|
||||||
uid = db.Column(db.Integer, index=True)
|
uid = db.Column(db.Integer, index=True)
|
||||||
|
enabled = db.Column(db.Boolean, default=True)
|
||||||
|
|
||||||
|
|
||||||
class AutoDiscoveryCITypeRelation(Model):
|
class AutoDiscoveryCITypeRelation(Model):
|
||||||
|
|
Loading…
Reference in New Issue