Mercurial > treepkg > treepkg
view treepkg/web.py @ 546:149d18aca4f7
fix variable name
author | Bjoern Ricks <bricks@intevation.de> |
---|---|
date | Wed, 02 Feb 2011 10:00:48 +0000 |
parents | 31874ce6d621 |
children |
line wrap: on
line source
# Copyright (C) 2007, 2008, 2009 by Intevation GmbH # Authors: # Bernhard Herzog <bh@intevation.de> # # This program is free software under the GPL (>=v2) # Read the file COPYING coming with the software for details. import os import shutil import re from genshi.template import TemplateLoader # TODO see issue #1557 eliminate the dependency on cherrypy # For now just ignore the warnings caused by cherrypy import warnings warnings.filterwarnings("ignore", "the md5 module is deprecated", category=DeprecationWarning, module=__name__) import cherrypy from cherrypy import expose from cherrypy.lib import cptools import report class Status(object): """Implements the tree packager status pages""" def __init__(self, treepkg_config, template, logs): self.treepkg_config = treepkg_config self.template = template self.logs = logs self.loader = TemplateLoader([os.path.join(os.path.dirname(__file__), os.path.pardir, "web")]) @expose def index(self): group = report.get_packager_group(self.treepkg_config) tmpl = self.loader.load(self.template) stream = tmpl.generate(report=report.prepare_report(group, self.logs)) return stream.render('html') def determine_log_filename(self, package_track_name, revdir, log_basename): """Returns the name of a log file of a revision if it exists""" if re.match("(?P<revno>[0-9a-f]+)-(?P<rulesrev>[0-9a-f]+)$", revdir): revno, rulesrev = map(str, revdir.split("-")) group = report.get_packager_group(self.treepkg_config) for track in group.get_package_tracks(): if track.name == package_track_name: for revision in track.get_revisions(): if (revision.revision == revno and revision.rules_revision == rulesrev): for title, filename in revision.list_log_files( self.logs): if os.path.basename(filename) == log_basename: return filename @expose def default(self, *rest): """Handles requests for logfiles of the form .../pkg/revno/*""" filename = None if len(rest) == 3: filename = self.determine_log_filename(*rest) if filename is not None: if filename.endswith(".html"): content_type = "text/html" else: content_type = "text/plain" return cptools.serveFile(filename, contentType=content_type) else: raise cherrypy.HTTPError(status="404") def create_static_site(self, destdir): """Creates a static web-page under destdir""" # make sure we have an empty destdir shutil.rmtree(destdir, True) os.makedirs(destdir) # create the index file f = open(os.path.join(destdir, "index.html"), "wt") f.write(self.index()) f.close() # symlink the build-logs group = report.get_packager_group(self.treepkg_config) for track in group.get_package_tracks(): trackdir = os.path.join(destdir, track.name) for revision in track.get_revisions(): revdir = os.path.join(trackdir, "%s-%s" % (revision.revision, revision.rules_revision)) if revision.has_build_log(): if not os.path.isdir(trackdir): os.mkdir(trackdir) os.mkdir(revdir) for title, filename in revision.list_log_files(self.logs): os.symlink(filename, os.path.join(revdir, os.path.basename(filename))) class TreePKG(object): """Root object for the tree packager web interface""" @expose def index(self): raise cherrypy.HTTPRedirect('/status') def runserver(treepkg_config, cherrypy_config, status_template): cherrypy.root = TreePKG() cherrypy.root.status = Status(treepkg_config=treepkg_config, template=status_template) cherrypy.config.update(file=cherrypy_config) cherrypy.server.start()