[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