]> git.ipfire.org Git - pbs.git/commitdiff
Redesign the displayed job list on the main page.
authorMichael Tremer <michael.tremer@ipfire.org>
Sat, 8 Dec 2012 15:14:41 +0000 (16:14 +0100)
committerMichael Tremer <michael.tremer@ipfire.org>
Sat, 8 Dec 2012 15:14:41 +0000 (16:14 +0100)
backend/builds.py
data/static/js/pbs.js
data/templates/index.html
data/templates/modules/jobs-list.html [deleted file]
data/templates/modules/jobs/list.html [new file with mode: 0644]
web/__init__.py
web/handlers.py
web/ui_modules.py

index 5587341f38acbd0e690cda8d7fd09e06775d99ba..078ef491468f979fb3b8cecbb2548a91b0f31ccf 100644 (file)
@@ -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):
                """
index 77b8fde8039b3de907079f2f8a3d52bbad20a462..3326b4e6039e6b44577f8d81c2619e82267fd28b 100644 (file)
@@ -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) {
index 51de3c0e48e4f04725b637ed892e32394b2084a1..9bc3ee95e8a4bd3f5f50b735121e7fd18d5e26cc 100644 (file)
 
        {% else %}
                <div class="hero-unit ac" style="background-color: white">
+                       <br>
                        <h1>
-                               {{ _("Pakfire Build Service") }}<br>
-                               <small>{{ _("Development powered by community!") }}</small>
+                               {{ _("Pakfire Build Service") }}
                        </h1>
 
-                       <br><br>
+                       <hr>
 
-                       <a class="btn" href="/documents">{{ _("Learn more") }} &raquo;</a>
+                       <h2>
+                               <small>{{ _("Development powered by community!") }}</small>
+                       </h2>
                </div>
 
                <hr>
                                        <a href="/updates">{{ _("View more updates...") }}</a>
                                </p>
 
-                               <hr style="clear: both;">
+                               <br style="clear: both;">
                        </div>
                </div>
        {% end %}
 
-       <div class="row">
-               <div class="span6">
-                       {% if active_jobs %}
-                               <h3>
-                                       {{ _("Ongoing build jobs") }}
-                                       <small>({{ len(active_jobs) }})</small>
-                               </h3>
-                               {% module JobsList(active_jobs, show_builder=True) %}
-                       {% end %}
+       {% if jobs %}
+               <hr>
 
-                       <a href="/builds/queue">
-                               {% 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 %}
-                       </a>
-               </div>
+               <h4>{{ _("Build jobs") }}</h4>
+               {% module JobsList(jobs) %}
+       {% end %}
 
-               <div class="span6">
-                       <h3>{{ _("Lately processed jobs") }}</h3>
-                       {% module JobsList(latest_jobs) %}
-               </div>
-       </div>
+       <a href="/jobs">{{ _("Show more build jobs") }}</a>
 {% end %}
diff --git a/data/templates/modules/jobs-list.html b/data/templates/modules/jobs-list.html
deleted file mode 100644 (file)
index 98ccd3f..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-{% if jobs %}
-       <table class="table table-striped table-hover">
-               {% for job in jobs %}
-                       <tr {% if job.state in ("aborted", "failed") %}class="error"{% end %}>
-                               <td>
-                                       {% if job.state == "dispatching" %}
-                                               <i class="icon-chevron-left"></i>
-                                       {% elif job.state == "running" %}
-                                               <i class="icon-retweet"></i>
-                                       {% elif job.state == "finished" %}
-                                               <i class="icon-ok"></i>
-                                       {% elif job.state == "dependency_error" %}
-                                               <i class="icon-random"></i>
-                                       {% elif job.state == "failed" %}
-                                               <i class="icon-remove"></i>
-                                       {% elif job.state == "uploading" %}
-                                               <i class="icon-chevron-right"></i>
-                                       {% elif job.state == "aborted" %}
-                                               <i class="icon-warning-sign"></i>
-                                       {% end %}
-
-                                       <a href="/build/{{ job.build.uuid }}">
-                                               {{ job.build.name }}</a>.<a href="/job/{{ job.uuid }}">{{ job.arch.name }}</a>
-
-                                       {% if job.build.type == "scratch" %}
-                                               <span class="label label-inverse">S</span>
-                                       {% elif job.type == "test" %}
-                                               <span class="label label-inverse">T</span>
-                                       {% end %}
-                               
-                                       {% if show_builder and job.builder %}
-                                               <br />
-                                               {{ _("Builder") }}:
-                                               <a href="/builder/{{ job.builder.name }}">
-                                                       {{ job.builder.name }}
-                                               </a>
-                                       {% end %}
-                               </td>
-                       </tr>
-               {% end %}
-       </table>
-{% 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 (file)
index 0000000..78df1cc
--- /dev/null
@@ -0,0 +1,54 @@
+<table class="table table-striped table-hover">
+       <thead>
+               <tr>
+                       <th></th>
+                       <th>{{ _("Build job") }}</th>
+                       <th>{{ _("Builder") }}</th>
+                       <th>{{ _("Runtime") }}</th>
+               </tr>
+       </thead>
+
+       <tbody>
+               {% for job in jobs %}
+                       {% if job.state in ("running",) %}
+                               <tr class="success">
+                       {% elif job.state in ("dispatching", "uploading") %}
+                               <tr class="info">
+                       {% elif job.state in ("aborted", "dependency_error", "failed") %}
+                               <tr class="error">
+                       {% else %}
+                               <tr>
+                       {% end %}
+
+                               <td>
+                                       {% module JobState(job, show_icon=True) %}
+                               </td>
+
+                               <td>
+                                       <a href="/build/{{ job.build.uuid }}">
+                                               {{ job.build.name }}</a>.<a href="/job/{{ job.uuid }}">{{ job.arch.name }}</a>
+
+                                       {% if job.build.type == "scratch" %}
+                                               <span class="label label-inverse pull-right" rel="tooltip" data-placement="top" title="{{ _("Scratch build") }}">S</span>
+                                       {% elif job.type == "test" %}
+                                               <span class="label label-inverse pull-right" rel="tooltip" data-placement="top" title="{{ _("Test build") }}">T</span>
+                                       {% end %}
+                               </td>
+
+                               <td>
+                                       {% if job.builder %}
+                                               <a href="/builder/{{ job.builder.name }}">
+                                                       {{ job.builder.name }}
+                                               </a>
+                                       {% else %}
+                                               {{ _("N/A") }}
+                                       {% end %}
+                               </td>
+
+                               <td>
+                                       {{ friendly_time(job.duration) }}
+                               </td>
+                       </tr>
+               {% end %}
+       </tbody>
+</table>
index f07b754b75018140ea9294265dbf5f978c6b65b7..02c8c82a8b90980ed19402d2e5f60683537d863e 100644 (file)
@@ -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,
index 66becda34efa5dd83f9ab7f75411fe6f87ba6e4c..638a0f3e0e22f6d6b7bdd019ebc17b2ceff48568 100644 (file)
@@ -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):
index 7fda8789d6a4b1b4e05424806c9099fc9930d3d1..c17266548c50b8d5c6e14cdb379ad06843d4e09f 100644 (file)
@@ -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):