From e1055b7f97bece3a0efe9bd52c329e709241fbfa Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 21 Jun 2018 13:24:26 -0400 Subject: [PATCH] Moved ObjectChange creation logic from middleware to ChangeLoggedModel --- netbox/extras/middleware.py | 15 +-------------- netbox/utilities/models.py | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/netbox/extras/middleware.py b/netbox/extras/middleware.py index 4492c550a..f31f1ed87 100644 --- a/netbox/extras/middleware.py +++ b/netbox/extras/middleware.py @@ -1,15 +1,12 @@ from __future__ import unicode_literals -import json import uuid -from django.core.serializers import serialize from django.db.models.signals import post_delete, post_save from django.utils.functional import curry, SimpleLazyObject from utilities.models import ChangeLoggedModel from .constants import OBJECTCHANGE_ACTION_CREATE, OBJECTCHANGE_ACTION_DELETE, OBJECTCHANGE_ACTION_UPDATE -from .models import ObjectChange def record_object_change(user, request_id, instance, **kwargs): @@ -26,17 +23,7 @@ def record_object_change(user, request_id, instance, **kwargs): else: action = OBJECTCHANGE_ACTION_DELETE - # Serialize the object using Django's built-in JSON serializer, then extract only the `fields` dict. - json_str = serialize('json', [instance]) - object_data = json.loads(json_str)[0]['fields'] - - ObjectChange( - user=user, - request_id=request_id, - changed_object=instance, - action=action, - object_data=object_data - ).save() + instance.log_change(user, request_id, action) class ChangeLoggingMiddleware(object): diff --git a/netbox/utilities/models.py b/netbox/utilities/models.py index 9a0c05de5..a6b1e900a 100644 --- a/netbox/utilities/models.py +++ b/netbox/utilities/models.py @@ -1,7 +1,12 @@ from __future__ import unicode_literals +import json + +from django.core.serializers import serialize from django.db import models +from extras.models import ObjectChange + class ChangeLoggedModel(models.Model): """ @@ -21,3 +26,21 @@ class ChangeLoggedModel(models.Model): class Meta: abstract = True + + def log_change(self, user, request_id, action): + """ + Create a new ObjectChange representing a change made to this object. This will typically be called automatically + by extras.middleware.ChangeLoggingMiddleware. + """ + + # Serialize the object using Django's built-in JSON serializer, then extract only the `fields` dict. + json_str = serialize('json', [self]) + object_data = json.loads(json_str)[0]['fields'] + + ObjectChange( + user=user, + request_id=request_id, + changed_object=self, + action=action, + object_data=object_data + ).save()