From: Michael Tremer Date: Wed, 12 Dec 2012 09:43:17 +0000 (+0100) Subject: Update lists of builds. X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=eedc64321bc1dc71710dddd221253013db7c6ac3;p=pbs.git Update lists of builds. --- diff --git a/backend/builds.py b/backend/builds.py index 7701ad19..81f77dac 100644 --- a/backend/builds.py +++ b/backend/builds.py @@ -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 diff --git a/data/static/js/pbs.js b/data/static/js/pbs.js index 3326b4e6..d7c55529 100644 --- a/data/static/js/pbs.js +++ b/data/static/js/pbs.js @@ -3,6 +3,7 @@ $(document).ready(function() { window.prettyPrint && prettyPrint() // Activate tooltips. + $("a[rel=tooltip]").tooltip(); $("span[rel=tooltip]").tooltip(); }); diff --git a/data/templates/build-index.html b/data/templates/build-index.html index d9308c4e..c549fea2 100644 --- a/data/templates/build-index.html +++ b/data/templates/build-index.html @@ -1,16 +1,11 @@ {% extends "base.html" %} -{% block title %}{{ _("Build list") }}{% end block %} +{% block title %}{{ _("Builds") }}{% end block %} {% block body %} -

{{ _("Build list") }}

- {% module BuildTable(builds, show_user=True) %} -{% end block %} + -{% block sidebar %} -

{{ _("Actions") }}

- + {% module BuildTable(builds, show_user=True) %} {% end block %} diff --git a/data/templates/modules/build-table.html b/data/templates/modules/build-table.html index dc8b15ae..fe57af89 100644 --- a/data/templates/modules/build-table.html +++ b/data/templates/modules/build-table.html @@ -1,88 +1,85 @@ -{% if builds %} +{% if dates %} - - - - - {% if show_repo %} - - {% end %} - {% if show_user %} - - {% end %} - {% if show_when %} - - {% end %} - - - {% for build in builds %} - - + - - - + + + + {% if show_repo %} - + {% end %} - {% if show_user %} - {% if build.type == "scratch" and build.user %} - - {% elif build.type == "release" %} - - {% else %} - - {% end %} + {% end %} - {% if show_when %} - + {% end %} + - {% if show_repo_time %} - + - {% end %} - {% if show_can_move_forward %} - - {% end %} - + + {% if show_repo %} + + {% end %} + + {% if show_user %} + {% if build.type == "scratch" and build.user %} + + {% elif build.type == "release" %} + + {% else %} + + {% end %} + {% end %} + + {% if show_when %} + + {% end %} + + {% if show_repo_time %} + + {% end %} + + {% if show_can_move_forward %} + + {% end %} + + {% end %} {% end %}
{{ _("Build") }}{{ _("Jobs") }}{{ _("Repository") }}{{ _("User") }}{{ _("When") }}
- {{ build.name }} + {% for date, builds in dates %} +
+

+ {% module HeadingDate(date) %} + ({{ len(builds) }}) +

- {% if build.jobs %} - {% for job in build.jobs %} - {{ job.arch.name }} - {% end %} - {% else %} - {{ _("This build has got no jobs.") }} - {% end %} -
{{ _("Build") }}{{ _("Jobs") }} - {% if build.repo %} - {{ build.distro.name }} - / - {{ build.repo.name }} - {% else %} -   - {% end %} - {{ _("Repository") }} - {% module Maintainer(build.user) %} - {% module Maintainer(build.pkg.maintainer) %} {{ _("User") }} - {{ format_date(build.created, relative=True) }} - {{ _("Created") }}
- {{ format_date(build.repo_time, relative=False) }} + {% for build in builds %} +
+ {{ build.name }} - {{ build.can_move_forward }} + + {% module JobsStatus(build) %}
+ {% if build.repo %} + {{ build.distro.name }} / + {{ build.repo.name }} + {% end %} + + {% module Maintainer(build.user) %} + {% module Maintainer(build.pkg.maintainer) %} + {{ format_date(build.created, relative=True) }} + + {{ format_date(build.repo_time, relative=False) }} + + {{ build.can_move_forward }} +
{% else %} -
- {{ _("No builds") }} - {{ _("There are no builds to show at this place.") }} - {{ _("Possibly you need to adjust your search.") }} -
+

+ {{ _("There are no builds to show at this place right now.") }} +

{% end %} diff --git a/data/templates/modules/jobs/status.html b/data/templates/modules/jobs/status.html new file mode 100644 index 00000000..7f1158c9 --- /dev/null +++ b/data/templates/modules/jobs/status.html @@ -0,0 +1,11 @@ +{% if jobs %} + {% for j in jobs %} + + {% module JobState(j, show_arch=True) %} + + {% end %} +{% else %} + + {{ _("This build has got no jobs.") }} + +{% end %} diff --git a/data/templates/modules/package-header.html b/data/templates/modules/package-header.html index c8970658..e21ae010 100644 --- a/data/templates/modules/package-header.html +++ b/data/templates/modules/package-header.html @@ -1,5 +1,6 @@
{% module Text(pkg.description) %} +
diff --git a/data/templates/user-profile-builds.html b/data/templates/user-profile-builds.html index f5076289..4fed2d46 100644 --- a/data/templates/user-profile-builds.html +++ b/data/templates/user-profile-builds.html @@ -1,20 +1,12 @@ {% extends "base.html" %} -{% block body %} -

{{ _("Builds by %s") % user.realname }}

- - {% 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 %} + - {% end %} + {% module BuildTable(builds) %} {% end block %} diff --git a/web/__init__.py b/web/__init__.py index d8aa31a6..c5f3b3e4 100644 --- a/web/__init__.py +++ b/web/__init__.py @@ -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, }, diff --git a/web/handlers_builds.py b/web/handlers_builds.py index 7b969495..f113c087 100644 --- a/web/handlers_builds.py +++ b/web/handlers_builds.py @@ -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) diff --git a/web/handlers_users.py b/web/handlers_users.py index 7c1f131e..ced715a9 100644 --- a/web/handlers_users.py +++ b/web/handlers_users.py @@ -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) diff --git a/web/ui_modules.py b/web/ui_modules.py index c1726654..8285abed 100644 --- a/web/ui_modules.py +++ b/web/ui_modules.py @@ -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 = """ %s""" % (icon, text)