[Patchew-devel] [PATCH 1/4] add result renderer infrastructure

Paolo Bonzini pbonzini at redhat.com
Mon Apr 23 12:14:20 UTC 2018


Plugins can prepare the "status" section of the series/message detail
pages from the same Result objects used by the REST API.  Record in the
Result the object that created it, so that it can prepare an HTML
rendering of the Result.

Signed-off-by: Paolo Bonzini <pbonzini at redhat.com>
---
 api/models.py                     | 11 ++++++++---
 static/css/base.css               |  6 ++++--
 www/templates/project-detail.html |  9 +++++++++
 www/templates/series-detail.html  |  9 +++++++++
 www/views.py                      | 18 ++++++++++++++++++
 5 files changed, 48 insertions(+), 5 deletions(-)

diff --git a/api/models.py b/api/models.py
index 9aa1196..501070c 100644
--- a/api/models.py
+++ b/api/models.py
@@ -601,13 +601,18 @@ class Module(models.Model):
     def __str__(self):
         return self.name
 
-class Result(namedtuple("Result", "name status log log_url obj data")):
+class Result(namedtuple("Result", "name status log log_url obj data renderer")):
     __slots__ = ()
 
-    def __new__(cls, name, status, obj, log=None, log_url=None, data=None, request=None):
+    def __new__(cls, name, status, obj, log=None, log_url=None, data=None, request=None, renderer=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=log, log_url=log_url,
-                                          obj=obj, data=data, name=name)
+                                          obj=obj, data=data, name=name, renderer=renderer)
+
+    def render(self):
+        if self.renderer is None:
+            return None
+        return self.renderer.render_result(self)
diff --git a/static/css/base.css b/static/css/base.css
index 82995f5..35fba6e 100644
--- a/static/css/base.css
+++ b/static/css/base.css
@@ -137,10 +137,12 @@ h1, h2, h3, .h1, .h2, .h3 {
 .status-content > .fa {
     color: #337ab7;
 }
-.status-content.status-alert > .fa {
+.status-content.status-alert > .fa,
+.status-content.status-failure > .fa {
     color: #CC0000;
 }
-.status-content.status-good > .fa {
+.status-content.status-good > .fa,
+.status-content.status-success > .fa {
     color: #009900;
 }
 .status-content > div {
diff --git a/www/templates/project-detail.html b/www/templates/project-detail.html
index 80fce3b..aaccdc0 100644
--- a/www/templates/project-detail.html
+++ b/www/templates/project-detail.html
@@ -41,6 +41,15 @@
   </div>
 </div>
 {% endif %}
+{% for result in results %}
+<div class="status-content status-{{ result.status }}">
+ {% if result.status == "pending" %} <span class="fa fa-lg fa-hourglass"></span>
+ {% elif result.status == "running" %} <span class="fa fa-lg fa-refresh fa-spin"></span>
+ {% elif result.status == "failure" %} <span class="fa fa-lg fa-warning"></span>
+ {% elif result.status == "success" %} <span class="fa fa-lg fa-check"></span>{% endif %}
+ <div>{{ result.html }}</div>
+</div>
+{% endfor %}
 {% for status in project.extra_status %}
  <div class="status-content{% if status.kind %} status-{{ status.kind }}{% endif %}">
  {% if status.icon %}<span class="fa fa-lg fa-{{ status.icon }}"></span>
diff --git a/www/templates/series-detail.html b/www/templates/series-detail.html
index 434bc35..9b2db1c 100644
--- a/www/templates/series-detail.html
+++ b/www/templates/series-detail.html
@@ -56,6 +56,15 @@
    <div>Only {{ series.num_patches }} patches received!</div>
 </div>
 {% endif %}
+{% for result in results %}
+<div class="status-content status-{{ result.status }}">
+ {% if result.status == "pending" %} <span class="fa fa-lg fa-hourglass"></span>
+ {% elif result.status == "running" %} <span class="fa fa-lg fa-refresh fa-spin"></span>
+ {% elif result.status == "failure" %} <span class="fa fa-lg fa-warning"></span>
+ {% elif result.status == "success" %} <span class="fa fa-lg fa-check"></span>{% endif %}
+ <div>{{ result.html }}</div>
+</div>
+{% endfor %}
 {% for status in series.extra_status %}
  <div class="status-content{% if status.kind %} status-{{ status.kind }}{% endif %}">
  {% if status.icon %}<span class="fa fa-lg fa-{{ status.icon }}"></span>
diff --git a/www/views.py b/www/views.py
index 8965ebf..b0ccf48 100644
--- a/www/views.py
+++ b/www/views.py
@@ -91,6 +91,21 @@ def prepare_series(request, s, skip_patches=False):
     add_msg_recurse(s, skip_patches)
     return r
 
+def prepare_results(request, obj):
+    results = []
+    dispatch_module_hook("rest_results_hook", request=request,
+                         obj=obj, results=results, detailed=False)
+
+    results_dicts = []
+    for result in results:
+        html = result.render()
+        if html is None:
+            continue
+        d = result._asdict()
+        d['html'] = html
+        results_dicts.append(d)
+    return results_dicts
+
 def prepare_series_list(request, sl):
     return [prepare_message(request, s, False) for s in sl]
 
@@ -204,6 +219,7 @@ def view_project_detail(request, project):
     po.extra_ops = []
     dispatch_module_hook("prepare_project_hook", request=request, project=po)
     return render_page(request, "project-detail.html",
+                       results=prepare_results(request, po),
                        project=po,
                        navigate_links=nav_path,
                        search="")
@@ -255,6 +271,7 @@ def view_series_detail(request, project, message_id):
                        project=project,
                        navigate_links=nav_path,
                        search=search,
+                       results=prepare_results(request, s),
                        patches=prepare_patches(request, s),
                        messages=prepare_series(request, s, is_cover_letter))
 
@@ -280,5 +297,6 @@ def view_series_message(request, project, thread_id, message_id):
                        project=project,
                        navigate_links=nav_path,
                        search=search,
+                       results=[],
                        patches=prepare_patches(request, s),
                        messages=prepare_series(request, m))
-- 
2.17.0





More information about the Patchew-devel mailing list