diff mbox

[Branch,~linaro-validation/lava-scheduler/trunk] Rev 130: Make alljobs paginated so that it will load very quickly

Message ID 20120214225518.7987.20826.launchpad@ackee.canonical.com
State Accepted
Headers show

Commit Message

Paul Larson Feb. 14, 2012, 10:55 p.m. UTC
Merge authors:
  Michael Hudson-Doyle (mwhudson)
Related merge proposals:
  https://code.launchpad.net/~mwhudson/lava-scheduler/server-side-tables/+merge/92565
  proposed by: Michael Hudson-Doyle (mwhudson)
  review: Approve - Zygmunt Krynicki (zkrynicki)
------------------------------------------------------------
revno: 130 [merge]
committer: Paul Larson <paul.larson@linaro.org>
branch nick: lava-scheduler
timestamp: Tue 2012-02-14 14:53:27 -0800
message:
  Make alljobs paginated so that it will load very quickly
modified:
  lava_scheduler_app/templates/lava_scheduler_app/alljobs.html
  lava_scheduler_app/urls.py
  lava_scheduler_app/views.py
  setup.py


--
lp:lava-scheduler
https://code.launchpad.net/~linaro-validation/lava-scheduler/trunk

You are subscribed to branch lp:lava-scheduler.
To unsubscribe from this branch go to https://code.launchpad.net/~linaro-validation/lava-scheduler/trunk/+edit-subscription
diff mbox

Patch

=== modified file 'lava_scheduler_app/templates/lava_scheduler_app/alljobs.html'
--- lava_scheduler_app/templates/lava_scheduler_app/alljobs.html	2011-12-06 23:02:25 +0000
+++ lava_scheduler_app/templates/lava_scheduler_app/alljobs.html	2012-02-10 19:44:59 +0000
@@ -8,32 +8,14 @@ 
   <thead>
     <tr>
       <th class="id">ID</th>
-      <th>Status</th>
-      <th>Device</th>
-      <th>Description</th>
-      <th>Submitter</th>
-      <th>Submit Time</th>
+      <th class="status">Status</th>
+      <th class="device">Device</th>
+      <th class="description">Description</th>
+      <th class="submitter">Submitter</th>
+      <th class="submit_time">Submit Time</th>
     </tr>
   </thead>
   <tbody>
-    {% for job in jobs %}
-    <tr>
-      <td><a href="{{ job.get_absolute_url }}">{{ job.id }} </a></td>
-      <td>{{ job.get_status_display }}</td>
-      {% if job.actual_device %}
-      <td><a href="{{ job.actual_device.get_absolute_url }}"
-          >{{ job.actual_device }}</a></td>
-      {% else %}{% if job.requested_device %}
-      <td><a href="{{ job.requested_device.get_absolute_url }}"
-          ><i>{{ job.requested_device }}</i></a></td>
-      {% else %}
-      <td><i>{{ job.requested_device_type|default:'' }}</i></td>
-      {% endif %}{% endif %}
-      <td>{{ job.description|default:'' }}</td>
-      <td>{{ job.submitter }}</td>
-      <td>{{ job.submit_time }}</td>
-    </tr>
-    {% endfor %}
   </tbody>
 </table>
 
@@ -41,12 +23,37 @@ 
 $(document).ready(
   function() {
     $("table.data").dataTable({
-      "bJQueryUI": true,
-      "aoColumnDefs": [
-        { "sType": "num-html", "aTargets": [ "id" ] }
-      ],
-      "aaSorting": [[0, "desc"]],
-      "iDisplayLength": 25
+      bJQueryUI: true,
+      bServerSide: true,
+      bProcessing: true,
+      bFilter: true,
+      sAjaxSource: "{% url lava_scheduler_app.views.alljobs_json %}",
+      aaSorting: [[0, "desc"]],
+      iDisplayLength: 25,
+      aoColumnDefs: [
+        {
+          aTargets: ["id"],
+          fnRender: function (o) { return '<a href="' + o.aData.id.link + '">' + o.aData.id.id + '</a>'; }
+        },
+        {aTargets: ["status"], mDataProp: 'status'},
+        {aTargets: ["description"], mDataProp: 'description'},
+        {aTargets: ["submitter"], mDataProp: 'submitter'},
+        {aTargets: ["submit_time"], mDataProp: 'submit_time'},
+        {
+          aTargets: ["device"],
+          fnRender: function (o) {
+            o = o.aData.device;
+            r = o.name;
+            if (o.requested) {
+              r = '<i>' + r + '</i>';
+            }
+            if (o.link) {
+              return '<a href="' + o.link + '">' + r + '</a>';
+            }
+            return r;
+         }
+        }
+      ]
     });
   }
 );

=== modified file 'lava_scheduler_app/urls.py'
--- lava_scheduler_app/urls.py	2011-12-13 03:58:12 +0000
+++ lava_scheduler_app/urls.py	2012-02-10 01:24:02 +0000
@@ -1,5 +1,6 @@ 
 from django.conf.urls.defaults import url, patterns
 
+
 urlpatterns = patterns(
     'lava_scheduler_app.views',
     url(r'^$', 
@@ -8,6 +9,9 @@ 
     url(r'^alljobs$', 
         'job_list', 
         name='lava.scheduler.job.list'),
+    url(r'^alljobs_json$',
+        'alljobs_json',
+        name='lava.scheduler.job.list_json'),
     url(r'^device/(?P<pk>[-_a-zA-Z0-9]+)$', 
         'device_detail', 
         name='lava.scheduler.device.detail'),

=== modified file 'lava_scheduler_app/views.py'
--- lava_scheduler_app/views.py	2012-02-09 20:44:59 +0000
+++ lava_scheduler_app/views.py	2012-02-10 19:50:40 +0000
@@ -4,19 +4,24 @@ 
 import simplejson
 import StringIO
 
-
+from django.conf import settings
+from django.core.urlresolvers import reverse
 from django.http import (
     HttpResponse,
     HttpResponseBadRequest,
     HttpResponseForbidden,
     HttpResponseNotAllowed,
     )
-from django.template import RequestContext
 from django.shortcuts import (
     get_object_or_404,
     redirect,
     render_to_response,
 )
+from django.template import RequestContext
+from django.template import defaultfilters as filters
+
+from lava.utils.data_tables.views import DataTableView
+from lava.utils.data_tables.backends import QuerySetBackend, Column
 
 from lava_server.views import index as lava_index
 from lava_server.bread_crumbs import (
@@ -29,7 +34,12 @@ 
     getDispatcherErrors,
     getDispatcherLogMessages
     )
-from lava_scheduler_app.models import Device, DeviceStateTransition, TestJob
+from lava_scheduler_app.models import (
+    Device,
+    DeviceStateTransition,
+    TestJob,
+    )
+
 
 
 def post_only(func):
@@ -60,14 +70,58 @@ 
     return render_to_response(
         "lava_scheduler_app/alljobs.html",
         {
-            'jobs': TestJob.objects.select_related(
-                "actual_device", "requested_device", "requested_device_type",
-                "submitter").all(),
             'bread_crumb_trail': BreadCrumbTrail.leading_to(job_list),
         },
         RequestContext(request))
 
 
+def device_callback(job):
+    if job.actual_device:
+        return dict(
+            name=job.actual_device.pk, requested=False,
+            link=reverse(device_detail, kwargs=dict(pk=job.actual_device.pk)))
+    elif job.requested_device:
+        return dict(
+            name=job.requested_device.pk, requested=True,
+            link=reverse(device_detail, kwargs=dict(pk=job.requested_device.pk)))
+    else:
+        return dict(name=job.requested_device_type.pk, requested=True)
+
+
+def id_callback(job):
+    if job is None:
+        return job
+    else:
+        return dict(id=job.id, link=reverse(job_detail, kwargs=dict(pk=job.id)))
+
+
+alljobs_json = DataTableView.as_view(
+    backend=QuerySetBackend(
+        queryset=TestJob.objects.select_related(
+            "actual_device", "requested_device", "requested_device_type",
+            "submitter").extra(
+            select={
+                'device_sort': 'coalesce(actual_device_id, requested_device_id, requested_device_type_id)'
+                }).all(),
+        columns=[
+            Column(
+                'id', 'id', id_callback),
+            Column(
+                'status', 'status', lambda job: job.get_status_display()),
+            Column(
+                'device', 'device_sort', device_callback),
+            Column(
+                'description', 'description', lambda job: job.description),
+            Column(
+                'submitter', 'submitter', lambda job: job.submitter.username),
+            Column(
+                'submit_time', 'submit_time',
+                lambda job: filters.date(
+                    job.submit_time, settings.DATETIME_FORMAT)),
+            ],
+        searching_columns=['description']))
+
+
 @BreadCrumb("Job #{pk}", parent=index, needs=['pk'])
 def job_detail(request, pk):
     job = get_object_or_404(TestJob, pk=pk)

=== modified file 'setup.py'
--- setup.py	2011-12-05 21:46:59 +0000
+++ setup.py	2012-02-14 22:53:27 +0000
@@ -33,7 +33,7 @@ 
     scheduler = lava_scheduler_app.extension:SchedulerExtension
     """,
     install_requires=[
-        "lava-server >= 0.8",
+        "lava-server >= 0.10",
         "simplejson",
         "south >= 0.7.3",
         "twisted",