From d55433c438fd15ca4373476f370dbc0308381ddb Mon Sep 17 00:00:00 2001 From: pycook Date: Wed, 10 Jul 2024 19:18:03 +0800 Subject: [PATCH] fix(api): computed attributes for multi values (#577) --- cmdb-api/api/lib/cmdb/ci.py | 21 ++++++++++++--------- cmdb-api/api/lib/cmdb/value.py | 8 ++++---- cmdb-api/api/models/cmdb.py | 1 + 3 files changed, 17 insertions(+), 13 deletions(-) diff --git a/cmdb-api/api/lib/cmdb/ci.py b/cmdb-api/api/lib/cmdb/ci.py index 85f8ddd..9815d88 100644 --- a/cmdb-api/api/lib/cmdb/ci.py +++ b/cmdb-api/api/lib/cmdb/ci.py @@ -218,7 +218,7 @@ class CIManager(object): @classmethod def get_ad_statistics(cls): - return CMDBCounterCache.get_adc_counter() + return CMDBCounterCache.get_adc_counter() or {} @staticmethod def ci_is_exist(unique_key, unique_value, type_id): @@ -382,6 +382,7 @@ class CIManager(object): for _, attr in attrs: if attr.is_computed: computed_attrs.append(attr.to_dict()) + ci_dict[attr.name] = None elif attr.is_password: if attr.name in ci_dict: 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) if attr.re_check and password_dict.get(attr.id): - value_manager.check_re(attr.re_check, password_dict[attr.id][0]) - - if computed_attrs: - value_manager.handle_ci_compute_attributes(ci_dict, computed_attrs, ci) + value_manager.check_re(attr.re_check, attr.alias, password_dict[attr.id][0]) 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, 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 try: 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: if attr.is_computed: computed_attrs.append(attr.to_dict()) + ci_dict[attr.name] = None elif attr.is_password: if attr.name in ci_dict: 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) if attr.re_check and password_dict.get(attr.id): - value_manager.check_re(attr.re_check, password_dict[attr.id][0]) - - if computed_attrs: - value_manager.handle_ci_compute_attributes(ci_dict, computed_attrs, ci) + value_manager.check_re(attr.re_check, attr.alias, password_dict[attr.id][0]) 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} key2attr = value_manager.valid_attr_value(ci_dict, ci.type_id, ci.id, ci_type_attrs_name, ci_attr2type_attr=ci_attr2type_attr) + + if computed_attrs: + value_manager.handle_ci_compute_attributes(ci_dict, computed_attrs, ci) + if limit_attrs: for k in copy.deepcopy(ci_dict): if k not in limit_attrs: diff --git a/cmdb-api/api/lib/cmdb/value.py b/cmdb-api/api/lib/cmdb/value.py index 5276497..b620673 100644 --- a/cmdb-api/api/lib/cmdb/value.py +++ b/cmdb-api/api/lib/cmdb/value.py @@ -94,7 +94,7 @@ class AttributeValueManager(object): except ValueDeserializeError as e: return abort(400, ErrFormat.attribute_value_invalid2.format(alias, e)) except ValueError: - return abort(400, ErrFormat.attribute_value_invalid.format(value)) + return abort(400, ErrFormat.attribute_value_invalid2.format(alias, value)) @staticmethod 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)) @staticmethod - def check_re(expr, value): + def check_re(expr, alias, 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): ci = ci or {} @@ -141,7 +141,7 @@ class AttributeValueManager(object): v = None if attr.re_check and value: - self.check_re(attr.re_check, value) + self.check_re(attr.re_check, attr.alias, value) return v diff --git a/cmdb-api/api/models/cmdb.py b/cmdb-api/api/models/cmdb.py index 7673a12..5ecbee5 100644 --- a/cmdb-api/api/models/cmdb.py +++ b/cmdb-api/api/models/cmdb.py @@ -579,6 +579,7 @@ class AutoDiscoveryCIType(Model): extra_option = db.Column(db.JSON) uid = db.Column(db.Integer, index=True) + enabled = db.Column(db.Boolean, default=True) class AutoDiscoveryCITypeRelation(Model):