This will allow patchew-cli to do a request to project/by-name/QEMU/tester-get,
for example.
Signed-off-by: Paolo Bonzini <pbonzini@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@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
_______________________________________________
Patchew-devel mailing list
Patchew-devel@redhat.com
https://www.redhat.com/mailman/listinfo/patchew-devel