[Patchew-devel] [PATCH 03/11] rest: include everything after .../by-name/NAME/ in the redirect location

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


This will allow patchew-cli to do a request to project/by-name/QEMU/tester-get,
for example.

Signed-off-by: Paolo Bonzini <pbonzini at redhat.com>
---
 api/rest.py        | 24 ++++++++++++++++++++----
 api/urls.py        |  2 +-
 tests/test_rest.py |  4 ++++
 3 files changed, 25 insertions(+), 5 deletions(-)

diff --git a/api/rest.py b/api/rest.py
index 3b6ab2f..e64c828 100644
--- a/api/rest.py
+++ b/api/rest.py
@@ -16,7 +16,7 @@ from django.template import loader
 from mod import dispatch_module_hook
 from .models import Project, ProjectResult, Message, MessageResult, Result
 from .search import SearchEngine
-from rest_framework import (permissions, serializers, viewsets, filters,
+from rest_framework import (permissions, serializers, generics, viewsets, filters,
                             mixins, renderers, status)
 from rest_framework.decorators import action
 from rest_framework.fields import SerializerMethodField, CharField, JSONField, EmailField, ListField
@@ -237,16 +237,32 @@ class ProjectsViewSet(viewsets.ModelViewSet):
         return Response({"new_head": project.project_head, "count": ret})
 
 
-class ProjectsByNameViewSet(viewsets.GenericViewSet):
+class ProjectsByNameView(generics.GenericAPIView):
+    serializer_class = ProjectSerializer
     queryset = Project.objects.all()
-    permission_classes = (PatchewPermission,)
     lookup_field = 'name'
 
-    def retrieve(self, request, *args, **kwargs):
+    def _redirect(self, request, *args, **kwargs):
         instance = self.get_object()
         url = reverse_detail(instance, request)
+        if kwargs['tail']:
+            tail = kwargs['tail']
+            if kwargs['tail'][0] == '/' and url[-1] == '/':
+                tail = tail[1:]
+            url += tail
+        params = request.query_params.urlencode()
+        if params:
+            url += "?" + params
         return HttpResponseRedirect(url, status=status.HTTP_307_TEMPORARY_REDIRECT)
 
+    delete = _redirect
+    get = _redirect
+    head = _redirect
+    options = _redirect
+    patch = _redirect
+    post = _redirect
+    put = _redirect
+
 
 # Common classes for series and messages
 
diff --git a/api/urls.py b/api/urls.py
index b1e259f..2383f2a 100644
--- a/api/urls.py
+++ b/api/urls.py
@@ -34,7 +34,6 @@ router = DefaultRouter(trailing_slash=True)
 router.include_format_suffixes = False
 router.register('users', rest.UsersViewSet)
 router.register('projects', rest.ProjectsViewSet)
-router.register('projects/by-name', rest.ProjectsByNameViewSet)
 router.register('series', rest.SeriesViewSet, base_name='series')
 router.register('messages', rest.MessagesViewSet)
 
@@ -51,6 +50,7 @@ results_router.register('results', rest.SeriesResultsViewSet, base_name='results
 schema_view = get_schema_view(title='API schema')
 
 urlpatterns = _build_urls() + [
+    url(r'^v1/projects/by-name/(?P<name>[^/]*)(?P<tail>/.*|$)', rest.ProjectsByNameView.as_view()),
     url(r'^v1/users/login/$', LoginView.as_view(), name='rest_login'),
     url(r'^v1/users/logout/$', LogoutView.as_view(), name='rest_logout'),
     url(r"^v1/", include(router.urls)),
diff --git a/tests/test_rest.py b/tests/test_rest.py
index d6cbf62..36ff739 100755
--- a/tests/test_rest.py
+++ b/tests/test_rest.py
@@ -91,6 +91,10 @@ class RestTest(PatchewTestCase):
         self.assertEquals(resp.data['resource_uri'], self.PROJECT_BASE)
         self.assertEquals(resp.data['name'], "QEMU")
         self.assertEquals(resp.data['mailing_list'], "qemu-devel at nongnu.org")
+        resp = self.api_client.get(self.REST_BASE + 'projects/by-name/QEMU/?some=thing&foo=bar')
+        self.assertEquals(resp.status_code, 307)
+        self.assertIn('some=thing', resp['Location'])
+        self.assertIn('foo=bar', resp['Location'])
 
     def test_project_config_get(self):
         self.p.config = {
-- 
2.21.0





More information about the Patchew-devel mailing list