From 0263842b700f5ba68fbaf337d53166d710868033 Mon Sep 17 00:00:00 2001 From: pycook Date: Mon, 31 Jul 2023 18:39:33 +0800 Subject: [PATCH] fix delete ci_type --- cmdb-api/api/commands/click_cmdb.py | 4 +++- cmdb-api/api/lib/cmdb/auto_discovery/auto_discovery.py | 5 ++++- cmdb-api/api/lib/cmdb/ci.py | 4 ++-- cmdb-api/api/lib/cmdb/ci_type.py | 7 +++++++ cmdb-api/api/lib/cmdb/resp_format.py | 1 + 5 files changed, 17 insertions(+), 4 deletions(-) diff --git a/cmdb-api/api/commands/click_cmdb.py b/cmdb-api/api/commands/click_cmdb.py index 37e83f6..1362806 100644 --- a/cmdb-api/api/commands/click_cmdb.py +++ b/cmdb-api/api/commands/click_cmdb.py @@ -13,6 +13,7 @@ from flask.cli import with_appcontext import api.lib.cmdb.ci from api.extensions import db from api.extensions import rd +from api.lib.cmdb.cache import AttributeCache from api.lib.cmdb.ci_type import CITypeTriggerManager from api.lib.cmdb.const import PermEnum from api.lib.cmdb.const import REDIS_PREFIX_CI @@ -275,8 +276,9 @@ def cmdb_index_table_upgrade(): Migrate data from tables c_value_integers, c_value_floats, and c_value_datetime """ for attr in Attribute.get_by(to_dict=False): - if attr.value_type not in {ValueTypeEnum.TEXT, ValueTypeEnum.JSON}: + if attr.value_type not in {ValueTypeEnum.TEXT, ValueTypeEnum.JSON} and not attr.is_index: attr.update(is_index=True) + AttributeCache.clean(attr) from api.models.cmdb import CIValueInteger, CIIndexValueInteger from api.models.cmdb import CIValueFloat, CIIndexValueFloat diff --git a/cmdb-api/api/lib/cmdb/auto_discovery/auto_discovery.py b/cmdb-api/api/lib/cmdb/auto_discovery/auto_discovery.py index 54a8448..c044c9c 100644 --- a/cmdb-api/api/lib/cmdb/auto_discovery/auto_discovery.py +++ b/cmdb-api/api/lib/cmdb/auto_discovery/auto_discovery.py @@ -476,7 +476,10 @@ class AutoDiscoveryCICRUD(DBMixin): except: pass - adc.update(is_accept=True, accept_by=nickname or g.user.nickname, accept_time=datetime.datetime.now()) + adc.update(is_accept=True, + accept_by=nickname or g.user.nickname, + accept_time=datetime.datetime.now(), + ci_id=ci_id) class AutoDiscoveryHTTPManager(object): diff --git a/cmdb-api/api/lib/cmdb/ci.py b/cmdb-api/api/lib/cmdb/ci.py index e2c3cf3..e2196e2 100644 --- a/cmdb-api/api/lib/cmdb/ci.py +++ b/cmdb-api/api/lib/cmdb/ci.py @@ -750,10 +750,10 @@ class CIRelationManager(object): first_existed = CIRelation.get_by(first_ci_id=first_ci_id, relation_type_id=type_relation.relation_type_id) second_existed = CIRelation.get_by(second_ci_id=second_ci_id, relation_type_id=type_relation.relation_type_id) if type_relation.constraint == ConstraintEnum.One2One and (first_existed or second_existed): - return abort(400, ErrFormat.relation_constraint.format("1对1")) + return abort(400, ErrFormat.relation_constraint.format("1-1")) if type_relation.constraint == ConstraintEnum.One2Many and second_existed: - return abort(400, ErrFormat.relation_constraint.format("1对多")) + return abort(400, ErrFormat.relation_constraint.format("1-N")) @classmethod def add(cls, first_ci_id, second_ci_id, more=None, relation_type_id=None): diff --git a/cmdb-api/api/lib/cmdb/ci_type.py b/cmdb-api/api/lib/cmdb/ci_type.py index a88a16b..8f95265 100644 --- a/cmdb-api/api/lib/cmdb/ci_type.py +++ b/cmdb-api/api/lib/cmdb/ci_type.py @@ -37,6 +37,7 @@ from api.models.cmdb import CITypeGroupItem from api.models.cmdb import CITypeRelation from api.models.cmdb import CITypeTrigger from api.models.cmdb import CITypeUniqueConstraint +from api.models.cmdb import PreferenceRelationView from api.models.cmdb import PreferenceShowAttributes from api.models.cmdb import PreferenceTreeView from api.models.cmdb import RelationType @@ -190,6 +191,12 @@ class CITypeManager(object): if CI.get_by(type_id=type_id, first=True, to_dict=False) is not None: return abort(400, ErrFormat.ci_exists_and_cannot_delete_type) + relation_views = PreferenceRelationView.get_by(to_dict=False) + for rv in relation_views: + for item in (rv.cr_ids or []): + if item.get('parent_id') == type_id or item.get('child_id') == type_id: + return abort(400, ErrFormat.ci_relation_view_exists_and_cannot_delete_type.format(rv.name)) + for item in CITypeRelation.get_by(parent_id=type_id, to_dict=False): item.soft_delete() diff --git a/cmdb-api/api/lib/cmdb/resp_format.py b/cmdb-api/api/lib/cmdb/resp_format.py index 7c53784..7474c48 100644 --- a/cmdb-api/api/lib/cmdb/resp_format.py +++ b/cmdb-api/api/lib/cmdb/resp_format.py @@ -37,6 +37,7 @@ class ErrFormat(CommonErrFormat): unique_key_not_define = "主键未定义或者已被删除" only_owner_can_delete = "只有创建人才能删除它!" ci_exists_and_cannot_delete_type = "因为CI已经存在,不能删除模型" + ci_relation_view_exists_and_cannot_delete_type = "因为关系视图 {} 引用了该模型,不能删除模型" ci_type_group_not_found = "模型分组 {} 不存在" ci_type_group_exists = "模型分组 {} 已经存在" ci_type_relation_not_found = "模型关系 {} 不存在"