:p
atchew
Login
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/ --- api/rest.py | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/api/rest.py b/api/rest.py index XXXXXXX..XXXXXXX 100644 --- a/api/rest.py +++ b/api/rest.py @@ -XXX,XX +XXX,XX @@ 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): + """ """ + def to_representation(self,obj): + if obj[0] != obj[1]: + return {"name":obj[0],"address":obj[1]} + else: + return {"address":obj[1]} + + def to_internal_value(self, data): + try: + return OrderedDict([('name',data['name']),('address',data['address'])]) + except: + return OrderedDict([('name',data['address']),('address',data['address'])]) + + def create(self,validated_data): + return [validated_data['name'],validated_data['address']] + class BaseMessageSerializer(serializers.ModelSerializer): class Meta: model = Message @@ -XXX,XX +XXX,XX @@ 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): @@ -XXX,XX +XXX,XX @@ class ProjectSeriesViewSet(ProjectMessagesViewSetMixin, # Messages # TODO: add POST endpoint connected to email plugin? - class MessageSerializer(BaseMessageSerializer): class Meta: model = Message -- 2.14.3 (Apple Git-98) _______________________________________________ Patchew-devel mailing list Patchew-devel@redhat.com https://www.redhat.com/mailman/listinfo/patchew-devel
- 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 XXXXXXX..XXXXXXX 100644 --- a/api/rest.py +++ b/api/rest.py @@ -XXX,XX +XXX,XX @@ 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 @@ -XXX,XX +XXX,XX @@ 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 @@ -XXX,XX +XXX,XX @@ 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): @@ -XXX,XX +XXX,XX @@ 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 XXXXXXX..XXXXXXX 100755 --- a/tests/test_rest.py +++ b/tests/test_rest.py @@ -XXX,XX +XXX,XX @@ 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): @@ -XXX,XX +XXX,XX @@ 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@gmail.com"} + serializer1 = AddressSerializer(data = data1) + valid1 = serializer1.is_valid() + valid_data1 = serializer1.validated_data + data2 = {"name":123, "address":"shubhamjain7495@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@gmail.com')])) + self.assertEqual(valid2,True) + self.assertEqual(valid_data2,OrderedDict([('name', '123'), ('address', 'shubhamjain7495@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@redhat.com') -- 2.14.3 (Apple Git-98) _______________________________________________ Patchew-devel mailing list Patchew-devel@redhat.com https://www.redhat.com/mailman/listinfo/patchew-devel