diff --git a/cmdb-api/api/lib/cmdb/attribute.py b/cmdb-api/api/lib/cmdb/attribute.py index 1380f14..20f4091 100644 --- a/cmdb-api/api/lib/cmdb/attribute.py +++ b/cmdb-api/api/lib/cmdb/attribute.py @@ -336,9 +336,6 @@ class AttributeManager(object): def update(self, _id, **kwargs): attr = Attribute.get_by_id(_id) or abort(404, ErrFormat.attribute_not_found.format("id={}".format(_id))) - if not self._can_edit_attribute(attr): - return abort(403, ErrFormat.cannot_edit_attribute) - if kwargs.get("name"): other = Attribute.get_by(name=kwargs['name'], first=True, to_dict=False) if other and other.id != attr.id: @@ -379,6 +376,14 @@ class AttributeManager(object): kwargs.get('is_computed') and self.can_create_computed_attribute() + is_changed = False + for k in kwargs: + if kwargs[k] != getattr(attr, k, None): + is_changed = True + + if is_changed and not self._can_edit_attribute(attr): + return abort(403, ErrFormat.cannot_edit_attribute) + attr.update(flush=True, filter_none=False, **kwargs) if is_choice and choice_value: diff --git a/cmdb-api/api/lib/cmdb/ci.py b/cmdb-api/api/lib/cmdb/ci.py index 9920930..4e8b9ad 100644 --- a/cmdb-api/api/lib/cmdb/ci.py +++ b/cmdb-api/api/lib/cmdb/ci.py @@ -45,8 +45,8 @@ from api.lib.perm.acl.acl import is_app_admin from api.lib.perm.acl.acl import validate_permission from api.lib.secrets.inner import InnerCrypt from api.lib.secrets.vault import VaultClient -from api.lib.utils import handle_arg_list from api.lib.utils import Lock +from api.lib.utils import handle_arg_list from api.lib.webhook import webhook_request from api.models.cmdb import AttributeHistory from api.models.cmdb import AutoDiscoveryCI @@ -639,6 +639,9 @@ class CIManager(object): _fields.append(str(attr.id)) filter_fields_sql = "WHERE A.attr_id in ({0})".format(",".join(_fields)) + ci2pos = {int(_id): _pos for _pos, _id in enumerate(ci_ids)} + res = [None] * len(ci_ids) + ci_ids = ",".join(map(str, ci_ids)) if value_tables is None: value_tables = ValueTypeMap.table_name.values() @@ -649,7 +652,6 @@ class CIManager(object): # current_app.logger.debug(query_sql) cis = db.session.execute(query_sql).fetchall() ci_set = set() - res = list() ci_dict = dict() unique_id2obj = dict() excludes = excludes and set(excludes) @@ -669,7 +671,7 @@ class CIManager(object): ci_dict["unique"] = unique_id2obj[ci_type.unique_id] and unique_id2obj[ci_type.unique_id].name ci_dict["unique_alias"] = unique_id2obj[ci_type.unique_id] and unique_id2obj[ci_type.unique_id].alias ci_set.add(ci_id) - res.append(ci_dict) + res[ci2pos[ci_id]] = ci_dict if ret_key == RetKey.NAME: attr_key = attr_name