fix(api): computed attributes for multi values (#577)

This commit is contained in:
pycook 2024-07-10 19:18:03 +08:00 committed by GitHub
parent daf0254616
commit d55433c438
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 17 additions and 13 deletions

View File

@ -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:

View File

@ -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

View File

@ -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):