[Patchew-devel] [PATCH 6/8] rest: add project results

Paolo Bonzini pbonzini at redhat.com
Sat Mar 24 13:37:17 UTC 2018


Another tiny step towards the Result model, allowing test results
for a project to be expressed in the REST API.
---
 api/rest.py        | 28 ++++++++++++++++++++--------
 api/urls.py        |  1 +
 mods/git.py        |  2 ++
 tests/test_rest.py |  5 +++++
 4 files changed, 28 insertions(+), 8 deletions(-)

diff --git a/api/rest.py b/api/rest.py
index 9b1f103..bb56b4b 100644
--- a/api/rest.py
+++ b/api/rest.py
@@ -93,7 +93,10 @@ class ProjectSerializer(serializers.HyperlinkedModelSerializer):
     class Meta:
         model = Project
         fields = ('resource_uri', 'name', 'mailing_list', 'prefix_tags', 'url', 'git', \
-                  'description', 'display_order', 'logo', 'parent_project')
+                  'description', 'display_order', 'logo', 'parent_project', 'results')
+
+    results = HyperlinkedIdentityField(view_name='results-list', lookup_field='pk',
+                                       lookup_url_kwarg='projects_pk')
 
 class ProjectsViewSet(viewsets.ModelViewSet):
     queryset = Project.objects.all().order_by('id')
@@ -319,8 +322,12 @@ class MessagesViewSet(ProjectMessagesViewSetMixin,
 class HyperlinkedResultField(HyperlinkedIdentityField):
     def get_url(self, result, view_name, request, format):
         obj = result.obj
-        kwargs = {'projects_pk': obj.project_id, 'series_message_id': obj.message_id,
-                  'name': result.name}
+        kwargs = {'name': result.name}
+        if isinstance(obj, Message):
+            kwargs['projects_pk'] = obj.project_id
+            kwargs['series_message_id'] = obj.message_id
+        else:
+            kwargs['projects_pk'] = obj.id
         return self.reverse(view_name, kwargs=kwargs, request=request, format=format)
 
 class ResultSerializer(serializers.Serializer):
@@ -333,14 +340,10 @@ class ResultSerializer(serializers.Serializer):
 class ResultSerializerFull(ResultSerializer):
     log = CharField(required=False)
 
-class SeriesResultsViewSet(viewsets.ViewSet, generics.GenericAPIView):
+class ResultsViewSet(viewsets.ViewSet, generics.GenericAPIView):
     lookup_field = 'name'
     lookup_value_regex = '[^/]+'
 
-    def get_queryset(self):
-        return Message.objects.filter(project=self.kwargs['projects_pk'],
-                                      message_id=self.kwargs['series_message_id'])
-
     def get_serializer_class(self, *args, **kwargs):
         if self.lookup_field in self.kwargs:
             return ResultSerializerFull
@@ -376,3 +379,12 @@ class SeriesResultsViewSet(viewsets.ViewSet, generics.GenericAPIView):
             raise Http404
         serializer = self.get_serializer(result)
         return Response(serializer.data)
+
+class ProjectResultsViewSet(ResultsViewSet):
+    def get_queryset(self):
+        return Project.objects.filter(id=self.kwargs['projects_pk'])
+
+class SeriesResultsViewSet(ResultsViewSet):
+    def get_queryset(self):
+        return Message.objects.filter(project=self.kwargs['projects_pk'],
+                                      message_id=self.kwargs['series_message_id'])
diff --git a/api/urls.py b/api/urls.py
index becabeb..64e9629 100644
--- a/api/urls.py
+++ b/api/urls.py
@@ -34,6 +34,7 @@ router.register('series', rest.SeriesViewSet, base_name='series')
 
 projects_router = NestedDefaultRouter(router, 'projects', lookup='projects', trailing_slash=True)
 projects_router.include_format_suffixes = False
+projects_router.register('results', rest.ProjectResultsViewSet, base_name='results')
 projects_router.register('series', rest.ProjectSeriesViewSet, base_name='series')
 projects_router.register('messages', rest.MessagesViewSet, base_name='messages')
 
diff --git a/mods/git.py b/mods/git.py
index 6d4f365..1f22f2e 100644
--- a/mods/git.py
+++ b/mods/git.py
@@ -112,6 +112,8 @@ class GitModule(PatchewModule):
         return upstream, branch
 
     def rest_results_hook(self, request, obj, results, detailed=False):
+        if not isinstance(obj, Message):
+            return
         log = obj.get_property("git.apply-log")
         data = None
         if log:
diff --git a/tests/test_rest.py b/tests/test_rest.py
index 391714f..261456b 100755
--- a/tests/test_rest.py
+++ b/tests/test_rest.py
@@ -122,6 +122,11 @@ class RestTest(PatchewTestCase):
         self.assertEquals(resp.data['logo'], None)
         self.assertEquals(resp.data['parent_project'], self.PROJECT_BASE)
 
+    def test_project_results_list(self):
+        resp1 = self.api_client.get(self.PROJECT_BASE)
+        resp = self.api_client.get(resp1.data['results'])
+        self.assertEqual(resp.data['count'], len(resp.data['results']))
+
     def test_series_single(self):
         resp = self.apply_and_retrieve('0001-simple-patch.mbox.gz',
                                        self.p.id, '20160628014747.20971-1-famz at redhat.com')
-- 
2.16.2





More information about the Patchew-devel mailing list