From b58be33aac6a0d38d620625ad47a14241a74d788 Mon Sep 17 00:00:00 2001 From: RobbieHan Date: Tue, 12 Feb 2019 21:21:00 +0800 Subject: [PATCH] change_compare --- apps/cmdb/models.py | 2 +- apps/cmdb/signals.py | 32 +++++++++++++++++++++++++++++--- apps/utils/db_utils.py | 18 ++++++++++++++++++ templates/cmdb/code_update.html | 2 +- 4 files changed, 49 insertions(+), 5 deletions(-) create mode 100644 apps/utils/db_utils.py diff --git a/apps/cmdb/models.py b/apps/cmdb/models.py index 41840d2..bb516c5 100644 --- a/apps/cmdb/models.py +++ b/apps/cmdb/models.py @@ -20,7 +20,7 @@ class Meta: class Code(AbstractMode): key = models.CharField(max_length=80, verbose_name='键') value = models.CharField(max_length=80, verbose_name='值') - desc = models.BooleanField(default=True, verbose_name='备注') + desc = models.CharField(max_length=100, blank=True, default='', verbose_name='备注') class Meta: verbose_name = '字典' diff --git a/apps/cmdb/signals.py b/apps/cmdb/signals.py index d66e53a..ab5f424 100644 --- a/apps/cmdb/signals.py +++ b/apps/cmdb/signals.py @@ -1,13 +1,39 @@ import os from django.dispatch import receiver -from django.db.models.signals import post_delete +from django.db.models.signals import post_delete, post_save -from .models import DeviceFile +from .models import DeviceFile, DeviceInfo +from utils.db_utils import MongodbDriver @receiver(post_delete, sender=DeviceFile) def auto_delete_file(sender, instance, **kwargs): if instance.file_content: if os.path.isfile(instance.file_content.path): - os.remove(instance.file_content.path) \ No newline at end of file + os.remove(instance.file_content.path) + + +@receiver(post_save, sender=DeviceInfo) +def auto_compare_diff(sender, instance, **kwargs): + record = instance.history.latest() + prev_record = record.prev_record + ope_type = {'~': 'update', '+': 'create', '-': 'delete'} + compare_result = { + 'id': record.id, + 'changed_by': record.changed_by.name, + 'history_type': ope_type[record.history_type], + 'history_date': record.history_date + } + changes = {} + if prev_record is not None: + delta = record.diff_against(prev_record) + for change in delta.changes: + changes[change.field] = [change.old, change.new] + compare_result['changes'] = changes + if compare_result['changes'] or compare_result['history_type'] == 'create': + try: + mongo = MongodbDriver(collection='change_compare') + mongo.insert(compare_result) + except Exception as e: + pass diff --git a/apps/utils/db_utils.py b/apps/utils/db_utils.py new file mode 100644 index 0000000..2014cb6 --- /dev/null +++ b/apps/utils/db_utils.py @@ -0,0 +1,18 @@ +import pymongo + + +class MongodbDriver(object): + + def __init__(self, db='device', collection='change_compare'): + self.client = pymongo.MongoClient('127.0.0.1', 27017) + self.db = self.client[db] + self.col = self.db[collection] + + def insert(self, content): + return self.col.insert(content) + + def find(self, sort_by, **filters,): + data = self.col.find(filters) + if sort_by: + data.sort(sort_by, pymongo.DESCENDING) + return data \ No newline at end of file diff --git a/templates/cmdb/code_update.html b/templates/cmdb/code_update.html index aa28a99..402d856 100644 --- a/templates/cmdb/code_update.html +++ b/templates/cmdb/code_update.html @@ -40,7 +40,7 @@

修改字典

- +