api/rest.py | 19 ++++++++++++++++++- mbox.py | 21 +++++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-)
Mbox would now return a dictionary object which would help REST API deserialize easily into model object.
[WIP] POST endpoint for messages.
It's a work in progress for creating new message which is improvement of legacy endpoint: "import"
---
api/rest.py | 19 ++++++++++++++++++-
mbox.py | 21 +++++++++++++++++++++
2 files changed, 39 insertions(+), 1 deletion(-)
diff --git a/api/rest.py b/api/rest.py
index 6aa744d..ee814e8 100644
--- a/api/rest.py
+++ b/api/rest.py
@@ -303,8 +303,25 @@ class StaticTextRenderer(renderers.BaseRenderer):
return data
class MessagesViewSet(ProjectMessagesViewSetMixin,
- BaseMessageViewSet):
+ BaseMessageViewSet, mixins.CreateModelMixin):
serializer_class = MessageSerializer
+
+ def create(self, request, *args, **kwargs):
+ def find_message_projects(m):
+ return [p for p in Project.objects.all() if p.recognizes(m)]
+
+ msg = MboxMessage(request.data)
+ project = find_message_projects(msg)
+ msg.project = project
+ serializer = self.get_serializer(data=msg.get_json())
+ serializer.is_valid(raise_exception=True)
+ self.perform_create(serializer)
+ headers = self.get_success_headers(serializer.data)
+ return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
+
+
+ def perform_create(self, serializer):
+ serializer.save()
@detail_route(renderer_classes=[StaticTextRenderer])
def mbox(self, request, *args, **kwargs):
diff --git a/mbox.py b/mbox.py
index 3692cc6..6b42e8f 100644
--- a/mbox.py
+++ b/mbox.py
@@ -13,6 +13,7 @@ import email.utils
import email.header
import datetime
import re
+import json
def _parse_header(header):
r = ''
@@ -267,3 +268,23 @@ class MboxMessage(object):
if c == 0:
return True
return False
+
+ def get_json(self):
+ """
+ """
+ msg = {}
+ msg['message_id'] = self.get_message_id()
+ msg['in_reply_to'] = self.get_in_reply_to() or ""
+ msg['date'] = self.get_date()
+ msg['subject'] = self.get_subject()
+ msg['stripped_subject'] = self.get_subject(strip_tags=True)
+ msg['version'] = self.get_version()
+ msg['sender'] = json.dumps(self.get_from())
+ msg['recipients'] = json.dumps(self.get_to() + self.get_cc())
+ msg['prefixes']=json.dumps(self.get_prefixes())
+ msg['is_series_head'] = self.is_series_head()
+ msg['is_patch'] = self.is_patch()
+ msg['patch_num'] = self.get_num()[0]
+ msg['project'] = self.project
+ msg['mbox'] = self._mbox
+ return msg
--
2.14.3 (Apple Git-98)
_______________________________________________
Patchew-devel mailing list
Patchew-devel@redhat.com
https://www.redhat.com/mailman/listinfo/patchew-devel
On 24/04/2018 18:04, Shubham Jain wrote: > class MessagesViewSet(ProjectMessagesViewSetMixin, > - BaseMessageViewSet): > + BaseMessageViewSet, mixins.CreateModelMixin): > serializer_class = MessageSerializer > + > + def create(self, request, *args, **kwargs): > + def find_message_projects(m): > + return [p for p in Project.objects.all() if p.recognizes(m)] Note that this is returning a list. Here you do have a project however, because MessagesViewSet has a projects_pk field in kwargs (it's registered under projects_router in api/urls.py). So find_message_projects is something that you'd add later, when you add /api/v1/messages/. For now you're only dealing with /api/v1/projects/{id}/messages/. > + msg = MboxMessage(request.data) Later you would check the request.content_type, and go through MboxMessage and msg.get_json() only if it's text/plain. > + project = find_message_projects(msg) > + msg.project = project MboxMessage doesn't have a project field. I think you should first retrieve the JSON with msg.get_json(), and then set the project URI into the JSON, for example using Django REST Framework's reverse lookup function. > + serializer = self.get_serializer(data=msg.get_json()) > + serializer.is_valid(raise_exception=True) > + self.perform_create(serializer) > + headers = self.get_success_headers(serializer.data) > + return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers) > + > + def perform_create(self, serializer): > + serializer.save() > perform_create is the same as in CreateModelMixin so you can remove it. I think you are a little confused as to what you are trying to achieve. As a first step you should: 1) write a test case for MboxMessage.get_json() 2) just add CreateModelMixin and see what happens in the API browser. Write a test case that POSTs a new message with JSON format. 3) only once you have the above you can start looking at adding /api/v1/messages/. Thanks, Paolo _______________________________________________ Patchew-devel mailing list Patchew-devel@redhat.com https://www.redhat.com/mailman/listinfo/patchew-devel
© 2016 - 2025 Red Hat, Inc.