[Patchew-devel] [PATCH v2] serializer: Add custom serialzer for recipients and sender

Shubham Jain shubhamjain7495 at gmail.com
Mon Apr 30 10:26:09 UTC 2018


- Earlier, recipients and sender were read only serializers and could not be used for POST/PUT/PATCH requests. Change it to custome serializer for POST request at api/v1/messages/
- Add test corresponding to it
---
 api/rest.py        | 36 +++++++++++++++++++-----------------
 tests/test_rest.py | 17 +++++++++++++++++
 2 files changed, 36 insertions(+), 17 deletions(-)

diff --git a/api/rest.py b/api/rest.py
index e71bf0b..5610844 100644
--- a/api/rest.py
+++ b/api/rest.py
@@ -19,7 +19,7 @@ from .search import SearchEngine
 from rest_framework import (permissions, serializers, viewsets, filters,
     mixins, generics, renderers)
 from rest_framework.decorators import detail_route
-from rest_framework.fields import SerializerMethodField, CharField, JSONField
+from rest_framework.fields import SerializerMethodField, CharField, JSONField, EmailField
 from rest_framework.relations import HyperlinkedIdentityField
 from rest_framework.response import Response
 import rest_framework
@@ -118,6 +118,22 @@ class HyperlinkedMessageField(HyperlinkedIdentityField):
         kwargs = {'projects_pk': obj.project_id, self.lookup_field: obj.message_id}
         return self.reverse(view_name, kwargs=kwargs, request=request, format=format)
 
+class AddressSerializer(serializers.Serializer):
+    name = CharField(required=False)
+    address = EmailField()
+    def to_representation(self,obj):
+        if obj[0] != obj[1]:
+            return {"name":obj[0],"address":obj[1]}
+        else:
+            return {"address":obj[1]}
+
+    def create(self,validated_data):
+        try:
+            return [validated_data['name'],validated_data['address']]
+        except:
+            return [validated_data['address'],validated_data['address']]
+
+
 class BaseMessageSerializer(serializers.ModelSerializer):
     class Meta:
         model = Message
@@ -125,21 +141,8 @@ class BaseMessageSerializer(serializers.ModelSerializer):
 
     resource_uri = HyperlinkedMessageField(view_name='messages-detail')
 
-    recipients = SerializerMethodField()
-    sender = SerializerMethodField()
-
-    def format_name_addr(self, name, addr):
-        d = {}
-        if name != addr:
-            d['name'] = name
-        d['address'] = addr
-        return d
-
-    def get_recipients(self, obj):
-        return [self.format_name_addr(*x) for x in obj.recipients]
-
-    def get_sender(self, obj):
-        return self.format_name_addr(*obj.sender)
+    recipients = AddressSerializer(many=True)
+    sender = AddressSerializer()
 
 # a message_id is *not* unique, so we can only list
 class BaseMessageViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
@@ -280,7 +283,6 @@ class ProjectSeriesViewSet(ProjectMessagesViewSetMixin,
 # Messages
 
 # TODO: add POST endpoint connected to email plugin?
-
 class MessageSerializer(BaseMessageSerializer):
     class Meta:
         model = Message
diff --git a/tests/test_rest.py b/tests/test_rest.py
index d1fc80f..21bc2b9 100755
--- a/tests/test_rest.py
+++ b/tests/test_rest.py
@@ -16,6 +16,8 @@ from django.contrib.auth.models import User
 sys.path.append(os.path.dirname(__file__))
 from patchewtest import PatchewTestCase, main
 from api.models import Message
+from api.rest import AddressSerializer
+from collections import OrderedDict
 
 class RestTest(PatchewTestCase):
     def setUp(self):
@@ -270,6 +272,21 @@ class RestTest(PatchewTestCase):
         resp = self.client.get(message + 'mbox/')
         self.assertEqual(resp.data, Message.objects.all()[0].get_mbox())
 
+    def test_address_serializer(self):
+        data1 = {"name":"Shubham", "address":"shubhamjain7495 at gmail.com"}
+        serializer1 = AddressSerializer(data = data1)
+        valid1 = serializer1.is_valid()
+        valid_data1 = serializer1.validated_data
+        data2 = {"name":123, "address":"shubhamjain7495 at gmail.com"}
+        serializer2 = AddressSerializer(data = data2)
+        valid2 = serializer2.is_valid()
+        valid_data2 = serializer2.validated_data
+
+        self.assertEqual(valid1,True)
+        self.assertEqual(valid_data1,OrderedDict([('name', 'Shubham'), ('address', 'shubhamjain7495 at gmail.com')]))
+        self.assertEqual(valid2,True)
+        self.assertEqual(valid_data2,OrderedDict([('name', '123'), ('address', 'shubhamjain7495 at gmail.com')]))
+
     def test_message_replies(self):
         series = self.apply_and_retrieve('0004-multiple-patch-reviewed.mbox.gz',
                                          self.p.id, '1469192015-16487-1-git-send-email-berrange at redhat.com')
-- 
2.14.3 (Apple Git-98)




More information about the Patchew-devel mailing list