from patchtracker import Conf, DB from patchtracker.DiffGzHandler import DiffGzHandler from patchtracker.DebTarHandler import DebTarHandler from patchtracker.SourceArchive import ReleaseList from Cheetah.Template import Template from Cheetah.Compiler import Compiler import os, errno import re class OurTemplate(Template): def __init__(self, file, searchList=None): ourSearchList={"conf":Conf, "crumbs":[]} if searchList: for k,v in searchList.iteritems(): ourSearchList[k]=v self.escape_name = self._escape_name self.wrappable_version = self._wrappable_version self.link = self._link Template.__init__(self, file=file, searchList=ourSearchList) def _link(self, where, name): return str("%s"%(where,name)) def _escape_name(self, name): return re.sub("([^a-zA-Z0-9-])", (lambda x: "_%d"%(ord(x.group(1)))), name) def _wrappable_version(self, version): """ output a version that can be broken up by a web browser using the unicode zero-whitespace-break character (​) """ return '​'.join([version[i:i+12] for i in range(0,len(version),12)]) class PackageVersTemplate(OurTemplate): def __init__(self, srcpkg): self.src = srcpkg tpl=os.sep.join([Conf.template_dir, "package_vers.tmpl"]) sl = {} # XXX c/p from PatchCmd.make_diffhandler db = DB.PatchTrackerDB() dfile = db.findDiffGz(srcpkg.name,srcpkg.version) if dfile: sl['diffhandler'] = DiffGzHandler(dfile) else: dfile = db.findDebTar(srcpkg.name, srcpkg.version) if dfile: sl['diffhandler'] = DebTarHandler(dfile) sl['crumbs'] = [("package/"+srcpkg.name,srcpkg.name), ("package/"+srcpkg.name+"/"+srcpkg.version, srcpkg.name+"/"+srcpkg.version)] OurTemplate.__init__(self, file=tpl, searchList=sl) class FrontPageTemplate(OurTemplate): def __init__(self, indices): tpl = os.sep.join([Conf.template_dir, "frontpage.tmpl"]) OurTemplate.__init__(self, file=tpl) self.indices = indices class LetterTocTemplate(OurTemplate): def __init__(self, letter, collection): self.pkgs = collection self.idx = letter self.dists = ReleaseList("debian") sl = {} sl['crumbs'] = [("index/"+letter,"index for "+letter)] tpl = os.sep.join([Conf.template_dir, "letter_toc.tmpl"]) OurTemplate.__init__(self, file=tpl, searchList=sl) class SearchResultsTemplate(OurTemplate): def __init__(self, search, searchtype, collection): self.pkgs = {} self.idx = search self.searchtype = searchtype self.dists = ReleaseList("debian") for idx in collection.indices(): for name,packagelist in collection.getletter(idx).iteritems(): self.pkgs[name] = packagelist tpl = os.sep.join([Conf.template_dir, "searchresults.tmpl"]) OurTemplate.__init__(self, file=tpl) class ErrorTemplate(OurTemplate): def __init__(self, msg): tpl = os.sep.join([Conf.template_dir, "cgi_error.tmpl"]) OurTemplate.__init__(self, file=tpl, searchList={'error':msg}) class PatchTemplate(OurTemplate): def __init__(self, pkg=None, vers=None, name=None, patch=None,patchtype=None): tpl = os.sep.join([Conf.template_dir, "patch_view.tmpl"]) sl = {'package':pkg, 'version':vers, 'name':name, 'patch':patch, 'patchtype':patchtype} sl['crumbs'] = [("package/"+pkg,pkg), ("package/"+pkg+"/"+vers, pkg+"/"+vers)] if patchtype == "debianonly": sl['crumbs'].append( ("patch/%s/view/%s/%s"%(patchtype,pkg,vers), "./debian-dir only patch") ) elif patchtype == "series": sl['crumbs'].append(("patch/%s/view/%s/%s/%s"%(patchtype,pkg,vers,name), "series patch "+name) ) elif patchtype == "misc": sl['crumbs'].append(("patch/%s/view/%s/%s/%s"%(patchtype,pkg,vers,name), "direct patch of "+name) ) OurTemplate.__init__(self, file=tpl, searchList=sl)