From 6e63ed4982dbb1828ae483c2b8aba730f34c8615 Mon Sep 17 00:00:00 2001
From: Michael Tremer
Date: Sat, 8 Dec 2012 16:14:41 +0100
Subject: [PATCH] Redesign the displayed job list on the main page.
---
backend/builds.py | 47 +++++++++++++++++++----
data/static/js/pbs.js | 3 ++
data/templates/index.html | 40 +++++++-------------
data/templates/modules/jobs-list.html | 44 ----------------------
data/templates/modules/jobs/list.html | 54 +++++++++++++++++++++++++++
web/__init__.py | 4 +-
web/handlers.py | 12 ++----
web/ui_modules.py | 5 +--
8 files changed, 117 insertions(+), 92 deletions(-)
delete mode 100644 data/templates/modules/jobs-list.html
create mode 100644 data/templates/modules/jobs/list.html
diff --git a/backend/builds.py b/backend/builds.py
index 5587341..078ef49 100644
--- a/backend/builds.py
+++ b/backend/builds.py
@@ -1248,7 +1248,7 @@ class Jobs(base.Object):
return sorted(jobs)
def get_active(self, host_id=None, uploads=True):
- running_states = ["dispatching", "running"]
+ running_states = ["dispatching", "new", "pending", "running"]
if uploads:
running_states.append("uploading")
@@ -1259,7 +1259,14 @@ class Jobs(base.Object):
if host_id:
query += " AND builder_id = %s" % host_id
- query += " ORDER BY time_started DESC"
+ query += " ORDER BY \
+ CASE \
+ WHEN jobs.state = 'running' THEN 0 \
+ WHEN jobs.state = 'uploading' THEN 1 \
+ WHEN jobs.state = 'dispatching' THEN 2 \
+ WHEN jobs.state = 'pending' THEN 3 \
+ WHEN jobs.state = 'new' THEN 4 \
+ END, time_started ASC"
return [Job(self.pakfire, j.id, j) for j in self.db.query(query)]
@@ -1321,20 +1328,44 @@ class Jobs(base.Object):
return jobs
- def get_latest(self, builder=None, limit=10):
+ def get_latest(self, builder=None, limit=None, age=None, date=None):
query = "SELECT * FROM jobs"
+ args = []
- #where = ["time_finished IS NOT NULL",]
- where = ["(state = 'finished' OR state = 'failed')"]
+ where = ["(state = 'finished' OR state = 'failed' OR state = 'aborted')"]
if builder:
- where.append("builder = '%s'" % builder)
+ where.append("builder_id = %s")
+ args.append(builder.id)
+
+ if date:
+ year, month, day = date.split("-", 2)
+
+ try:
+ date = datetime.date(int(year), int(month), int(day))
+ except ValueError:
+ pass
+
+ else:
+ where.append("DATE(time_created) = %s")
+ args.append(date)
+ where.append("DATE(time_started) = %s")
+ args.append(date)
+ where.append("DATE(time_finished) = %s")
+ args.append(date)
+
+ if age:
+ where.append("time_finished >= DATE_SUB(NOW(), INTERVAL %s)" % age)
if where:
query += " WHERE %s" % " AND ".join(where)
- query += " ORDER BY time_finished DESC LIMIT %s"
+ query += " ORDER BY time_finished DESC"
+
+ if limit:
+ query += " LIMIT %s"
+ args.append(limit)
- return [Job(self.pakfire, j.id, j) for j in self.db.query(query, limit)]
+ return [Job(self.pakfire, j.id, j) for j in self.db.query(query, *args)]
def get_average_build_time(self):
"""
diff --git a/data/static/js/pbs.js b/data/static/js/pbs.js
index 77b8fde..3326b4e 100644
--- a/data/static/js/pbs.js
+++ b/data/static/js/pbs.js
@@ -1,6 +1,9 @@
$(document).ready(function() {
// Activate Google Prettify for pretty-printing code.
window.prettyPrint && prettyPrint()
+
+ // Activate tooltips.
+ $("span[rel=tooltip]").tooltip();
});
function getCookie(name) {
diff --git a/data/templates/index.html b/data/templates/index.html
index 51de3c0..9bc3ee9 100644
--- a/data/templates/index.html
+++ b/data/templates/index.html
@@ -11,14 +11,16 @@
{% else %}
+
- {{ _("Pakfire Build Service") }}
- {{ _("Development powered by community!") }}
+ {{ _("Pakfire Build Service") }}
-
+
-
{{ _("Learn more") }} »
+
+ {{ _("Development powered by community!") }}
+
@@ -57,33 +59,17 @@
{{ _("View more updates...") }}
-
+
{% end %}
-
-
+
{{ _("Build jobs") }}
+ {% module JobsList(jobs) %}
+ {% end %}
-
-
{{ _("Lately processed jobs") }}
- {% module JobsList(latest_jobs) %}
-
-
+ {{ _("Show more build jobs") }}
{% end %}
diff --git a/data/templates/modules/jobs-list.html b/data/templates/modules/jobs-list.html
deleted file mode 100644
index 98ccd3f..0000000
--- a/data/templates/modules/jobs-list.html
+++ /dev/null
@@ -1,44 +0,0 @@
-{% if jobs %}
-
- {% for job in jobs %}
-
-
- {% if job.state == "dispatching" %}
-
- {% elif job.state == "running" %}
-
- {% elif job.state == "finished" %}
-
- {% elif job.state == "dependency_error" %}
-
- {% elif job.state == "failed" %}
-
- {% elif job.state == "uploading" %}
-
- {% elif job.state == "aborted" %}
-
- {% end %}
-
-
- {{ job.build.name }}.{{ job.arch.name }}
-
- {% if job.build.type == "scratch" %}
- S
- {% elif job.type == "test" %}
- T
- {% end %}
-
- {% if show_builder and job.builder %}
-
- {{ _("Builder") }}:
-
- {{ job.builder.name }}
-
- {% end %}
- |
-
- {% end %}
-
-{% else %}
- {{ _("No jobs to display.") }}
-{% end %}
diff --git a/data/templates/modules/jobs/list.html b/data/templates/modules/jobs/list.html
new file mode 100644
index 0000000..78df1cc
--- /dev/null
+++ b/data/templates/modules/jobs/list.html
@@ -0,0 +1,54 @@
+
+
+
+ |
+ {{ _("Build job") }} |
+ {{ _("Builder") }} |
+ {{ _("Runtime") }} |
+
+
+
+
+ {% for job in jobs %}
+ {% if job.state in ("running",) %}
+
+ {% elif job.state in ("dispatching", "uploading") %}
+
+ {% elif job.state in ("aborted", "dependency_error", "failed") %}
+
+ {% else %}
+
+ {% end %}
+
+
+ {% module JobState(job, show_icon=True) %}
+ |
+
+
+
+ {{ job.build.name }}.{{ job.arch.name }}
+
+ {% if job.build.type == "scratch" %}
+ S
+ {% elif job.type == "test" %}
+ T
+ {% end %}
+ |
+
+
+ {% if job.builder %}
+
+ {{ job.builder.name }}
+
+ {% else %}
+ {{ _("N/A") }}
+ {% end %}
+ |
+
+
+ {{ friendly_time(job.duration) }}
+ |
+
+ {% end %}
+
+
diff --git a/web/__init__.py b/web/__init__.py
index f07b754..02c8c82 100644
--- a/web/__init__.py
+++ b/web/__init__.py
@@ -50,6 +50,9 @@ class Application(tornado.web.Application):
"Changelog" : ChangelogModule,
"ChangelogEntry" : ChangelogEntryModule,
+ # Jobs
+ "JobsList" : JobsListModule,
+
# Packages
"PackagesDependencyTable" : PackagesDependencyTableModule,
@@ -57,7 +60,6 @@ class Application(tornado.web.Application):
"JobsBoxes" : JobsBoxesModule,
"JobState" : JobStateModule,
"JobsTable" : JobsTableModule,
- "JobsList" : JobsListModule,
"CommentsTable" : CommentsTableModule,
"FilesTable" : FilesTableModule,
"LogTable" : LogTableModule,
diff --git a/web/handlers.py b/web/handlers.py
index 66becda..638a0f3 100644
--- a/web/handlers.py
+++ b/web/handlers.py
@@ -17,12 +17,8 @@ from handlers_users import *
class IndexHandler(BaseHandler):
def get(self):
- kwargs = {
- "active_jobs" : self.pakfire.jobs.get_active(),
- "latest_jobs" : self.pakfire.jobs.get_latest(limit=10),
-
- "job_queue" : self.pakfire.jobs.count("pending"),
- }
+ jobs = self.pakfire.jobs.get_active()
+ jobs += self.pakfire.jobs.get_latest(age="24 HOUR", limit=5)
# Updates
updates = []
@@ -33,9 +29,7 @@ class IndexHandler(BaseHandler):
updates.append((type, u, active))
active = False
- kwargs["updates"] = updates
-
- self.render("index.html", **kwargs)
+ self.render("index.html", jobs=jobs, updates=updates)
class Error404Handler(BaseHandler):
diff --git a/web/ui_modules.py b/web/ui_modules.py
index 7fda878..c172665 100644
--- a/web/ui_modules.py
+++ b/web/ui_modules.py
@@ -310,9 +310,8 @@ class JobsTableModule(UIModule):
class JobsListModule(UIModule):
- def render(self, jobs, show_builder=False):
- return self.render_string("modules/jobs-list.html", jobs=jobs,
- show_builder=show_builder)
+ def render(self, jobs):
+ return self.render_string("modules/jobs/list.html", jobs=jobs)
class RepositoryTableModule(UIModule):
--
2.39.2