[Patchew-devel] [PATCH 05/11] git, rest: add mbox URI to API replies

Paolo Bonzini pbonzini at redhat.com
Wed May 15 12:58:02 UTC 2019


Once this API is deployed, this will let us remove the filter-branch
code from the applier.  Instead, collecting tags reuses the existing
code in www/urls.py.
---
 api/rest.py | 38 ++++++++++++++++++++++++--------------
 mods/git.py |  7 +++++++
 2 files changed, 31 insertions(+), 14 deletions(-)

diff --git a/api/rest.py b/api/rest.py
index e64c828..9525a27 100644
--- a/api/rest.py
+++ b/api/rest.py
@@ -29,6 +29,20 @@ from rest_framework.parsers import BaseParser
 
 SEARCH_PARAM = 'q'
 
+
+class StaticTextRenderer(renderers.BaseRenderer):
+    media_type = 'text/plain'
+    format = 'mbox'
+
+    def render(self, data, accepted_media_type=None, renderer_context=None):
+        renderer_context = renderer_context or {}
+        response = renderer_context.get('response')
+        if response and response.exception:
+            return '%d %s' % (response.status_code, response.status_text.title())
+        else:
+            return data
+
+
 # patchew-specific permission classes
 
 
@@ -361,13 +375,14 @@ class SeriesSerializer(BaseMessageSerializer):
     class Meta:
         model = Message
         subclass_read_only_fields = ('message', 'stripped_subject', 'num_patches',
-            'total_patches', 'results')
+            'total_patches', 'results', 'mbox_uri')
         fields = BaseMessageSerializer.Meta.fields + subclass_read_only_fields + (
             'last_comment_date', 'last_reply_date', 'is_complete', 'is_merged',
             'is_obsolete', 'is_tested', 'is_reviewed', 'maintainers')
         read_only_fields = BaseMessageSerializer.Meta.read_only_fields + subclass_read_only_fields
 
     resource_uri = HyperlinkedMessageField(view_name='series-detail')
+    mbox_uri = HyperlinkedMessageField(view_name='series-mbox')
     message = HyperlinkedMessageField(view_name='messages-detail')
     results = HyperlinkedMessageField(view_name='results-list', lookup_field='series_message_id')
     total_patches = SerializerMethodField()
@@ -474,6 +489,14 @@ class ProjectSeriesViewSet(ProjectMessagesViewSetMixin,
     def perform_destroy(self, instance):
         Message.objects.delete_subthread(instance)
 
+    @action(detail=True, renderer_classes=[StaticTextRenderer])
+    def mbox(self, request, *args, **kwargs):
+        message = self.get_object()
+        mbox = message.get_mbox_with_tags()
+        if not mbox:
+            raise Http404("Series not complete")
+        return Response(mbox)
+
 
 # Messages
 
@@ -506,19 +529,6 @@ class MessageCreationSerializer(BaseMessageSerializer):
 
     mbox = CharField()
 
-class StaticTextRenderer(renderers.BaseRenderer):
-    media_type = 'text/plain'
-    format = 'mbox'
-
-    def render(self, data, accepted_media_type=None, renderer_context=None):
-        renderer_context = renderer_context or {}
-        response = renderer_context.get('response')
-        if response and response.exception:
-            return '%d %s' % (response.status_code, response.status_text.title())
-        else:
-            return data
-
-
 class MessagePlainTextParser(BaseParser):
     media_type = 'message/rfc822'
 
diff --git a/mods/git.py b/mods/git.py
index 6135f28..42a932e 100644
--- a/mods/git.py
+++ b/mods/git.py
@@ -12,6 +12,7 @@ import os
 import subprocess
 import hashlib
 import json
+import rest_framework
 from django.conf.urls import url
 from django.http import Http404, HttpResponseRedirect
 from django.urls import reverse
@@ -275,6 +276,12 @@ class ApplierGetView(APILoginRequiredView):
             response["git.repo"] = base.data["repo"]
             response["git.base"] = base.data["tag"]
         response["project.git"] = po.git
+        response["mbox_uri"] = rest_framework.reverse.reverse("series-mbox",
+                                                              kwargs={
+                                                                  'projects_pk': m.project_id,
+                                                                  'message_id': m.message_id,
+                                                              },
+                                                              request=request)
         response["result_uri"] = reverse_detail(m.git_result, request)
         return response
 
-- 
2.21.0





More information about the Patchew-devel mailing list