<div dir="ltr">I've found the error. Apparently In BaseMessageSerializer, sender and recipient are in the form of  OrderedDict([('name', 'Andrey Smirnov'), ('address', '<a href="mailto:andrew.smirnov@gmail.com">andrew.smirnov@gmail.com</a>')]) instead of ['Andrey Smirnov','<a href="mailto:andrew.smirnov@gmail.com">andrew.smirnov@gmail.com</a>']. I'm not sure what is happening here. Is create of AddressSerializer not getting called? </div><br><div class="gmail_quote"><div dir="ltr">On Mon, Apr 30, 2018 at 4:59 PM Paolo Bonzini <<a href="mailto:pbonzini@redhat.com">pbonzini@redhat.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On 30/04/2018 12:26, Shubham Jain wrote:<br>
> - 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/<br>
> - Add test corresponding to it<br>
<br>
Thanks, this looks good.  I'm running tests and should push it soon if<br>
they pass.<br>
<br>
The only comment I have is that usually a space is left after "," and<br>
":" characters, so that the code looks a bit less crammed.<br>
<br>
The next step is changing the handling of mbox as mentioned in the<br>
GitHub issue.<br>
<br>
Paolo<br>
<br>
>  api/rest.py        | 36 +++++++++++++++++++-----------------<br>
>  tests/test_rest.py | 17 +++++++++++++++++<br>
>  2 files changed, 36 insertions(+), 17 deletions(-)<br>
> <br>
> diff --git a/api/rest.py b/api/rest.py<br>
> index e71bf0b..5610844 100644<br>
> --- a/api/rest.py<br>
> +++ b/api/rest.py<br>
> @@ -19,7 +19,7 @@ from .search import SearchEngine<br>
>  from rest_framework import (permissions, serializers, viewsets, filters,<br>
>      mixins, generics, renderers)<br>
>  from rest_framework.decorators import detail_route<br>
> -from rest_framework.fields import SerializerMethodField, CharField, JSONField<br>
> +from rest_framework.fields import SerializerMethodField, CharField, JSONField, EmailField<br>
>  from rest_framework.relations import HyperlinkedIdentityField<br>
>  from rest_framework.response import Response<br>
>  import rest_framework<br>
> @@ -118,6 +118,22 @@ class HyperlinkedMessageField(HyperlinkedIdentityField):<br>
>          kwargs = {'projects_pk': obj.project_id, self.lookup_field: obj.message_id}<br>
>          return self.reverse(view_name, kwargs=kwargs, request=request, format=format)<br>
>  <br>
> +class AddressSerializer(serializers.Serializer):<br>
> +    name = CharField(required=False)<br>
> +    address = EmailField()<br>
> +    def to_representation(self,obj):<br>
> +        if obj[0] != obj[1]:<br>
> +            return {"name":obj[0],"address":obj[1]}<br>
> +        else:<br>
> +            return {"address":obj[1]}<br>
> +<br>
> +    def create(self,validated_data):<br>
> +        try:<br>
> +            return [validated_data['name'],validated_data['address']]<br>
> +        except:<br>
> +            return [validated_data['address'],validated_data['address']]<br>
> +<br>
> +<br>
>  class BaseMessageSerializer(serializers.ModelSerializer):<br>
>      class Meta:<br>
>          model = Message<br>
> @@ -125,21 +141,8 @@ class BaseMessageSerializer(serializers.ModelSerializer):<br>
>  <br>
>      resource_uri = HyperlinkedMessageField(view_name='messages-detail')<br>
>  <br>
> -    recipients = SerializerMethodField()<br>
> -    sender = SerializerMethodField()<br>
> -<br>
> -    def format_name_addr(self, name, addr):<br>
> -        d = {}<br>
> -        if name != addr:<br>
> -            d['name'] = name<br>
> -        d['address'] = addr<br>
> -        return d<br>
> -<br>
> -    def get_recipients(self, obj):<br>
> -        return [self.format_name_addr(*x) for x in obj.recipients]<br>
> -<br>
> -    def get_sender(self, obj):<br>
> -        return self.format_name_addr(*obj.sender)<br>
> +    recipients = AddressSerializer(many=True)<br>
> +    sender = AddressSerializer()<br>
>  <br>
>  # a message_id is *not* unique, so we can only list<br>
>  class BaseMessageViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):<br>
> @@ -280,7 +283,6 @@ class ProjectSeriesViewSet(ProjectMessagesViewSetMixin,<br>
>  # Messages<br>
>  <br>
>  # TODO: add POST endpoint connected to email plugin?<br>
> -<br>
>  class MessageSerializer(BaseMessageSerializer):<br>
>      class Meta:<br>
>          model = Message<br>
> diff --git a/tests/test_rest.py b/tests/test_rest.py<br>
> index d1fc80f..21bc2b9 100755<br>
> --- a/tests/test_rest.py<br>
> +++ b/tests/test_rest.py<br>
> @@ -16,6 +16,8 @@ from django.contrib.auth.models import User<br>
>  sys.path.append(os.path.dirname(__file__))<br>
>  from patchewtest import PatchewTestCase, main<br>
>  from api.models import Message<br>
> +from api.rest import AddressSerializer<br>
> +from collections import OrderedDict<br>
>  <br>
>  class RestTest(PatchewTestCase):<br>
>      def setUp(self):<br>
> @@ -270,6 +272,21 @@ class RestTest(PatchewTestCase):<br>
>          resp = self.client.get(message + 'mbox/')<br>
>          self.assertEqual(resp.data, Message.objects.all()[0].get_mbox())<br>
>  <br>
> +    def test_address_serializer(self):<br>
> +        data1 = {"name":"Shubham", "address":"<a href="mailto:shubhamjain7495@gmail.com" target="_blank">shubhamjain7495@gmail.com</a>"}<br>
> +        serializer1 = AddressSerializer(data = data1)<br>
> +        valid1 = serializer1.is_valid()<br>
> +        valid_data1 = serializer1.validated_data<br>
> +        data2 = {"name":123, "address":"<a href="mailto:shubhamjain7495@gmail.com" target="_blank">shubhamjain7495@gmail.com</a>"}<br>
> +        serializer2 = AddressSerializer(data = data2)<br>
> +        valid2 = serializer2.is_valid()<br>
> +        valid_data2 = serializer2.validated_data<br>
> +<br>
> +        self.assertEqual(valid1,True)<br>
> +        self.assertEqual(valid_data1,OrderedDict([('name', 'Shubham'), ('address', '<a href="mailto:shubhamjain7495@gmail.com" target="_blank">shubhamjain7495@gmail.com</a>')]))<br>
> +        self.assertEqual(valid2,True)<br>
> +        self.assertEqual(valid_data2,OrderedDict([('name', '123'), ('address', '<a href="mailto:shubhamjain7495@gmail.com" target="_blank">shubhamjain7495@gmail.com</a>')]))<br>
> +<br>
>      def test_message_replies(self):<br>
>          series = self.apply_and_retrieve('0004-multiple-patch-reviewed.mbox.gz',<br>
>                                           <a href="http://self.p.id" rel="noreferrer" target="_blank">self.p.id</a>, '<a href="mailto:1469192015-16487-1-git-send-email-berrange@redhat.com" target="_blank">1469192015-16487-1-git-send-email-berrange@redhat.com</a>')<br>
> <br>
<br>
</blockquote></div>