[Patchew-devel] [PATCH 2/5] rest: create Result object

Paolo Bonzini pbonzini at redhat.com
Sat Mar 17 14:47:11 UTC 2018


Result objects were introduced first in the REST API.  As a first
step towards making them a first-class model, let rest_results_hook
return Result namedtuples.

Even though for now they are just converted back to a dictionary in
the get_results method, they will get their own serializer later.

Signed-off-by: Paolo Bonzini <pbonzini at redhat.com>
---
 api/rest.py     | 17 +++++++++++++++--
 mods/git.py     | 13 ++++++++-----
 mods/testing.py |  8 +++-----
 3 files changed, 26 insertions(+), 12 deletions(-)

diff --git a/api/rest.py b/api/rest.py
index 7c131a4..0bb3c30 100644
--- a/api/rest.py
+++ b/api/rest.py
@@ -8,6 +8,8 @@
 # This work is licensed under the MIT License.  Please see the LICENSE file or
 # http://opensource.org/licenses/MIT.
 
+from collections import namedtuple
+
 from django.contrib.auth.models import User
 from django.template import loader
 
@@ -140,6 +142,17 @@ class ProjectMessagesViewSetMixin(mixins.RetrieveModelMixin):
     def get_queryset(self):
         return self.queryset.filter(project=self.kwargs['projects_pk'])
 
+class Result(namedtuple("Result", "name status log_url data")):
+    __slots__ = ()
+
+    def __new__(cls, name, status, log_url=None, data=None, request=None):
+        if log_url is not None and request is not None:
+            log_url = request.build_absolute_uri(log_url)
+        if status not in ('pending', 'success', 'failure'):
+            raise ValueError("invalid value '%s' for status field" % status)
+        return super(cls, Result).__new__(cls, status=status, log_url=log_url,
+                                          data=data, name=name)
+
 # Series
 
 class ReplySerializer(BaseMessageSerializer):
@@ -177,11 +190,11 @@ class SeriesSerializer(BaseMessageSerializer):
         return fields
 
     def get_results(self, message):
-        results = {}
+        results = []
         request = self.context['request']
         dispatch_module_hook("rest_results_hook", request=request,
                              message=message, results=results)
-        return results
+        return {x.name: x._asdict() for x in results}
 
     def get_total_patches(self, obj):
         return obj.get_total_patches()
diff --git a/mods/git.py b/mods/git.py
index 69b5da8..fc71174 100644
--- a/mods/git.py
+++ b/mods/git.py
@@ -21,6 +21,7 @@ from django.utils.html import format_html
 from mod import PatchewModule
 from event import declare_event, register_handler, emit_event
 from api.models import Project, Message, MessageProperty
+from api.rest import Result
 from api.views import APILoginRequiredView, prepare_series
 from patchew.logviewer import LogView
 from schema import *
@@ -115,19 +116,21 @@ class GitModule(PatchewModule):
 
     def rest_results_hook(self, request, message, results):
         l = message.get_property("git.apply-log")
+        data = None
         if l:
             if message.get_property("git.apply-failed"):
-                result = {'status' : 'failure'}
+                status = 'failure'
             else:
                 git_repo = message.get_property("git.repo")
                 git_tag = message.get_property("git.tag")
                 data = {'repo': git_repo, 'tag': 'refs/tags/' + git_tag}
-                result = {'status': 'success', 'data': data}
+                status = 'success'
             log_url = reverse("git-log", kwargs={'series': message.message_id})
-            result['log_url'] = request.build_absolute_uri(log_url)
         else:
-            result = {'status': 'pending'}
-        results['git'] = result
+            status = 'pending'
+            log_url = None
+        results.append(Result(name='git', status=status, log_url=log_url, data=data,
+                              request=request))
 
     def prepare_message_hook(self, request, message, detailed):
         if not message.is_series_head:
diff --git a/mods/testing.py b/mods/testing.py
index 24bd509..970256d 100644
--- a/mods/testing.py
+++ b/mods/testing.py
@@ -20,6 +20,7 @@ import smtplib
 import email
 import traceback
 import math
+from api.rest import Result
 from api.views import APILoginRequiredView
 from api.models import Message, Project, MessageProperty
 from api.search import SearchEngine
@@ -289,11 +290,8 @@ class TestingModule(PatchewModule):
             failed = not p["passed"]
             log_url = self.reverse_testing_log(message, tn, request=request, html=False)
             passed_str = "failure" if failed else "success"
-            result = {
-                'status': passed_str,
-                'log_url': log_url
-            }
-            results['testing.' + tn] = result
+            results.append(Result(name='testing.' + tn, status=passed_str, log_url=log_url,
+                                  request=request))
 
     def prepare_message_hook(self, request, message, detailed):
         if not message.is_series_head:
-- 
2.16.2





More information about the Patchew-devel mailing list