[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