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)
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)
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)
</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>
--- /dev/null
+{% 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 %}
--- /dev/null
+{% 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 %}
(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),
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)