Moved object serialization into a utility function

This commit is contained in:
Jeremy Stretch 2018-06-22 14:00:23 -04:00
parent 9d419de9dc
commit 6c1b5fdf3a
3 changed files with 17 additions and 11 deletions

View File

@ -5,7 +5,6 @@ import uuid
from django.db.models.signals import post_delete, post_save from django.db.models.signals import post_delete, post_save
from django.utils.functional import curry, SimpleLazyObject 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 .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. Create an ObjectChange in response to an object being created or deleted.
""" """
if not isinstance(instance, ChangeLoggedModel): if not hasattr(instance, 'log_change'):
return return
# Determine what action is being performed. The post_save signal sends a `created` boolean, whereas post_delete # Determine what action is being performed. The post_save signal sends a `created` boolean, whereas post_delete

View File

@ -1,11 +1,9 @@
from __future__ import unicode_literals from __future__ import unicode_literals
import json
from django.core.serializers import serialize
from django.db import models from django.db import models
from extras.models import ObjectChange from extras.models import ObjectChange
from utilities.utils import serialize_object
class ChangeLoggedModel(models.Model): 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 Create a new ObjectChange representing a change made to this object. This will typically be called automatically
by extras.middleware.ChangeLoggingMiddleware. 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( ObjectChange(
user=user, user=user,
request_id=request_id, request_id=request_id,
changed_object=self, changed_object=self,
action=action, action=action,
object_data=object_data object_data=serialize_object(self)
).save() ).save()

View File

@ -1,8 +1,10 @@
from __future__ import unicode_literals from __future__ import unicode_literals
import datetime import datetime
import json
import six import six
from django.core.serializers import serialize
from django.http import HttpResponse from django.http import HttpResponse
@ -82,3 +84,15 @@ def dynamic_import(name):
for comp in components[1:]: for comp in components[1:]:
mod = getattr(mod, comp) mod = getattr(mod, comp)
return mod 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