From 6c1b5fdf3af788d4d65348b1999999372b358e1f Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 22 Jun 2018 14:00:23 -0400 Subject: [PATCH] Moved object serialization into a utility function --- netbox/extras/middleware.py | 3 +-- netbox/utilities/models.py | 11 ++--------- netbox/utilities/utils.py | 14 ++++++++++++++ 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/netbox/extras/middleware.py b/netbox/extras/middleware.py index f31f1ed87..429d8ed55 100644 --- a/netbox/extras/middleware.py +++ b/netbox/extras/middleware.py @@ -5,7 +5,6 @@ import uuid 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 @@ -13,7 +12,7 @@ def record_object_change(user, request_id, instance, **kwargs): """ Create an ObjectChange in response to an object being created or deleted. """ - if not isinstance(instance, ChangeLoggedModel): + if not hasattr(instance, 'log_change'): return # Determine what action is being performed. The post_save signal sends a `created` boolean, whereas post_delete diff --git a/netbox/utilities/models.py b/netbox/utilities/models.py index a6b1e900a..4b04c03e1 100644 --- a/netbox/utilities/models.py +++ b/netbox/utilities/models.py @@ -1,11 +1,9 @@ from __future__ import unicode_literals -import json - -from django.core.serializers import serialize from django.db import models from extras.models import ObjectChange +from utilities.utils import serialize_object class ChangeLoggedModel(models.Model): @@ -32,15 +30,10 @@ class ChangeLoggedModel(models.Model): 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 + object_data=serialize_object(self) ).save() diff --git a/netbox/utilities/utils.py b/netbox/utilities/utils.py index e995c5580..c5ddda907 100644 --- a/netbox/utilities/utils.py +++ b/netbox/utilities/utils.py @@ -1,8 +1,10 @@ from __future__ import unicode_literals import datetime +import json import six +from django.core.serializers import serialize from django.http import HttpResponse @@ -82,3 +84,15 @@ def dynamic_import(name): for comp in components[1:]: mod = getattr(mod, comp) return mod + + +def serialize_object(obj, extra=None): + """ + Return a generic JSON representation of an object using Django's built-in serializer. (This is used for things like + change logging, not the REST API.) + """ + json_str = serialize('json', [obj]) + data = json.loads(json_str)[0]['fields'] + if extra is not None: + data['extra'] = extra + return data