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 %} -
-
- {% if active_jobs %} -

- {{ _("Ongoing build jobs") }} - ({{ len(active_jobs) }}) -

- {% module JobsList(active_jobs, show_builder=True) %} - {% end %} + {% if jobs %} +
- - {% if job_queue %} - {{ _("There is one job in the job queue.", "There are %(num)s jobs in the job queue.", job_queue) % { "num" : job_queue } }} - {% else %} - {{ _("There are no jobs in the job queue.") }} - {% 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 %} - - - - {% end %} -
- {% 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 %} -
-{% 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 @@ + + + + + + + + + + + + {% 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 %} + + + + + + + + + + {% end %} + +
{{ _("Build job") }}{{ _("Builder") }}{{ _("Runtime") }}
+ {% 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) }} +
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