[LNT] r311756 - Avoid database queries inside page templates

Matthias Braun via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 24 19:32:52 PDT 2017


Author: matze
Date: Thu Aug 24 19:32:52 2017
New Revision: 311756

URL: http://llvm.org/viewvc/llvm-project?rev=311756&view=rev
Log:
Avoid database queries inside page templates

Doing database queries inside page templates is bad style and makes it
hard to find all code working with the database.

This introduces the ts_data() function which can be used to get default
values for things used by layout.html. This also fixes some pages where
the baseline menu wouldn't work as expected.

Modified:
    lnt/trunk/lnt/server/ui/globals.py
    lnt/trunk/lnt/server/ui/profile_views.py
    lnt/trunk/lnt/server/ui/regression_views.py
    lnt/trunk/lnt/server/ui/templates/all_machines.html
    lnt/trunk/lnt/server/ui/templates/layout.html
    lnt/trunk/lnt/server/ui/templates/v4_order.html
    lnt/trunk/lnt/server/ui/views.py

Modified: lnt/trunk/lnt/server/ui/globals.py
URL: http://llvm.org/viewvc/llvm-project/lnt/trunk/lnt/server/ui/globals.py?rev=311756&r1=311755&r2=311756&view=diff
==============================================================================
--- lnt/trunk/lnt/server/ui/globals.py (original)
+++ lnt/trunk/lnt/server/ui/globals.py Thu Aug 24 19:32:52 2017
@@ -43,5 +43,4 @@ def register(env):
     env.globals.update(
         db_url_for=db_url_for,
         v4_url_for=v4_url_for,
-        v4_url_available=v4_url_available,
-        baseline_key=lnt.server.ui.util.baseline_key)
+        v4_url_available=v4_url_available)

Modified: lnt/trunk/lnt/server/ui/profile_views.py
URL: http://llvm.org/viewvc/llvm-project/lnt/trunk/lnt/server/ui/profile_views.py?rev=311756&r1=311755&r2=311756&view=diff
==============================================================================
--- lnt/trunk/lnt/server/ui/profile_views.py (original)
+++ lnt/trunk/lnt/server/ui/profile_views.py Thu Aug 24 19:32:52 2017
@@ -18,6 +18,7 @@ import os
 import json
 from lnt.server.ui.decorators import v4_route, frontend
 from lnt.server.ui.globals import v4_url_for
+from lnt.server.ui.views import ts_data
 
 
 @frontend.route('/profile/admin')
@@ -201,6 +202,5 @@ def v4_profile(testid, run1_id, run2_id=
             v4_url_for('.v4_profile_ajax_getCodeForFunction'),
     }
     return render_template("v4_profile.html",
-                           ts=ts, test=test,
-                           run1=json_run1, run2=json_run2,
-                           urls=urls)
+                           test=test, run1=json_run1, run2=json_run2,
+                           urls=urls, **ts_data(ts))

Modified: lnt/trunk/lnt/server/ui/regression_views.py
URL: http://llvm.org/viewvc/llvm-project/lnt/trunk/lnt/server/ui/regression_views.py?rev=311756&r1=311755&r2=311756&view=diff
==============================================================================
--- lnt/trunk/lnt/server/ui/regression_views.py (original)
+++ lnt/trunk/lnt/server/ui/regression_views.py Thu Aug 24 19:32:52 2017
@@ -17,6 +17,7 @@ from wtforms.validators import DataRequi
 from lnt.server.ui.decorators import v4_route
 import lnt.server.reporting.analysis
 from lnt.server.ui.globals import v4_url_for
+from lnt.server.ui.views import ts_data
 
 from lnt.util import logger
 from lnt.server.ui.util import FLASH_DANGER, FLASH_SUCCESS, PrecomputedCR
@@ -96,7 +97,7 @@ def v4_new_regressions():
     return render_template("v4_new_regressions.html",
                            testsuite_name=g.testsuite_name,
                            changes=crs, analysis=lnt.server.reporting.analysis,
-                           form=form)
+                           form=form, **ts_data(ts))
 
 
 def calc_impact(ts, fcs):
@@ -228,7 +229,8 @@ def v4_regression_list():
                            sizes=regression_sizes,
                            impacts=impacts,
                            ages=ages,
-                           analysis=lnt.server.reporting.analysis)
+                           analysis=lnt.server.reporting.analysis,
+                           **ts_data(ts))
 
 
 def _get_regressions_from_selected_form(form, ts):
@@ -376,7 +378,8 @@ def v4_regression_detail(id):
                            testsuite_name=g.testsuite_name,
                            regression=regression_info, changes=crs,
                            form=form, analysis=lnt.server.reporting.analysis,
-                           check_all=checkbox_state)
+                           check_all=checkbox_state,
+                           **ts_data(ts))
 
 
 @v4_route("/hook", methods=["GET"])

Modified: lnt/trunk/lnt/server/ui/templates/all_machines.html
URL: http://llvm.org/viewvc/llvm-project/lnt/trunk/lnt/server/ui/templates/all_machines.html?rev=311756&r1=311755&r2=311756&view=diff
==============================================================================
--- lnt/trunk/lnt/server/ui/templates/all_machines.html (original)
+++ lnt/trunk/lnt/server/ui/templates/all_machines.html Thu Aug 24 19:32:52 2017
@@ -18,9 +18,9 @@
     </thead>
     <tbody class="searchable">
       {# Show the active submissions. #}
-      {% for r in ts.query(ts.Machine) %}
+      {% for m in machines %}
       <tr>
-        <td>{{ utils.render_machine(r) }}</td>
+        <td>{{ utils.render_machine(m) }}</td>
       </tr>
       {% endfor %}
     </tbody>

Modified: lnt/trunk/lnt/server/ui/templates/layout.html
URL: http://llvm.org/viewvc/llvm-project/lnt/trunk/lnt/server/ui/templates/layout.html?rev=311756&r1=311755&r2=311756&view=diff
==============================================================================
--- lnt/trunk/lnt/server/ui/templates/layout.html (original)
+++ lnt/trunk/lnt/server/ui/templates/layout.html Thu Aug 24 19:32:52 2017
@@ -189,14 +189,14 @@
                         </li>
                     </ul>
                         {% endif %}
-                {% if ts is defined %}
+                {% if baselines is defined %}
                 <ul class="nav">
                         <li class="dropdown">
                             <a href="#" class="dropdown-toggle" data-toggle="dropdown">Baselines<b class="caret"></b></a>
                             <ul class="dropdown-menu">
                                 <li class="nav-header">Select baseline:</li>
-                                {% for b in ts.query(ts.Baseline).all() %}
-                                {% set is_bold = b.id == session.get(baseline_key()) %}
+                                {% for b in baselines %}
+                                {% set is_bold = b.id == baseline_id %}
                               <li><a href="{{ v4_url_for('.v4_set_baseline', id=b.id) }}">
                                   {% if is_bold %}
                                       <b>{{ b.name }}</b>

Modified: lnt/trunk/lnt/server/ui/templates/v4_order.html
URL: http://llvm.org/viewvc/llvm-project/lnt/trunk/lnt/server/ui/templates/v4_order.html?rev=311756&r1=311755&r2=311756&view=diff
==============================================================================
--- lnt/trunk/lnt/server/ui/templates/v4_order.html (original)
+++ lnt/trunk/lnt/server/ui/templates/v4_order.html Thu Aug 24 19:32:52 2017
@@ -49,7 +49,7 @@
                 <td>{{order.get_field(field)}}</td>
         {% endfor %}
       </tr>
-     {% if order.previous_order_id %}
+      {% if previous_order %}
       <tr>
         <td>Previous Order</td>
           <td>
@@ -57,8 +57,7 @@
                   {{order.previous_order_id}}
               </a>
           </td>
-          {% set previous_order = ts.query(ts.Order).filter(ts.Order.id == order.previous_order_id).one() %}
-            {% for field in previous_order.fields %}
+          {% for field in previous_order.fields %}
                 <td>
                     {{previous_order.get_field(field)}}
                 </td>
@@ -66,16 +65,15 @@
       </tr>
       {% endif %}
 
-      {% if order.next_order_id %}
+      {% if next_order %}
       <tr>
         <td>Next Order</td>
           <td><a href="{{ v4_url_for(".v4_order", id=order.next_order_id) }}">{{order.next_order_id}}</a></td>
-          {% set next_order = ts.query(ts.Order).filter(ts.Order.id == order.next_order_id).one() %}
           {% for field in next_order.fields %}
                 <td>{{next_order.get_field(field)}}</td>
           {% endfor %}
       </tr>
-     {%  endif %}
+      {%  endif %}
     </tbody>
   </table>
   </section>
@@ -117,7 +115,7 @@
   <section id="submissions">
   {# List all submissions which reported for this order. #}
   <h3>Submissions</h3>
-  <b>Num. Submissions:</b> {{ts.query(ts.Run).filter_by(order_id = order.id).count()}}
+  <b>Num. Submissions:</b> {{num_runs}}
   <table class="table table-striped table-hover table-condensed">
     <thead>
       <tr>
@@ -129,12 +127,12 @@
     </thead>
     <tbody>
       {# Show the active submissions. #}
-      {% for r in ts.query(ts.Run).filter_by(order_id = order.id) %}
+      {% for run in runs %}
       <tr>
-        <td><span class="utctime">{{ r.start_time.isoformat() }}</span></td>
-        <td>{{r.end_time - r.start_time}}</td>
-        <td>{{ utils.render_machine(r.machine) }}</td>
-        <td>{{ utils.render_result(r) }}</td>
+        <td><span class="utctime">{{ run.start_time.isoformat() }}</span></td>
+        <td>{{run.end_time - run.start_time}}</td>
+        <td>{{ utils.render_machine(run.machine) }}</td>
+        <td>{{ utils.render_result(run) }}</td>
       </tr>
       {% endfor %}
     </tbody>

Modified: lnt/trunk/lnt/server/ui/views.py
URL: http://llvm.org/viewvc/llvm-project/lnt/trunk/lnt/server/ui/views.py?rev=311756&r1=311755&r2=311756&view=diff
==============================================================================
--- lnt/trunk/lnt/server/ui/views.py (original)
+++ lnt/trunk/lnt/server/ui/views.py Thu Aug 24 19:32:52 2017
@@ -159,6 +159,17 @@ def _do_submit():
     return response
 
 
+def ts_data(ts):
+    """Data about the current testsuite used by layout.html which should be
+    present in most templates."""
+    baseline_id = session.get(baseline_key())
+    baselines = ts.query(ts.Baseline).all()
+    return {
+        'baseline_id': baseline_id,
+        'baselines': baselines,
+        'ts': ts
+    }
+
 @db_route('/submitRun', methods=('GET', 'POST'))
 def submit_run():
     """Compatibility url that hardcodes testsuite to 'nts'"""
@@ -216,7 +227,7 @@ def v4_recent_activity():
                            testsuite_name=g.testsuite_name,
                            active_machines=active_machines,
                            active_submissions=active_submissions,
-                           ts=ts)
+                           **ts_data(ts))
 
 
 @v4_route("/machine/")
@@ -225,9 +236,10 @@ def v4_machines():
 
     # Gather all the runs on this machine.
     ts = request.get_testsuite()
+    machines = ts.query(ts.Machine)
 
-    return render_template("all_machines.html",
-                           ts=ts)
+    return render_template("all_machines.html", machines=machines,
+                           **ts_data(ts))
 
 
 @v4_route("/machine/<int:machine_id>/latest")
@@ -398,6 +410,7 @@ class V4RequestInfo(object):
         note = self.data['visible_note']
         if note:
             flash(note, FLASH_INFO)
+        self.data.update(ts_data(ts))
 
 
 @v4_route("/<int:id>/report")
@@ -580,7 +593,25 @@ def v4_order(id):
     if order is None:
         abort(404)
 
-    return render_template("v4_order.html", ts=ts, order=order, form=form)
+    previous_order = None
+    if order.previous_order_id:
+        previous_order = ts.query(ts.Order) \
+            .filter(ts.Order.id == order.previous_order_id).one()
+    next_order = None
+    if order.next_order_id:
+        next_order = ts.query(ts.Order) \
+            .filter(ts.Order.id == order.next_order_id).one()
+
+    runs = ts.query(ts.Run) \
+        .filter(ts.Run.order_id == id) \
+        .options(joinedload(ts.Run.machine)) \
+        .all()
+    num_runs = len(runs)
+
+    return render_template("v4_order.html", order=order, form=form,
+                           previous_order=previous_order,
+                           next_order=next_order, runs=runs, num_runs=num_runs,
+                           **ts_data(ts))
 
 
 @v4_route("/set_baseline/<int:id>")
@@ -607,7 +638,7 @@ def v4_all_orders():
     # Order the runs totally.
     orders.sort()
 
-    return render_template("v4_all_orders.html", ts=ts, orders=orders)
+    return render_template("v4_all_orders.html", orders=orders, **ts_data(ts))
 
 
 @v4_route("/<int:id>/graph")
@@ -1148,11 +1179,12 @@ def v4_graph():
         json_obj['baselines'] = baseline_plots
         return flask.jsonify(**json_obj)
 
-    return render_template("v4_graph.html", ts=ts, options=options,
+    return render_template("v4_graph.html", options=options,
                            revision_range=revision_range,
                            graph_plots=graph_plots,
                            overview_plots=overview_plots, legend=legend,
-                           baseline_plots=baseline_plots)
+                           baseline_plots=baseline_plots,
+                           **ts_data(ts))
 
 
 @v4_route("/global_status")
@@ -1258,12 +1290,12 @@ def v4_global_status():
     test_table.sort(key=lambda row: row[1], reverse=True)
 
     return render_template("v4_global_status.html",
-                           ts=ts,
                            tests=test_table,
                            machines=recent_machines,
                            fields=metric_fields,
                            selected_field=field,
-                           selected_revision=revision)
+                           selected_revision=revision,
+                           **ts_data(ts))
 
 
 @v4_route("/daily_report")
@@ -1322,8 +1354,9 @@ def v4_daily_report(year, month, day):
     except ValueError:
         return abort(400)
 
-    return render_template("v4_daily_report.html", ts=ts, report=report,
-                           analysis=lnt.server.reporting.analysis)
+    return render_template("v4_daily_report.html", report=report,
+                           analysis=lnt.server.reporting.analysis,
+                           **ts_data(ts))
 
 ###
 # Cross Test-Suite V4 Views




More information about the llvm-commits mailing list