[Patchew-devel] [PATCH v2] Text to json convertor for mbox

Shubham Jain shubhamjain7495 at gmail.com
Fri Apr 27 11:53:54 UTC 2018


- 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"
Message-Id: <20180424160400.29938-1-shubhamjain7495 at gmail.com>

POST endpoint for messages

- Added test for text to json converter of Mbox
- Removed extra field from the dictionary object
---
 api/rest.py        | 21 +++++++++++----------
 mbox.py            | 18 ++++++++++++++++++
 tests/test_mbox.py | 19 +++++++++++++++++++
 3 files changed, 48 insertions(+), 10 deletions(-)

diff --git a/api/rest.py b/api/rest.py
index 381b569..917ed22 100644
--- a/api/rest.py
+++ b/api/rest.py
@@ -125,8 +125,8 @@ class BaseMessageSerializer(serializers.ModelSerializer):
 
     resource_uri = HyperlinkedMessageField(view_name='messages-detail')
 
-    recipients = SerializerMethodField()
-    sender = SerializerMethodField()
+    # recipients = SerializerMethodField()
+    # sender = SerializerMethodField()
 
     def format_name_addr(self, name, addr):
         d = {}
@@ -135,12 +135,12 @@ class BaseMessageSerializer(serializers.ModelSerializer):
         d['address'] = addr
         return d
 
-    def get_recipients(self, obj):
-        return [self.format_name_addr(*x) for x in obj.get_recipients()]
+    # def get_recipients(self, obj):
+    #     return [self.format_name_addr(*x) for x in obj.get_recipients()]
 
-    def get_sender(self, obj):
-        name, addr = obj.get_sender()
-        return self.format_name_addr(*obj.get_sender())
+    # def get_sender(self, obj):
+    #     name, addr = obj.get_sender()
+    #     return self.format_name_addr(*obj.get_sender())
 
 # a message_id is *not* unique, so we can only list
 class BaseMessageViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
@@ -285,7 +285,8 @@ class ProjectSeriesViewSet(ProjectMessagesViewSetMixin,
 class MessageSerializer(BaseMessageSerializer):
     class Meta:
         model = Message
-        fields = BaseMessageSerializer.Meta.fields + ('mbox', )
+        # fields = BaseMessageSerializer.Meta.fields + ('mbox', )
+        fields = '__all__'
 
     def get_mbox(self, obj):
         return obj.get_mbox()
@@ -311,9 +312,9 @@ class StaticTextRenderer(renderers.BaseRenderer):
             return data
 
 class MessagesViewSet(ProjectMessagesViewSetMixin,
-                      BaseMessageViewSet):
+                      BaseMessageViewSet, mixins.CreateModelMixin):
     serializer_class = MessageSerializer
-
+    
     @detail_route(renderer_classes=[StaticTextRenderer])
     def mbox(self, request, *args, **kwargs):
         message = self.get_object()
diff --git a/mbox.py b/mbox.py
index fe108f3..00336ba 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 = ''
@@ -269,3 +270,20 @@ class MboxMessage(object):
         if c == 0:
             return True
         return False
+
+    def get_json(self):
+        """Return the JSON format of the mbox """
+        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]
+        return msg
diff --git a/tests/test_mbox.py b/tests/test_mbox.py
index 8493df7..e4d69d2 100755
--- a/tests/test_mbox.py
+++ b/tests/test_mbox.py
@@ -13,6 +13,7 @@ import sys
 import mbox
 sys.path.append(os.path.dirname(__file__))
 from patchewtest import PatchewTestCase, main
+import datetime
 
 class MboxTest(PatchewTestCase):
 
@@ -52,5 +53,23 @@ Virtualization:  qemu.org | libvirt.org
             msg = mbox.MboxMessage(f.read())
         self.assertTrue(msg.is_patch())
 
+    def test_get_json(self):
+        expected = {'message_id': '20160628014747.20971-1-famz at redhat.com', 
+                    'in_reply_to': '', 
+                    'date': datetime.datetime(2016, 6, 28, 1, 47, 47), 
+                    'subject': '[Qemu-devel] [PATCH] quorum: Only compile when supported', 
+                    'stripped_subject': 'quorum: Only compile when supported', 
+                    'version': 1, 
+                    'sender': '["Fam Zheng", "famz at redhat.com"]', 
+                    'recipients': '[["qemu-devel at nongnu.org", "qemu-devel at nongnu.org"], ["Kevin Wolf", "kwolf at redhat.com"], ["Alberto Garcia", "berto at igalia.com"], ["qemu-block at nongnu.org", "qemu-block at nongnu.org"], ["Max Reitz", "mreitz at redhat.com"]]', 
+                    'prefixes': '["Qemu-devel", "PATCH"]', 
+                    'is_series_head': True, 
+                    'is_patch': True, 
+                    'patch_num': None }
+        dp = self.get_data_path("0001-simple-patch.mbox.gz")
+        with open(dp, "r") as f:
+            msg = mbox.MboxMessage(f.read()).get_json()
+        self.assertEqual(msg, expected)
+
 if __name__ == '__main__':
     main()
-- 
2.14.3 (Apple Git-98)




More information about the Patchew-devel mailing list