]> git.ipfire.org Git - thirdparty/patchwork.git/commitdiff
REST: Allow projects to be retrieved by linkname
authorAndy Doan <andy.doan@linaro.org>
Thu, 16 Jun 2016 21:13:25 +0000 (16:13 -0500)
committerStephen Finucane <stephen.finucane@intel.com>
Mon, 27 Jun 2016 17:20:37 +0000 (18:20 +0100)
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@linaro.org>
Reviewed-by: Stephen Finucane <stephen.finucane@intel.com>
patchwork/tests/test_rest_api.py
patchwork/views/rest_api.py

index 4f5886f7f034a53173bfedc8b4ca4755e4984e37..8131c6463e1eae076137357da79177ee48cf772f 100644 (file)
@@ -60,6 +60,20 @@ class TestProjectAPI(APITestCase):
         self.assertEqual(status.HTTP_200_OK, resp.status_code)
         self.assertEqual(self.project.name, resp.data['name'])
 
+        # make sure we can look up by linkname
+        resp = self.client.get(self.api_url(resp.data['link_name']))
+        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_create(self):
         """Ensure anonymous POST operations are rejected."""
         resp = self.client.post(
index 7d798a1af3357ef6cf756a6770225beecb68e6ac..d4125879deb6980d228295bbeafa4acb976c3459 100644 (file)
@@ -101,6 +101,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 PatchViewSet(PatchworkViewSet):
     permission_classes = (PatchworkPermission,)