From 705f4916b90f8c1d6b5baef7301ca9d0560d0d43 Mon Sep 17 00:00:00 2001 From: pycook Date: Tue, 14 Jan 2020 20:52:36 +0800 Subject: [PATCH 1/3] [fix] delete CIType's attribute --- cmdb-api/api/lib/cmdb/ci_type.py | 4 ++++ cmdb-api/api/lib/cmdb/value.py | 16 +++++++++++++++- cmdb-ui/src/views/cmdb/ci/index.vue | 2 +- cmdb-ui/src/views/cmdb/relation_views/index.vue | 2 +- cmdb-ui/src/views/cmdb/tree_views/index.vue | 2 +- 5 files changed, 22 insertions(+), 4 deletions(-) diff --git a/cmdb-api/api/lib/cmdb/ci_type.py b/cmdb-api/api/lib/cmdb/ci_type.py index 0c607a8..c24d355 100644 --- a/cmdb-api/api/lib/cmdb/ci_type.py +++ b/cmdb-api/api/lib/cmdb/ci_type.py @@ -10,6 +10,7 @@ from api.lib.cmdb.cache import AttributeCache from api.lib.cmdb.cache import CITypeAttributeCache from api.lib.cmdb.cache import CITypeAttributesCache from api.lib.cmdb.cache import CITypeCache +from api.lib.cmdb.value import AttributeValueManager from api.lib.decorator import kwargs_required from api.models.cmdb import CI from api.models.cmdb import CIType @@ -292,6 +293,9 @@ class CITypeAttributeManager(object): if existed is not None: existed.soft_delete() + for ci in CI.get_by(type_id=type_id, to_dict=False): + AttributeValueManager.delete_attr_value(attr_id, ci.id) + CITypeAttributeCache.clean(type_id, attr_id) CITypeAttributesCache.clean(type_id) diff --git a/cmdb-api/api/lib/cmdb/value.py b/cmdb-api/api/lib/cmdb/value.py index f262002..2b53a22 100644 --- a/cmdb-api/api/lib/cmdb/value.py +++ b/cmdb-api/api/lib/cmdb/value.py @@ -11,6 +11,7 @@ from api.lib.cmdb.cache import AttributeCache from api.lib.cmdb.cache import CITypeAttributeCache from api.lib.cmdb.const import ExistPolicy from api.lib.cmdb.const import OperateType +from api.lib.cmdb.const import ValueTypeEnum from api.lib.cmdb.history import AttributeHistoryManger from api.lib.cmdb.utils import TableMap from api.lib.cmdb.utils import ValueTypeMap @@ -156,7 +157,20 @@ class AttributeValueManager(object): existed_value = existed_attr and existed_attr.value if existed_value is None: value_table.create(ci_id=ci.id, attr_id=attr.id, value=value) + self._write_change(ci.id, attr.id, OperateType.ADD, None, value) else: - existed_attr.update(value=value) + if not value and attr.value_type != ValueTypeEnum.TEXT: + existed_attr.delete() + else: + existed_attr.update(value=value) + self._write_change(ci.id, attr.id, OperateType.UPDATE, existed_value, value) + + @staticmethod + def delete_attr_value(attr_id, ci_id): + attr = AttributeCache.get(attr_id) + if attr is not None: + value_table = TableMap(attr_name=attr.name).table + for item in value_table.get_by(attr_id=attr.id, ci_id=ci_id, to_dict=False): + item.delete() diff --git a/cmdb-ui/src/views/cmdb/ci/index.vue b/cmdb-ui/src/views/cmdb/ci/index.vue index b51efc5..82aa7e1 100644 --- a/cmdb-ui/src/views/cmdb/ci/index.vue +++ b/cmdb-ui/src/views/cmdb/ci/index.vue @@ -132,7 +132,7 @@ export default { let q = `q=_type:${this.$router.currentRoute.meta.typeId}` Object.keys(params).forEach(key => { if (!['pageNo', 'pageSize', 'sortField', 'sortOrder'].includes(key) && params[key] + '' !== '') { - if (typeof params[key] === 'object' && params[key].length > 1) { + if (typeof params[key] === 'object' && params[key] && params[key].length > 1) { q += `,${key}:(${params[key].join(';')})` } else if (params[key]) { q += `,${key}:*${params[key]}*` diff --git a/cmdb-ui/src/views/cmdb/relation_views/index.vue b/cmdb-ui/src/views/cmdb/relation_views/index.vue index eda6ab3..661eae1 100644 --- a/cmdb-ui/src/views/cmdb/relation_views/index.vue +++ b/cmdb-ui/src/views/cmdb/relation_views/index.vue @@ -89,7 +89,7 @@ export default { let q = '' Object.keys(params).forEach(key => { if (!['pageNo', 'pageSize', 'sortField', 'sortOrder'].includes(key) && params[key] + '' !== '') { - if (typeof params[key] === 'object' && params[key].length > 1) { + if (typeof params[key] === 'object' && params[key] && params[key].length > 1) { q += `,${key}:(${params[key].join(';')})` } else if (params[key]) { q += `,${key}:*${params[key]}*` diff --git a/cmdb-ui/src/views/cmdb/tree_views/index.vue b/cmdb-ui/src/views/cmdb/tree_views/index.vue index 9b9121b..4258283 100644 --- a/cmdb-ui/src/views/cmdb/tree_views/index.vue +++ b/cmdb-ui/src/views/cmdb/tree_views/index.vue @@ -69,7 +69,7 @@ export default { let q = `q=_type:${this.typeId}` Object.keys(params).forEach(key => { if (!['pageNo', 'pageSize', 'sortField', 'sortOrder'].includes(key) && params[key] + '' !== '') { - if (typeof params[key] === 'object' && params[key].length > 1) { + if (typeof params[key] === 'object' && params[key] && params[key].length > 1) { q += `,${key}:(${params[key].join(';')})` } else if (params[key]) { q += `,${key}:*${params[key]}*` From d82dc10451ffefa3d155e9ec244a6021acdafd30 Mon Sep 17 00:00:00 2001 From: pycook Date: Wed, 15 Jan 2020 09:06:31 +0800 Subject: [PATCH 2/3] flush cache when delete attribute --- cmdb-api/api/lib/cmdb/ci_type.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cmdb-api/api/lib/cmdb/ci_type.py b/cmdb-api/api/lib/cmdb/ci_type.py index c24d355..ec02229 100644 --- a/cmdb-api/api/lib/cmdb/ci_type.py +++ b/cmdb-api/api/lib/cmdb/ci_type.py @@ -10,6 +10,7 @@ from api.lib.cmdb.cache import AttributeCache from api.lib.cmdb.cache import CITypeAttributeCache from api.lib.cmdb.cache import CITypeAttributesCache from api.lib.cmdb.cache import CITypeCache +from api.lib.cmdb.const import CMDB_QUEUE from api.lib.cmdb.value import AttributeValueManager from api.lib.decorator import kwargs_required from api.models.cmdb import CI @@ -22,6 +23,7 @@ from api.models.cmdb import CITypeGroupItem from api.models.cmdb import CITypeRelation from api.models.cmdb import PreferenceShowAttributes from api.models.cmdb import PreferenceTreeView +from api.tasks.cmdb import ci_cache class CITypeManager(object): @@ -296,6 +298,8 @@ class CITypeAttributeManager(object): for ci in CI.get_by(type_id=type_id, to_dict=False): AttributeValueManager.delete_attr_value(attr_id, ci.id) + ci_cache.apply_async([ci.id], queue=CMDB_QUEUE) + CITypeAttributeCache.clean(type_id, attr_id) CITypeAttributesCache.clean(type_id) From 5931e9879b82415864a26df92b5e0166bd4e3daa Mon Sep 17 00:00:00 2001 From: pycook Date: Wed, 15 Jan 2020 11:52:33 +0800 Subject: [PATCH 3/3] [fix] cycle import --- cmdb-api/api/lib/cmdb/ci_type.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cmdb-api/api/lib/cmdb/ci_type.py b/cmdb-api/api/lib/cmdb/ci_type.py index ec02229..8c7934d 100644 --- a/cmdb-api/api/lib/cmdb/ci_type.py +++ b/cmdb-api/api/lib/cmdb/ci_type.py @@ -23,7 +23,6 @@ from api.models.cmdb import CITypeGroupItem from api.models.cmdb import CITypeRelation from api.models.cmdb import PreferenceShowAttributes from api.models.cmdb import PreferenceTreeView -from api.tasks.cmdb import ci_cache class CITypeManager(object): @@ -285,6 +284,8 @@ class CITypeAttributeManager(object): :param attr_ids: list :return: """ + from api.tasks.cmdb import ci_cache + cls._check(type_id, attr_ids) for attr_id in attr_ids: