ci 支持 软删除

This commit is contained in:
lovvvve
2023-08-17 09:54:23 +00:00
parent d3224625b6
commit bbd74b02a6
5 changed files with 72 additions and 19 deletions

View File

@@ -233,9 +233,12 @@ class CIManager(object):
return CI.get_by_id(unique.ci_id)
@staticmethod
def _delete_ci_by_id(ci_id):
def _delete_ci_by_id(ci_id, soft_delete=False):
ci = CI.get_by_id(ci_id)
ci.delete() # TODO: soft delete
if soft_delete:
ci.soft_delete()
else:
ci.delete()
@staticmethod
def _valid_unique_constraint(type_id, ci_dict, ci_id=None):
@@ -442,8 +445,8 @@ class CIManager(object):
ci_cache.apply_async([ci_id], queue=CMDB_QUEUE)
@classmethod
def delete(cls, ci_id):
ci = CI.get_by_id(ci_id) or abort(404, ErrFormat.ci_not_found.format("id={}".format(ci_id)))
def delete(cls, ci_id, soft_delete=False):
ci = CI.get_by_id(ci_id, not soft_delete) or abort(404, ErrFormat.ci_not_found.format("id={}".format(ci_id)))
cls._valid_ci_for_no_read(ci)
@@ -454,20 +457,32 @@ class CIManager(object):
attr_names = set([AttributeCache.get(attr.attr_id).name for attr in attrs])
for attr_name in attr_names:
value_table = TableMap(attr_name=attr_name).table
for item in value_table.get_by(ci_id=ci_id, to_dict=False):
for item in value_table.get_by(ci_id=ci_id, to_dict=False, deleted=not soft_delete):
if soft_delete:
item.soft_delete()
else:
item.delete()
for item in CIRelation.get_by(first_ci_id=ci_id, to_dict=False, deleted=not soft_delete):
ci_relation_delete.apply_async(args=(item.first_ci_id, item.second_ci_id), queue=CMDB_QUEUE)
if soft_delete:
item.soft_delete()
else:
item.delete()
for item in CIRelation.get_by(first_ci_id=ci_id, to_dict=False):
for item in CIRelation.get_by(second_ci_id=ci_id, to_dict=False, deleted=not soft_delete):
ci_relation_delete.apply_async(args=(item.first_ci_id, item.second_ci_id), queue=CMDB_QUEUE)
item.delete()
if soft_delete:
item.soft_delete()
else:
item.delete()
for item in CIRelation.get_by(second_ci_id=ci_id, to_dict=False):
ci_relation_delete.apply_async(args=(item.first_ci_id, item.second_ci_id), queue=CMDB_QUEUE)
item.delete()
ci.delete() # TODO: soft delete
AttributeHistoryManger.add(None, ci_id, [(None, OperateType.DELETE, ci_dict, None)], ci.type_id)
if soft_delete:
ci.soft_delete()
AttributeHistoryManger.add(None, ci_id, [(None, OperateType.SOFT_DELETE, ci_dict, None)], ci.type_id)
else:
ci.delete()
AttributeHistoryManger.add(None, ci_id, [(None, OperateType.DELETE, ci_dict, None)], ci.type_id)
ci_delete.apply_async([ci.id], queue=CMDB_QUEUE)
@@ -651,6 +666,10 @@ class CIManager(object):
current_app.logger.warning("cache not hit...............")
return cls._get_cis_from_db(ci_ids, ret_key, fields, value_tables, excludes=excludes)
@classmethod
def get_soft_delete_ids(cls):
return [ci.get("id") for ci in CI.get_by(deleted=True)]
class CIRelationManager(object):
"""

View File

@@ -36,6 +36,7 @@ class OperateType(BaseEnum):
ADD = "0"
DELETE = "1"
UPDATE = "2"
SOFT_DELETE = "3"
class CITypeOperateType(BaseEnum):

View File

@@ -20,7 +20,7 @@ class FormatMixin(object):
res.pop('secret', None)
return res
@classmethod
def from_dict(cls, **kwargs):
from sqlalchemy.sql.sqltypes import Time, Date, DateTime
@@ -86,11 +86,11 @@ class CRUDMixin(FormatMixin):
self.save(flush=flush, commit=commit)
@classmethod
def get_by_id(cls, _id):
def get_by_id(cls, _id, with_soft_deleted=False):
if any((isinstance(_id, six.string_types) and _id.isdigit(),
isinstance(_id, (six.integer_types, float))), ):
obj = getattr(cls, "query").get(int(_id))
if obj and not obj.deleted:
if obj and (with_soft_deleted or not obj.deleted):
return obj
@classmethod