]> git.ipfire.org Git - pbs.git/commitdiff
Add job overview page and option to filter them.
authorMichael Tremer <michael.tremer@ipfire.org>
Sat, 8 Dec 2012 20:36:53 +0000 (21:36 +0100)
committerMichael Tremer <michael.tremer@ipfire.org>
Sat, 8 Dec 2012 20:36:53 +0000 (21:36 +0100)
backend/arches.py
backend/builds.py
data/templates/builder-detail.html
data/templates/jobs-filter.html [new file with mode: 0644]
data/templates/jobs-index.html [new file with mode: 0644]
web/__init__.py
web/handlers_jobs.py

index eee8afea73744f4c97ce255d7da999e91fdb4781..cbb00b6bdba31af9b6f1b0d449a26d09431e4448 100644 (file)
@@ -3,10 +3,19 @@
 import base
 
 class Arches(base.Object):
-       def get_all(self):
-               arches = self.db.query("SELECT id FROM arches WHERE `binary` = 'Y'")
+       def get_all(self, really=False):
+               query = "SELECT * FROM arches"
 
-               return sorted([Arch(self.pakfire, a.id) for a in arches])
+               if not really:
+                       query += " WHERE `binary` = 'Y'"
+               else:
+                       query += " WHERE NOT name = 'src'"
+
+               query += " ORDER BY prio ASC"
+
+               arches = self.db.query(query)
+
+               return [Arch(self.pakfire, a.id, a) for a in arches]
 
        def get_name_by_id(self, id):
                arch = self.db.get("SELECT name FROM arches WHERE id = %s", id)
@@ -54,14 +63,14 @@ class Arches(base.Object):
 
 
 class Arch(base.Object):
-       def __init__(self, pakfire, id):
+       def __init__(self, pakfire, id, data=None):
                base.Object.__init__(self, pakfire)
 
                # The ID of this architecture.
                self.id = id
 
                # Cache data.
-               self._data = None
+               self._data = data
 
        def __cmp__(self, other):
                return cmp(self.prio, other.prio)
index 078ef491468f979fb3b8cecbb2548a91b0f31ccf..7701ad19cc719d451cae8a1cb6187297387635af 100644 (file)
@@ -1328,30 +1328,30 @@ class Jobs(base.Object):
 
                return jobs
 
-       def get_latest(self, builder=None, limit=None, age=None, date=None):
+       def get_latest(self, arch=None, builder=None, limit=None, age=None, date=None):
                query = "SELECT * FROM jobs"
                args  = []
 
                where = ["(state = 'finished' OR state = 'failed' OR state = 'aborted')"]
+
+               if arch:
+                       where.append("arch_id = %s")
+                       args.append(arch.id)
+
                if builder:
                        where.append("builder_id = %s")
                        args.append(builder.id)
 
                if date:
-                       year, month, day = date.split("-", 2)
-
                        try:
+                               year, month, day = date.split("-", 2)
                                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)
+                               where.append("(DATE(time_created) = %s OR \
+                                       DATE(time_started) = %s OR DATE(time_finished) = %s)")
+                               args += (date, date, date)
 
                if age:
                        where.append("time_finished >= DATE_SUB(NOW(), INTERVAL %s)" % age)
index 8ea27c5053b273cbb9cbe94646ecb7ca85c1f58e..ab1a8fbc0305128ca41b6155dc7be51389e01dd6 100644 (file)
                </li>
        </ul>
 
+       <div class="btn-group pull-right">
+               <a class="btn dropdown-toggle" data-toggle="dropdown" href="#">
+                       {{ _("Actions") }} <span class="caret"></span>
+               </a>
+               <ul class="dropdown-menu">
+                       <li>
+                               <a href="/jobs?builder={{ builder.name }}">
+                                       {{ _("Show jobs by this builder") }}
+                               </a>
+                       </li>
+                       {% if current_user and current_user.has_perm("maintain_builders") %}
+                               <li class="divider"></li>
+
+                               {% if builder.enabled %}
+                                       <li>
+                                               <a href="/builder/{{ builder.name }}/disable">
+                                                       {{ _("Disable builder") }}
+                                               </a>
+                                       </li>
+                               {% else %}
+                                       <li>
+                                               <a href="/builder/{{ builder.name }}/enable">
+                                                       {{ _("Enable builder") }}
+                                               </a>
+                                       </li>
+                               {% end %}
+
+                               <li>
+                                       <a href="/builder/{{ builder.name }}/edit">
+                                               <i class="icon-edit"></i>
+                                               {{ _("Edit builder") }}
+                                       </a>
+                               </li>
+
+                               {% if not builder.enabled %}
+                                       <li>
+                                               <a href="/builder/{{ builder.name }}/renew">
+                                                       <i class="icon-refresh"></i>
+                                                       {{ _("Renew passphrase") }}
+                                               </a>
+                                       </li>
+                               {% end %}
+
+                               <li>
+                                       <a href="/builder/{{ builder.name }}/delete">
+                                               <i class="icon-trash"></i>
+                                               {{ _("Delete builder") }}
+                                       </a>
+                               </li>
+                       {% end %}
+               </ul>
+       </div>
+
        <div class="page-header">
                <h2>{{ _("Builder") }}: {{ builder.name }}</h2>
        </div>
                </div>
        </div>
 
-       {% if current_user and current_user.has_perm("maintain_builders") %}
-               <hr>
-
-               <div class="btn-toolbar ac">
-                       {% if builder.enabled %}
-                               <a class="btn btn-danger" href="/builder/{{ builder.name }}/disable">
-                                       {{ _("Disable builder") }}
-                               </a>
-                       {% else %}
-                               <a class="btn btn-success" href="/builder/{{ builder.name }}/enable">
-                                       {{ _("Enable builder") }}
-                               </a>
-                       {% end %}
-
-                       <a class="btn" href="/builder/{{ builder.name }}/edit">
-                               <i class="icon-edit"></i>
-                               {{ _("Edit builder") }}
-                       </a>
-
-                       {% if not builder.enabled %}
-                               <a class="btn" href="/builder/{{ builder.name }}/renew">
-                                       <i class="icon-refresh"></i>
-                                       {{ _("Renew passphrase") }}
-                               </a>
-                       {% end %}
-
-                       <a class="btn" href="/builder/{{ builder.name }}/delete">
-                               <i class="icon-trash"></i>
-                               {{ _("Delete builder") }}
-                       </a>
-               </div>
-       {% end %}
-
        <hr>
 
        <h3>{{ _("Log") }}</h3>
diff --git a/data/templates/jobs-filter.html b/data/templates/jobs-filter.html
new file mode 100644 (file)
index 0000000..65f215b
--- /dev/null
@@ -0,0 +1,63 @@
+{% extends "base.html" %}
+
+{% block title %}{{ _("Filter jobs") }}{% end block %}
+
+{% block body %}
+       <ul class="breadcrumb">
+               <li>
+                       <a href="/">{{ _("Home") }}</a>
+                       <span class="divider">/</span>
+               </li>
+               <li>
+                       <a href="/jobs">{{ _("Jobs") }}</a>
+                       <span class="divider">/</span>
+               </li>
+               <li class="active">
+                       <a href="/jobs/filter">{{ _("Filter") }}</a>
+               </li>
+       </ul>
+
+       <div class="page-header">
+               <h2>{{ _("Filter jobs") }}</h2>
+       </div>
+
+       <form class="form-horizontal" method="GET" action="/jobs">
+               <fieldset>
+                       <div class="control-group">
+                               <label class="control-label">{{ _("Builder") }}</label>
+                               <div class="controls">
+                                       <select name="builder">
+                                               <option value="">{{ _("[Choose one]") }}</option>
+                                               {% for b in builders %}
+                                                       <option value="{{ b.name }}">{{ b.name }}</option>
+                                               {% end %}
+                                       </select>
+                                       <span class="help-block">
+                                               {{ _("Only show jobs, that have been built by this builder.") }}
+                                       </span>
+                               </div>
+                       </div>
+
+                       <hr>
+
+                       <div class="control-group">
+                               <label class="control-label">{{ _("Architecture") }}</label>
+                               <div class="controls">
+                                       <select name="arch">
+                                               <option value="">{{ _("[Choose one]") }}</option>
+                                               {% for a in arches %}
+                                                       <option value="{{ a.name }}">{{ a.name }}</option>
+                                               {% end %}
+                                       </select>
+                                       <span class="help-block">
+                                               {{ _("Only show jobs, with this architecture.") }}
+                                       </span>
+                               </div>
+                       </div>
+
+                       <div class="form-actions">
+                               <button type="submit" class="btn btn-primary">{{ _("Go!") }}</button>
+                       </div>
+               </fieldset>
+       </form>
+{% end block %}
diff --git a/data/templates/jobs-index.html b/data/templates/jobs-index.html
new file mode 100644 (file)
index 0000000..58291ed
--- /dev/null
@@ -0,0 +1,55 @@
+{% extends "base.html" %}
+
+{% block title %}{{ _("Jobs") }}{% end block %}
+
+{% block body %}
+       <ul class="breadcrumb">
+               <li>
+                       <a href="/">{{ _("Home") }}</a>
+                       <span class="divider">/</span>
+               </li>
+               <li class="active">
+                       <a href="/jobs">{{ _("Jobs") }}</a>
+               </li>
+       </ul>
+
+       <ul class="nav nav-pills pull-right">
+               <li>
+                       <a href="/jobs/filter">{{ _("Filter jobs") }}</a>
+               </li>
+       </ul>
+
+       <div class="page-header">
+               <h2>{{ _("Jobs") }}</h2>
+       </div>
+
+       {% if arch or builder or date %}
+               <ul>
+                       {% if date %}
+                               <li>
+                                       {{ _("Showing only jobs from %s.") % date }}
+                               </li>
+                       {% end %}
+
+                       {% if builder %}
+                               <li>
+                                       <a href="/builder/{{ builder.name }}">
+                                               {{ _("Showing only builds that have been built on %s.") % builder.name }}
+                                       </a>
+                               </li>
+                       {% end %}
+
+                       {% if arch %}
+                               <li>
+                                       <a href="/arch/{{ arch.name }}">
+                                               {{ _("Showing only jobs built for %s.") % arch.name }}
+                                       </a>
+                               </li>
+                       {% end %}
+               </ul>
+
+               <hr>
+       {% end %}
+
+       {% module JobsList(jobs) %}
+{% end block %}
index 02c8c82a8b90980ed19402d2e5f60683537d863e..627dd8eafd5533c061b273572496e65075cc3c88 100644 (file)
@@ -144,6 +144,8 @@ class Application(tornado.web.Application):
                        (r"/build/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/delete", BuildDeleteHandler),
 
                        # Jobs
+                       (r"/jobs", JobsIndexHandler),
+                       (r"/jobs/filter", JobsFilterHandler),
                        (r"/job/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})", JobDetailHandler),
                        (r"/job/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/abort", JobAbortHandler),
                        (r"/job/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/buildroot", JobBuildrootHandler),
index ba2411bba57258f9586423f358f94504378675b6..12949f5231fcda570173ecc85023f861a7acfd5d 100644 (file)
@@ -5,6 +5,41 @@ import tornado.web
 from handlers_base import BaseHandler
 
 
+class JobsIndexHandler(BaseHandler):
+       def get(self):
+               # Filter for a certain arch.
+               arch_name = self.get_argument("arch", None)
+               if arch_name:
+                       arch = self.pakfire.arches.get_by_name(arch_name)
+               else:
+                       arch = None
+
+               # Check if we need to filter for a certain builder.
+               builder_name = self.get_argument("builder", None)
+               if builder_name:
+                       builder = self.pakfire.builders.get_by_name(builder_name)
+               else:
+                       builder = None
+
+               # Filter for a certain date.
+               date = self.get_argument("date", None)
+
+               # Get all jobs, that fulfill the criteria.
+               jobs = self.pakfire.jobs.get_latest(limit=50, arch=arch, builder=builder,
+                       date=date)
+
+               self.render("jobs-index.html", jobs=jobs, arch=arch, builder=builder,
+                       date=date)
+
+
+class JobsFilterHandler(BaseHandler):
+       def get(self):
+               arches   = self.pakfire.arches.get_all(really=True)
+               builders = self.pakfire.builders.get_all()
+
+               self.render("jobs-filter.html", arches=arches, builders=builders)
+
+
 class JobDetailHandler(BaseHandler):
        def get(self, uuid):
                job = self.pakfire.jobs.get_by_uuid(uuid)