Added type and changed_fields to the version serializer class

remotes/origin/enhancement/email-actions
David Barragán Merino 2013-11-13 23:42:37 +01:00
parent 64944c48dc
commit 7c1b016997
1 changed files with 37 additions and 2 deletions

View File

@ -3,6 +3,7 @@
from rest_framework import serializers
from reversion.models import Version
import reversion
class PickleField(serializers.WritableField):
@ -20,14 +21,16 @@ class VersionSerializer(serializers.ModelSerializer):
created_date = serializers.SerializerMethodField("get_created_date")
content_type = serializers.SerializerMethodField("get_content_type")
object_id = serializers.SerializerMethodField("get_object_id")
type_name = serializers.SerializerMethodField("get_type")
user = serializers.SerializerMethodField("get_user")
comment = serializers.SerializerMethodField("get_comment")
fields = serializers.SerializerMethodField("get_object_fields")
changed_fields = serializers.SerializerMethodField("get_changed_fields")
class Meta:
model = Version
fields = ("id", "created_date", "content_type", "object_id", "user", "comment",
"fields")
fields = ("id", "created_date", "content_type", "object_id", "type",
"type_name", "user", "comment", "fields", "changed_fields")
read_only = fields
def get_created_date(self, obj):
@ -39,6 +42,9 @@ class VersionSerializer(serializers.ModelSerializer):
def get_object_id(self, obj):
return obj.object_id_int
def get_type(self, obj):
return obj.get_type_display()
def get_object_fields(self, obj):
return obj.field_dict
@ -47,3 +53,32 @@ class VersionSerializer(serializers.ModelSerializer):
def get_comment(self, obj):
return obj.revision.comment
def get_object_old_fields(self, obj):
versions = reversion.get_unique_for_object(obj.object)
try:
return versions[versions.index(obj) + 1].field_dict
except IndexError:
return None
def get_changed_fields(self, obj):
new_fields = self.get_object_fields(obj)
old_fields = self.get_object_old_fields(obj)
changed_fields = {}
if old_fields:
for key in new_fields.keys() | old_fields.keys():
if key == "modified_date":
continue
if old_fields.get(key, None) == new_fields.get(key, None):
continue
changed_fields[key] = {
"name": obj.object.__class__._meta.get_field_by_name(
key)[0].verbose_name,
"old": old_fields.get(key, None),
"new": new_fields.get(key, None),
}
return changed_fields