[Patchew-devel] [PATCH 1/8] rest: create Result object

Paolo Bonzini pbonzini at redhat.com
Sat Mar 24 13:37:12 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/models.py   | 14 ++++++++++++++
 api/rest.py     |  4 ++--
 mods/git.py     | 14 ++++++++------
 mods/testing.py |  9 +++------
 4 files changed, 27 insertions(+), 14 deletions(-)

diff --git a/api/models.py b/api/models.py
index de01a61..9b52693 100644
--- a/api/models.py
+++ b/api/models.py
@@ -9,12 +9,14 @@
 # http://opensource.org/licenses/MIT.
 
 
+from collections import namedtuple
 import os
 import json
 import datetime
 import re
 import uuid
 import logging
+
 from django.conf import settings
 from django.db import models
 from django.contrib.auth.models import User
@@ -592,3 +594,15 @@ class Module(models.Model):
 
     def __str__(self):
         return self.name
+
+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)
+
diff --git a/api/rest.py b/api/rest.py
index 7c131a4..8c11050 100644
--- a/api/rest.py
+++ b/api/rest.py
@@ -177,11 +177,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 a077682..bf812df 100644
--- a/mods/git.py
+++ b/mods/git.py
@@ -18,7 +18,7 @@ from django.core.exceptions import PermissionDenied
 from django.utils.html import format_html
 from mod import PatchewModule
 from event import declare_event, register_handler, emit_event
-from api.models import Message, MessageProperty
+from api.models import Message, MessageProperty, Result
 from api.views import APILoginRequiredView, prepare_series
 from patchew.logviewer import LogView
 from schema import *
@@ -113,19 +113,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 7e15f56..52407b7 100644
--- a/mods/testing.py
+++ b/mods/testing.py
@@ -17,7 +17,7 @@ from mod import PatchewModule
 import time
 import math
 from api.views import APILoginRequiredView
-from api.models import Message, Project, MessageProperty
+from api.models import Message, MessageProperty, Project, Result
 from api.search import SearchEngine
 from event import emit_event, declare_event, register_handler
 from patchew.logviewer import LogView
@@ -284,11 +284,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