[PATCH v3 10/10] REST: Allow projects to be retrieved by linkname
Andy Doan
andy.doan at linaro.org
Thu May 19 13:31:02 AEST 2016
Building a user-friendly CLI becomes difficult when project-ids are
required. It also makes it almost impossible to work with the current
format of the .pwclientrc file.
Signed-off-by: Andy Doan <andy.doan at linaro.org>
Reviewed-by: Stephen Finucane <stephen.finucane at intel.com>
---
patchwork/tests/test_rest_api.py | 14 ++++++++++++++
patchwork/views/rest_api.py | 18 ++++++++++++++++++
2 files changed, 32 insertions(+)
diff --git a/patchwork/tests/test_rest_api.py b/patchwork/tests/test_rest_api.py
index 7ac9852..cd623ef 100644
--- a/patchwork/tests/test_rest_api.py
+++ b/patchwork/tests/test_rest_api.py
@@ -59,6 +59,20 @@ class TestProjectAPI(APITestCase):
self.assertEqual(status.HTTP_200_OK, resp.status_code)
self.assertEqual(defaults.project.name, resp.data['name'])
+ # make sure we can look up by linkname
+ resp = self.client.get(self.api_url(resp.data['linkname']))
+ self.assertEqual(status.HTTP_200_OK, resp.status_code)
+ self.assertEqual(defaults.project.name, resp.data['name'])
+
+ def test_get_numeric_linkname(self):
+ """Validate we try to do the right thing for numeric linkname"""
+ project = Project(linkname='12345', name='Test Project',
+ listid='test.example.com')
+ project.save()
+ resp = self.client.get(self.api_url('12345'))
+ self.assertEqual(status.HTTP_200_OK, resp.status_code)
+ self.assertEqual(project.name, resp.data['name'])
+
def test_anonymous_writes(self):
"""Ensure anonymous "write" operations are rejected."""
defaults.project.save()
diff --git a/patchwork/views/rest_api.py b/patchwork/views/rest_api.py
index b7b0c4b..d2d2e9d 100644
--- a/patchwork/views/rest_api.py
+++ b/patchwork/views/rest_api.py
@@ -108,6 +108,24 @@ class ProjectViewSet(PatchworkViewSet):
permission_classes = (PatchworkPermission, )
serializer_class = ProjectSerializer
+ def _handle_linkname(self, pk):
+ '''Make it easy for users to list by project-id or linkname'''
+ qs = self.get_queryset()
+ try:
+ qs.get(id=pk)
+ except (self.serializer_class.Meta.model.DoesNotExist, ValueError):
+ # probably a non-numeric value which means we are going by linkname
+ self.kwargs = {'linkname': pk} # try and lookup by linkname
+ self.lookup_field = 'linkname'
+
+ def retrieve(self, request, pk=None):
+ self._handle_linkname(pk)
+ return super(ProjectViewSet, self).retrieve(request, pk)
+
+ def partial_update(self, request, pk=None):
+ self._handle_linkname(pk)
+ return super(ProjectViewSet, self).partial_update(request, pk)
+
class ChecksViewSet(PatchworkViewSet):
serializer_class = ChecksSerializer
--
2.7.4
More information about the Patchwork
mailing list