[Patchew-devel] [PATCH] rest: add api/v1/messages endpoint (POST support)

Paolo Bonzini pbonzini at redhat.com
Tue May 15 11:31:57 UTC 2018


On 15/05/2018 11:26, Shubham Jain wrote:
> To apply a single message to the project according to the group user is from. For importer user, message is added to all recognised project. For other users, message is added to all the projects recognised and maintained by the user.
> ---
>  api/rest.py                                    |  22 +++++++++--
>  api/urls.py                                    |   3 +-
>  tests/data/0023-multiple-project-patch.mbox.gz | Bin 0 -> 2274 bytes
>  tests/data/0024-multiple-project-patch.json.gz | Bin 0 -> 2471 bytes
>  tests/test_rest.py                             |  51 ++++++++++++++++++++++++-
>  5 files changed, 70 insertions(+), 6 deletions(-)
>  create mode 100644 tests/data/0023-multiple-project-patch.mbox.gz
>  create mode 100644 tests/data/0024-multiple-project-patch.json.gz
> 
> diff --git a/api/rest.py b/api/rest.py
> index 1f81fe7..6264085 100644
> --- a/api/rest.py
> +++ b/api/rest.py
> @@ -17,7 +17,7 @@ from mod import dispatch_module_hook
>  from .models import Project, Message
>  from .search import SearchEngine
>  from rest_framework import (permissions, serializers, viewsets, filters,
> -    mixins, generics, renderers)
> +    mixins, generics, renderers, status)
>  from rest_framework.decorators import detail_route
>  from rest_framework.fields import SerializerMethodField, CharField, JSONField, EmailField
>  from rest_framework.relations import HyperlinkedIdentityField
> @@ -162,7 +162,6 @@ class AddressSerializer(serializers.Serializer):
>          except:
>              return [validated_data['address'], validated_data['address']]
>  
> -
>  class BaseMessageSerializer(serializers.ModelSerializer):
>      class Meta:
>          model = Message
> @@ -288,7 +287,6 @@ class SeriesViewSet(BaseMessageViewSet):
>      filter_backends = (PatchewSearchFilter,)
>      search_fields = (SEARCH_PARAM,)
>  
> -
>  class ProjectSeriesViewSet(ProjectMessagesViewSetMixin,
>                             SeriesViewSet, mixins.DestroyModelMixin):
>      def collect_patches(self, series):
> @@ -368,7 +366,7 @@ class MessagePlainTextParser(BaseParser):
>          data = stream.read().decode("utf-8")
>          return MboxMessage(data).get_json()
>  
> -class MessagesViewSet(ProjectMessagesViewSetMixin,
> +class ProjectMessagesViewSet(ProjectMessagesViewSetMixin,
>                        BaseMessageViewSet, mixins.CreateModelMixin):
>      serializer_class = MessageSerializer
>      parser_classes = (JSONParser, MessagePlainTextParser, )
> @@ -388,6 +386,22 @@ class MessagesViewSet(ProjectMessagesViewSetMixin,
>                                             context=self.get_serializer_context())
>          return self.get_paginated_response(serializer.data)
>  
> +class MessagesViewSet(BaseMessageViewSet):
> +    serializer_class = MessageSerializer
> +    parser_classes = (JSONParser, MessagePlainTextParser, )
> +    
> +    def create(self, request, *args, **kwargs):
> +        projects = [p for p in Project.objects.all() if p.recognizes(MboxMessage(self.request.data['mbox']))]
> +
> +        if 'importers' not in self.request.user.groups.all():
> +            projects = set(projects) & set([p for p in Project.objects.all() if p.maintained_by(self.request.user)])
> +        for project in projects:
> +            request.data['project'] = project

Is this line still needed?


> +            serializer = MessageSerializer(data=request.data,context={'project': project, 'request': self.request})

You can also do

	serializer = self.get_serializer(data=request.data)
	serializer.is_valid(raise_exception=True)
	serializer.save(project=project)

It is a bit longer (you need to keep the older change to support
request.data['project']), but perhaps cleaner because you reuse
GenericViewSet's code to create the serializer and the context.

> +            serializer.is_valid(raise_exception=True)
> +            serializer.save()
> +        return Response("Sucess", status=status.HTTP_201_CREATED)

The response should include all the serializer's data.  You can do
something similar to ResultsViewSet:

        results = []
        ...
        for project in projects:
            ...
            results.append(serializer.data)
        return Response(OrderedDict([
            ('count', len(results)),
            ('results', results)
        ]), status=status.HTTP_201_CREATED)


Thanks,

Paolo

> +
>  # Results




More information about the Patchew-devel mailing list