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.d...@linaro.org> Reviewed-by: Stephen Finucane <stephen.finuc...@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 44be7d1..44db223 100644 --- a/patchwork/tests/test_rest_api.py +++ b/patchwork/tests/test_rest_api.py @@ -58,6 +58,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_create(self): """Ensure anonymous POST operations are rejected.""" defaults.project.save() diff --git a/patchwork/views/rest_api.py b/patchwork/views/rest_api.py index 34c5161..54c5c18 100644 --- a/patchwork/views/rest_api.py +++ b/patchwork/views/rest_api.py @@ -116,6 +116,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 _______________________________________________ Patchwork mailing list Patchwork@lists.ozlabs.org https://lists.ozlabs.org/listinfo/patchwork