[Patchew-devel] [PATCH 3/9] testing: include result URI in testing-get API response

Paolo Bonzini pbonzini at redhat.com
Sat Aug 18 14:10:27 UTC 2018


This is simpler to use than the "identity" field, if patchew-cli is going to
use a PUT request to the REST API instead of testing-report.

Signed-off-by: Paolo Bonzini <pbonzini at redhat.com>
---
 api/rest.py     | 28 ++++++++++++++++++++++++++++
 mods/testing.py | 16 ++++++++++------
 2 files changed, 38 insertions(+), 6 deletions(-)

diff --git a/api/rest.py b/api/rest.py
index 9ec0ae8..bd46211 100644
--- a/api/rest.py
+++ b/api/rest.py
@@ -77,6 +77,34 @@ class PatchewPermission(permissions.BasePermission):
 class ImportPermission(PatchewPermission):
     allowed_groups = ('importers',)
 
+# utility function to generate REST API URLs
+
+def reverse_detail(obj, request):
+    if isinstance(obj, Project):
+        return rest_framework.reverse.reverse("project-detail",
+                                              request=request,
+                                              kwargs={"pk": obj.id})
+    if isinstance(obj, Message):
+        assert obj.is_series_head
+        return rest_framework.reverse.reverse("series-detail",
+                                              request=request,
+                                              kwargs={"projects_pk": obj.project.id,
+                                                      "message_id": obj.message_id})
+    if isinstance(obj, ProjectResult):
+        po = obj.obj
+        return rest_framework.reverse.reverse("results-detail",
+                                              request=request,
+                                              kwargs={"projects_pk": po.id,
+                                                      "name": obj.name})
+    if isinstance(obj, MessageResult):
+        m = obj.obj
+        return rest_framework.reverse.reverse("results-detail",
+                                              request=request,
+                                              kwargs={"projects_pk": m.project.id,
+                                                      "series_message_id": m.message_id,
+                                                      "name": obj.name}),
+    raise Error("unhandled object type")
+
 # pluggable field for plugin support
 
 class PluginMethodField(SerializerMethodField):
diff --git a/mods/testing.py b/mods/testing.py
index 0266fb9..ecd63d1 100644
--- a/mods/testing.py
+++ b/mods/testing.py
@@ -20,6 +20,7 @@ import math
 from api.views import APILoginRequiredView
 from api.models import (Message, MessageProperty, MessageResult,
         Project, ProjectResult, Result)
+from api.rest import reverse_detail
 from api.search import SearchEngine
 from event import emit_event, declare_event, register_handler
 from patchew.logviewer import LogView
@@ -388,17 +389,18 @@ class TestingGetView(APILoginRequiredView):
     name = "testing-get"
     allowed_groups = ["testers"]
 
-    def _generate_test_data(self, project, repo, head, base, identity, test):
+    def _generate_test_data(self, project, repo, head, base, identity, result_uri, test):
         r = {"project": project,
              "repo": repo,
              "head": head,
              "base": base,
              "test": test,
-             "identity": identity
+             "identity": identity,
+             "result_uri": result_uri,
              }
         return r
 
-    def _generate_series_test_data(self, s, test):
+    def _generate_series_test_data(self, request, s, result, test):
         gr = s.git_result
         assert gr.is_success()
         return self._generate_test_data(project=s.project.name,
@@ -410,15 +412,17 @@ class TestingGetView(APILoginRequiredView):
                                             "message-id": s.message_id,
                                             "subject": s.subject,
                                         },
+                                        result_uri=reverse_detail(result, request),
                                         test=test)
 
-    def _generate_project_test_data(self, project, repo, head, base, test):
+    def _generate_project_test_data(self, request, project, repo, head, base, result, test):
         return self._generate_test_data(project=project,
                                         repo=repo, head=head, base=base,
                                         identity={
                                             "type": "project",
                                             "head": head,
                                         },
+                                        result_uri=reverse_detail(result, request),
                                         test=test)
 
     def _find_applicable_test(self, queryset, user, po, tester, capabilities):
@@ -448,7 +452,7 @@ class TestingGetView(APILoginRequiredView):
         candidates = self._find_applicable_test(ProjectResult.objects.filter(project=po),
                                                 request.user, po, tester, capabilities)
         for r, test in candidates:
-            td = self._generate_project_test_data(po.name, repo, head, tested, test)
+            td = self._generate_project_test_data(request, po.name, repo, head, tested, r, test)
             return r, po, td
         return None
 
@@ -457,7 +461,7 @@ class TestingGetView(APILoginRequiredView):
                                                 request.user, po, tester, capabilities)
         for r, test in candidates:
             s = r.message
-            td = self._generate_series_test_data(s, test)
+            td = self._generate_series_test_data(request, s, r, test)
             return r, s, td
         return None
 
-- 
2.17.1





More information about the Patchew-devel mailing list