view treepkg/web.py @ 372:ef87d30468b6

Added the option to expose additional log files from the log directory. To enable this one can either set a build_logs value in the staticweb.cfg or call createstaticweb with the parameter --show-logs. Default behavior is to only publish the build log, although the title is now capitalized.
author Andre Heinecke <aheinecke@intevation.de>
date Mon, 21 Jun 2010 08:23:30 +0000
parents e749fe36ece3
children c29714c601da
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

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.mkdir(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()
This site is hosted by Intevation GmbH (Datenschutzerklärung und Impressum | Privacy Policy and Imprint)