[Patchew-devel] [PATCH v2] serializer: Add custom serialzer for recipients and sender
Paolo Bonzini
pbonzini at redhat.com
Mon Apr 30 11:29:51 UTC 2018
On 30/04/2018 12:26, Shubham Jain wrote:
> - 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
Thanks, this looks good. I'm running tests and should push it soon if
they pass.
The only comment I have is that usually a space is left after "," and
":" characters, so that the code looks a bit less crammed.
The next step is changing the handling of mbox as mentioned in the
GitHub issue.
Paolo
> 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')
>
More information about the Patchew-devel
mailing list