From 7c1b016997d056b38cc2f04ece45e903a1cfdc92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Barrag=C3=A1n=20Merino?= Date: Wed, 13 Nov 2013 23:42:37 +0100 Subject: [PATCH] Added type and changed_fields to the version serializer class --- greenmine/base/serializers.py | 39 +++++++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/greenmine/base/serializers.py b/greenmine/base/serializers.py index 76209f58..aa016ad6 100644 --- a/greenmine/base/serializers.py +++ b/greenmine/base/serializers.py @@ -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