From 5ca3bad10ff70c40bfa3978be66eae89b20d80cf Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Wed, 9 Oct 2013 15:28:19 +0200 Subject: [PATCH] Add monkey patching for strange behavior for method serializer with obj as None. --- greenmine/base/models.py | 4 +++- greenmine/base/monkey.py | 35 +++++++++++++++++++++++++++++++---- 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/greenmine/base/models.py b/greenmine/base/models.py index d9647c89..057700a3 100644 --- a/greenmine/base/models.py +++ b/greenmine/base/models.py @@ -23,4 +23,6 @@ def attach_uuid(sender, instance, **kwargs): # Patch api view for correctly return 401 responses on # request is authenticated instead of 403 -from .monkey import patch_api_view; patch_api_view() +from . import monkey +monkey.patch_api_view() +monkey.patch_serializer() diff --git a/greenmine/base/monkey.py b/greenmine/base/monkey.py index 1af68054..168617b4 100644 --- a/greenmine/base/monkey.py +++ b/greenmine/base/monkey.py @@ -2,12 +2,11 @@ from __future__ import print_function import sys -from rest_framework import views -from rest_framework import status, exceptions -from rest_framework.response import Response def patch_api_view(): - from django.views.generic import View + from rest_framework import views + from rest_framework import status, exceptions + from rest_framework.response import Response if hasattr(views, "_patched"): return @@ -31,3 +30,31 @@ def patch_api_view(): print("Patching APIView", file=sys.stderr) views.APIView = APIView + + +def patch_serializer(): + from rest_framework import serializers + if hasattr(serializers.BaseSerializer, "_patched"): + return + + def to_native(self, obj): + """ + Serialize objects -> primitives. + """ + ret = self._dict_class() + ret.fields = self._dict_class() + ret.empty = obj is None + + for field_name, field in self.fields.items(): + field.initialize(parent=self, field_name=field_name) + key = self.get_field_key(field_name) + ret.fields[key] = field + + if obj is not None: + value = field.field_to_native(obj, field_name) + ret[key] = value + + return ret + + serializers.BaseSerializer._patched = True + serializers.BaseSerializer.to_native = to_native