]> git.ipfire.org Git - people/jschlag/pbs.git/commitdiff
Update lists of builds.
authorMichael Tremer <michael.tremer@ipfire.org>
Wed, 12 Dec 2012 09:43:17 +0000 (10:43 +0100)
committerMichael Tremer <michael.tremer@ipfire.org>
Wed, 12 Dec 2012 09:43:17 +0000 (10:43 +0100)
backend/builds.py
data/static/js/pbs.js
data/templates/build-index.html
data/templates/modules/build-table.html
data/templates/modules/jobs/status.html [new file with mode: 0644]
data/templates/modules/package-header.html
data/templates/user-profile-builds.html
web/__init__.py
web/handlers_builds.py
web/handlers_users.py
web/ui_modules.py

index 7701ad19cc719d451cae8a1cb6187297387635af..81f77dac9a3264da8bc5ccc3fc07c9880b094a74 100644 (file)
@@ -58,8 +58,8 @@ def import_from_package(_pakfire, filename, distro=None, commit=None, type="rele
 
 
 class Builds(base.Object):
-       def get_by_id(self, id):
-               return Build(self.pakfire, id)
+       def get_by_id(self, id, data=None):
+               return Build(self.pakfire, id, data=data)
 
        def get_by_uuid(self, uuid):
                build = self.db.get("SELECT id FROM builds WHERE uuid = %s LIMIT 1", uuid)
@@ -68,14 +68,14 @@ class Builds(base.Object):
                        return self.get_by_id(build.id)
 
        def get_all(self, limit=50):
-               query = "SELECT id FROM builds ORDER BY time_created DESC"
+               query = "SELECT * FROM builds ORDER BY time_created DESC"
 
                if limit:
                        query += " LIMIT %d" % limit
 
-               return [self.get_by_id(b.id) for b in self.db.query(query)]
+               return [self.get_by_id(b.id, b) for b in self.db.query(query)]
 
-       def get_by_user_iter(self, user, type=None, public=None, order_by="name"):
+       def get_by_user(self, user, type=None, public=None):
                args = []
                conditions = []
 
@@ -92,19 +92,20 @@ class Builds(base.Object):
                elif public is False:
                        conditions.append("public = 'N'")
 
-               query = "SELECT builds.id AS id FROM builds \
+               query = "SELECT builds.* AS id FROM builds \
                        JOIN packages ON builds.pkg_id = packages.id"
 
                if conditions:
                        query += " WHERE %s" % " AND ".join(conditions)
 
-               if order_by == "name":
-                       query += " ORDER BY packages.name ASC"
-               elif order_by == "date":
-                       query += " ORDER BY builds.time_created DESC"
+               query += " ORDER BY builds.time_created DESC"
 
+               builds = []
                for build in self.db.query(query, *args):
-                       yield Build(self.pakfire, build.id)
+                       build = Build(self.pakfire, build.id, build)
+                       builds.append(build)
+
+               return builds
 
        def get_by_name(self, name, type=None, public=None, user=None):
                args = [name,]
@@ -550,6 +551,10 @@ class Build(base.Object):
        def created(self):
                return self.data.time_created
 
+       @property
+       def date(self):
+               return self.created.date()
+
        @property
        def public(self):
                """
@@ -557,6 +562,22 @@ class Build(base.Object):
                """
                return self.data.public == "Y"
 
+       @property
+       def size(self):
+               """
+                       Returns the size on disk of this build.
+               """
+               s = 0
+
+               # Add the source package.
+               if self.pkg:
+                       s += self.pkg.size
+
+               # Add all jobs.
+               s += sum((j.size for j in self.jobs))
+
+               return s
+
        #@property
        #def state(self):
        #       # Cache all states.
@@ -1620,6 +1641,10 @@ class Job(base.Object):
        def name(self):
                return "%s-%s.%s" % (self.pkg.name, self.pkg.friendly_version, self.arch.name)
 
+       @property
+       def size(self):
+               return sum((p.size for p in self.packages))
+
        def get_state(self):
                return self.data.state
 
index 3326b4e6039e6b44577f8d81c2619e82267fd28b..d7c55529746ff7091994a15b13e0c7a9ce0ed05a 100644 (file)
@@ -3,6 +3,7 @@ $(document).ready(function() {
        window.prettyPrint && prettyPrint()
 
        // Activate tooltips.
+       $("a[rel=tooltip]").tooltip();
        $("span[rel=tooltip]").tooltip();
 });
 
index d9308c4e1bd0345ba95fba797ff8c9e374f926ee..c549fea219efa97f2db5dc06d71a46cc54a046ad 100644 (file)
@@ -1,16 +1,11 @@
 {% extends "base.html" %}
 
-{% block title %}{{ _("Build list") }}{% end block %}
+{% block title %}{{ _("Builds") }}{% end block %}
 
 {% block body %}
-       <h1>{{ _("Build list") }}</h1>
-       {% module BuildTable(builds, show_user=True) %}
-{% end block %}
+       <div class="page-header">
+               <h2>{{ _("Builds") }}</h2>
+       </div>
 
-{% block sidebar %}
-       <h1>{{ _("Actions") }}</h1>
-       <ul>
-               <li><a href="/builds/queue">{{ _("Job queue") }}</a></li>
-               <li><a href="/builds/filter">{{ _("Filter builds") }}</a></li>
-       </ul>
+       {% module BuildTable(builds, show_user=True) %}
 {% end block %}
index dc8b15ae5ae5dfd8418bcc57eb8721c50c8f87b3..fe57af8908945a05662f30a53b1caa8778fc566a 100644 (file)
@@ -1,88 +1,85 @@
-{% if builds %}
+{% if dates %}
        <table class="table table-striped table-hover">
-               <thead>
-                       <tr>
-                               <th>{{ _("Build") }}</th>
-                               <th>{{ _("Jobs") }}</th>
-                               {% if show_repo %}
-                                       <th>{{ _("Repository") }}</th>
-                               {% end %}
-                               {% if show_user %}
-                                       <th>{{ _("User") }}</th>
-                               {% end %}
-                               {% if show_when %}
-                                       <th>{{ _("When") }}</th>
-                               {% end %}
-                       </tr>
-               </thead>
                <tbody>
-                       {% for build in builds %}
-                               <tr class="build build_state_{{ build.state }}">
-                                       <td class="name">
-                                               <a class="build {{ build.type }} {{ build.state }} {% if build.is_broken() %}line-through{% end %}"
-                                                       href="/build/{{ build.uuid }}">{{ build.name }}</a>
+                       {% for date, builds in dates %}
+                               <tr>
+                                       <td colspan="4">
+                                               <h4>
+                                                       {% module HeadingDate(date) %}
+                                                       <small>({{ len(builds) }})</small>
+                                               </h4>
                                        </td>
-
-                                       <td class="jobs">
-                                               {% if build.jobs %}
-                                                       {% for job in build.jobs %}
-                                                                       <a class="job {{ job.state }}" title="{{ job.state }}"
-                                                                               href="/job/{{ job.uuid }}">{{ job.arch.name }}</a>
-                                                       {% end %}
-                                               {% else %}
-                                                       {{ _("This build has got no jobs.") }}
-                                               {% end %}
-                                       </td>
-
+                               </tr>
+                               <tr>
+                                       <th>{{ _("Build") }}</th>
+                                       <th>{{ _("Jobs") }}</th>
                                        {% if show_repo %}
-                                               <td>
-                                                       {% if build.repo %}
-                                                               <a href="/distro/{{ build.distro.identifier }}">{{ build.distro.name }}</a>
-                                                               /
-                                                               <a href="/distro/{{ build.distro.identifier }}/repo/{{ build.repo.identifier }}">{{ build.repo.name }}</a>
-                                                       {% else %}
-                                                               &nbsp;
-                                                       {% end %}
-                                               </td>
+                                               <th>{{ _("Repository") }}</th>
                                        {% end %}
-
                                        {% if show_user %}
-                                               {% if build.type == "scratch" and build.user %}
-                                                       <td class="user">
-                                                               {% module Maintainer(build.user) %}
-                                                       </td>
-                                               {% elif build.type == "release" %}
-                                                       <td>{% module Maintainer(build.pkg.maintainer) %}</td>
-                                               {% else %}
-                                                       <td>&nbsp;</td>
-                                               {% end %}
+                                               <th>{{ _("User") }}</th>
                                        {% end %}
-
                                        {% if show_when %}
-                                               <td>
-                                                       {{ format_date(build.created, relative=True) }}
-                                               </td>
+                                               <th>{{ _("Created") }}</th>
                                        {% end %}
+                               </tr>
 
-                                       {% if show_repo_time %}
-                                               <td class="time">
-                                                       {{ format_date(build.repo_time, relative=False) }}
+                               {% for build in builds %}
+                                       <tr>
+                                               <td class="name">
+                                                       <a class="build {{ build.type }} {{ build.state }} {% if build.is_broken() %}line-through{% end %}"
+                                                               href="/build/{{ build.uuid }}">{{ build.name }}</a>
                                                </td>
-                                       {% end %}
 
-                                       {% if show_can_move_forward %}
-                                               <td class="can-move-forward">
-                                                       {{ build.can_move_forward }}
+                                               <td>
+                                                       {% module JobsStatus(build) %}
                                                </td>
-                                       {% end %}
-                               </tr>
+
+                                               {% if show_repo %}
+                                                       <td>
+                                                               {% if build.repo %}
+                                                                       <a href="/distro/{{ build.distro.identifier }}">{{ build.distro.name }}</a> /
+                                                                       <a href="/distro/{{ build.distro.identifier }}/repo/{{ build.repo.identifier }}">{{ build.repo.name }}</a>
+                                                               {% end %}
+                                                       </td>
+                                               {% end %}
+
+                                               {% if show_user %}
+                                                       {% if build.type == "scratch" and build.user %}
+                                                               <td>
+                                                                       {% module Maintainer(build.user) %}
+                                                               </td>
+                                                       {% elif build.type == "release" %}
+                                                               <td>{% module Maintainer(build.pkg.maintainer) %}</td>
+                                                       {% else %}
+                                                               <td></td>
+                                                       {% end %}
+                                               {% end %}
+
+                                               {% if show_when %}
+                                                       <td>
+                                                               {{ format_date(build.created, relative=True) }}
+                                                       </td>
+                                               {% end %}
+
+                                               {% if show_repo_time %}
+                                                       <td>
+                                                               {{ format_date(build.repo_time, relative=False) }}
+                                                       </td>
+                                               {% end %}
+
+                                               {% if show_can_move_forward %}
+                                                       <td>
+                                                               {{ build.can_move_forward }}
+                                                       </td>
+                                               {% end %}
+                                       </tr>
+                               {% end %}
                        {% end %}
                </tbody>
        </table>
 {% else %}
-       <div class="message message-warning">
-               <span>{{ _("No builds") }}</span>
-               {{ _("There are no builds to show at this place.") }}
-               {{ _("Possibly you need to adjust your search.") }}
-       </div>
+       <p class="muted ac">
+               {{ _("There are no builds to show at this place right now.") }}
+       </p>
 {% end %}
diff --git a/data/templates/modules/jobs/status.html b/data/templates/modules/jobs/status.html
new file mode 100644 (file)
index 0000000..7f1158c
--- /dev/null
@@ -0,0 +1,11 @@
+{% if jobs %}
+       {% for j in jobs %}
+               <a href="/job/{{ j.uuid }}" rel="tooltip" title="{% module JobState(j, plain=True) %}">
+                       {% module JobState(j, show_arch=True) %}
+               </a>
+       {% end %}
+{% else %}
+       <span class="muted">
+               {{ _("This build has got no jobs.") }}
+       </span>
+{% end %}
index c897065817aec153edd63cfeebf2d9934d1fd816..e21ae010002848fc08a08f479bc0d5bbc624638e 100644 (file)
@@ -1,5 +1,6 @@
 <div class="lead lead-small ac">
        {% module Text(pkg.description) %}
+       <br>
 </div>
 
 <div class="muted">
index f50762895d1c64e7a92ac075f55da3c6471cb443..4fed2d46ead84189d1e52a101a3ad2c5a1ed2943 100644 (file)
@@ -1,20 +1,12 @@
 {% extends "base.html" %}
 
-{% block body %}
-       <h1>{{ _("Builds by %s") % user.realname }}</h1>
-
-       {% if builds %}
-
-               {% for order, items in sorted(builds.items()) %}
-                       {{ order }}
+{% block title %}{{ _("Builds by %s") % user.realname }}{% end block %}
 
-                       {% module BuildTable(items) %}
-               {% end %}
-
-       {% else %}
-
-               {{ _("No builds found matching your search criteria.") }}
+{% block body %}
+       <div class="page-header">
+               <h2>{{ _("Builds by %s") % user.realname }}</h2>
+       </div>
 
-       {% end %}
+       {% module BuildTable(builds) %}
 {% end block %}
 
index d8aa31a63094e31221740ac65e4f491384023e8f..c5f3b3e4fe59016e5c23b9f0b12b9cb6b41eddbc 100644 (file)
@@ -52,6 +52,7 @@ class Application(tornado.web.Application):
 
                                # Jobs
                                "JobsList"           : JobsListModule,
+                               "JobsStatus"         : JobsStatusModule,
 
                                # Packages
                                "PackagesDependencyTable" : PackagesDependencyTableModule,
@@ -76,6 +77,8 @@ class Application(tornado.web.Application):
                                "UsersTable"         : UsersTableModule,
                                "WatchersSidebarTable" : WatchersSidebarTableModule,
 
+                               "HeadingDate"        : HeadingDateModule,
+
                                "SelectLocale"       : SelectLocaleModule,
                                "SelectTimezone"     : SelectTimezoneModule,
                        },
index 7b969495bded2c9af966e3cfab64427f387bfb7c..f113c08704a089d6870a6a555e268ea2d761372c 100644 (file)
@@ -6,7 +6,13 @@ from handlers_base import BaseHandler
 
 class BuildsHandler(BaseHandler):
        def get(self):
-               builds = self.pakfire.builds.get_all(limit=50)
+               limit = self.get_argument("limit", None)
+               try:
+                       limit = int(limit)
+               except (TypeError, ValueError):
+                       limit = 25
+
+               builds = self.pakfire.builds.get_all(limit=limit)
 
                self.render("build-index.html", builds=builds)
 
index 7c1f131e22c2e1bb12b5019fa151f9f6f2a5354b..ced715a966c150d4d69236d3fd3dc24010545ca6 100644 (file)
@@ -227,39 +227,13 @@ class UsersCommentsHandler(BaseHandler):
 
 
 class UsersBuildsHandler(BaseHandler):
-       def __chunk_by_name(self, _builds):
-               builds = {}
-
-               for build in _builds:
-                       i = build.pkg.name[0]
-                       try:
-                               builds[i].append(build)
-                       except KeyError:
-                               builds[i] = [build,]
-               
-               return builds
-               #return [v for k,v in sorted(builds.items())]
-
-       def __chunk_by_date(self, _builds):
-               # XXX dummy function
-               builds = {
-                       datetime.datetime.utcnow() : _builds,
-               }
-
-               return builds
-
-               for build in _builds:
-                       builds.append([build,])
-
-               return builds
-
        def get(self, name=None):
-               if name:
+               if name is None:
+                       user = self.current_user
+               else:
                        user = self.pakfire.users.get_by_name(name)
                        if not user:
                                raise tornado.web.HTTPError(404, "User not found: %s" % name)
-               else:
-                       user = self.current_user
 
                # By default users see only public builds.
                # Admins are allowed to see all builds.
@@ -267,24 +241,7 @@ class UsersBuildsHandler(BaseHandler):
                if self.current_user and self.current_user.is_admin():
                        public = None
 
-               # Select the type of the builds that are shown.
-               # None for all.
-               type = self.get_argument("type", None)
-
-               # Select how to order the results. The default is by date.
-               order_by = self.get_argument("order_by", "date")
-               if not order_by in ("date", "name"):
-                       order_by = "date"
-
                # Get a list of the builds this user has built.
-               builds = self.pakfire.builds.get_by_user_iter(user, type=type,
-                       public=public, order_by=order_by)
-
-               if builds:
-                       # Chunk the list for a better presentation.
-                       if order_by == "date":
-                               builds = self.__chunk_by_date(builds)
-                       elif order_by == "name":
-                               builds = self.__chunk_by_name(builds)
+               builds = self.pakfire.builds.get_by_user(user, public=public)
 
                self.render("user-profile-builds.html", user=user, builds=builds)
index c17266548c50b8d5c6e14cdb379ad06843d4e09f..8285abedeabf0ee7aa964bb8a50ab20d1520251d 100644 (file)
@@ -2,6 +2,7 @@
 
 from __future__ import division
 
+import datetime
 import math
 import pytz
 import re
@@ -99,6 +100,12 @@ class BuildHeadlineModule(UIModule):
                        prefix=prefix, build=build, pkg=build.pkg, short=short, shorter=shorter)
 
 
+class JobsStatusModule(UIModule):
+       def render(self, build):
+               return self.render_string("modules/jobs/status.html",
+                       build=build, jobs=build.jobs)
+
+
 class BuildersLoadModule(UIModule):
        def render(self):
                load = self.pakfire.builders.get_load()
@@ -137,6 +144,26 @@ class FooterModule(UIModule):
                return self.render_string("modules/footer.html")
 
 
+class HeadingDateModule(UIModule):
+       def render(self, date):
+               _ = self.locale.translate
+
+               # Check if this is today.
+               today = datetime.date.today()
+               if date == today:
+                       return _("Today")
+
+               # Check if this was yesterday.
+               yesterday = today - datetime.timedelta(days=1)
+               if date == yesterday:
+                       return _("Yesterday")
+
+               # Convert date to datetime.
+               date = datetime.datetime(date.year, date.month, date.day)
+
+               return self.locale.format_date(date, shorter=True, relative=False)
+
+
 class PackagesTableModule(UIModule):
        def render(self, job, packages):
                return self.render_string("modules/packages-table.html", job=job,
@@ -216,8 +243,17 @@ class BuildTableModule(UIModule):
                )
                settings.update(kwargs)
 
-               return self.render_string("modules/build-table.html",
-                       builds=builds, **settings)
+               dates = {}
+
+               for b in builds:
+                       try:
+                               dates[b.date].append(b)
+                       except KeyError:
+                               dates[b.date] = [b,]
+
+               dates = sorted(dates.items(), reverse=True)
+
+               return self.render_string("modules/build-table.html", dates=dates, **settings)
 
 
 class BuildStateWarningsModule(UIModule):
@@ -235,7 +271,7 @@ class JobsBoxesModule(UIModule):
 
 
 class JobStateModule(UIModule):
-       def render(self, job, cls=None, show_icon=False):
+       def render(self, job, cls=None, show_arch=False, show_icon=False, plain=False):
                state = job.state
 
                _ = self.locale.translate
@@ -291,9 +327,15 @@ class JobStateModule(UIModule):
                        text = _("Unknown: %s") % state
                        classes.append("muted")
 
+               if plain:
+                       return text
+
                if cls:
                        classes.append(cls)
 
+               if show_arch:
+                       text = job.arch.name
+
                if show_icon and icon:
                        text = """<i class="%s"></i> %s""" % (icon, text)