コード例 #1
0
ファイル: builder.py プロジェクト: aloisiojr/buildbot
    def request_line(self, build_request, req):
        when = time.strftime("%b %d %H:%M:%S", time.localtime(build_request.getSubmitTime()))
        delay = util.formatInterval(util.now() - build_request.getSubmitTime())
        changes = build_request.source.changes
        if changes:
            change_strings = []
            for c in changes:
                change_strings.append("<a href=\"%s\">%s</a>" % (path_to_change(req, c), c.who))
            if len(change_strings) == 1:
                reason = "change by %s" % change_strings[0]
            else:
                reason = "changes by %s" % ", ".join(change_strings)
        elif build_request.source.revision:
            reason = build_request.source.revision
        else:
            reason = "no changes specified"

        if self.builder_control is not None:
            cancelURL = path_to_builder(req, self.builder_status) + '/cancelbuild'
            cancelButton = '''
<form action="%s" class="command cancelbuild" style="display:inline" method="post">
  <input type="hidden" name="id" value="%s" />
  <input type="submit" value="Cancel Build" />
</form>''' % (cancelURL, id(build_request))
        else:
            cancelButton = ""
        return "<font size=\"-1\">(%s, waiting %s)</font>%s%s" % (when, delay, cancelButton, reason)
コード例 #2
0
ファイル: builder.py プロジェクト: kusoof/wprof
    def request_line(self, build_request, req):
        when = time.strftime("%b %d %H:%M:%S",
                             time.localtime(build_request.getSubmitTime()))
        delay = util.formatInterval(util.now() - build_request.getSubmitTime())
        changes = build_request.source.changes
        if changes:
            change_strings = []
            for c in changes:
                change_strings.append("<a href=\"%s\">%s</a>" %
                                      (path_to_change(req, c), c.who))
            if len(change_strings) == 1:
                reason = "change by %s" % change_strings[0]
            else:
                reason = "changes by %s" % ", ".join(change_strings)
        elif build_request.source.revision:
            reason = build_request.source.revision
        else:
            reason = "no changes specified"

        if self.builder_control is not None:
            cancelURL = path_to_builder(req,
                                        self.builder_status) + '/cancelbuild'
            cancelButton = '''
<form action="%s" class="command cancelbuild" style="display:inline" method="post">
  <input type="hidden" name="id" value="%s" />
  <input type="submit" value="Cancel Build" />
</form>''' % (cancelURL, id(build_request))
        else:
            cancelButton = ""
        return "<font size=\"-1\">(%s, waiting %s)</font>%s%s" % (
            when, delay, cancelButton, reason)
コード例 #3
0
ファイル: builder.py プロジェクト: brasse/buildbot
    def content(self, req, cxt):
        b = self.builder_status

        cxt["name"] = b.getName()

        slaves = b.getSlaves()
        connected_slaves = [s for s in slaves if s.isConnected()]

        cxt["current"] = [self.builder(x, req) for x in b.getCurrentBuilds()]

        cxt["pending"] = []
        for pb in b.getPendingBuilds():
            changes = []

            if pb.source.changes:
                for c in pb.source.changes:
                    changes.append({"url": path_to_change(req, c), "who": c.who})
            if pb.source.revision:
                reason = pb.source.revision
            else:
                reason = "no changes specified"

            cxt["pending"].append(
                {
                    "when": time.strftime("%b %d %H:%M:%S", time.localtime(pb.getSubmitTime())),
                    "delay": util.formatInterval(util.now() - pb.getSubmitTime()),
                    "reason": reason,
                    "id": id(pb),
                    "changes": changes,
                }
            )

        numbuilds = int(req.args.get("numbuilds", ["5"])[0])
        recent = cxt["recent"] = []
        for build in b.generateFinishedBuilds(num_builds=int(numbuilds)):
            recent.append(self.get_line_values(req, build, False))

        sl = cxt["slaves"] = []
        connected_slaves = 0
        for slave in slaves:
            s = {}
            sl.append(s)
            s["link"] = path_to_slave(req, slave)
            s["name"] = slave.getName()
            c = s["connected"] = slave.isConnected()
            if c:
                s["admin"] = slave.getAdmin()
                connected_slaves += 1
        cxt["connected_slaves"] = connected_slaves

        cxt["authz"] = self.getAuthz(req)
        cxt["builder_url"] = path_to_builder(req, b)

        template = req.site.buildbot_service.templates.get_template("builder.html")
        return template.render(**cxt)
コード例 #4
0
ファイル: builder.py プロジェクト: PerilousApricot/buildbot
    def content(self, req, cxt):
        b = self.builder_status

        cxt['name'] = b.getName()
        
        slaves = b.getSlaves()
        connected_slaves = [s for s in slaves if s.isConnected()]

        cxt['current'] = [self.builder(x, req) for x in b.getCurrentBuilds()]

        cxt['pending'] = []
        for pb in b.getPendingBuilds():
            source = pb.getSourceStamp()
            changes = []

            if source.changes:
                for c in source.changes:
                    changes.append({ 'url' : path_to_change(req, c),
                                            'who' : c.who})
            if source.revision:
                reason = source.revision
            else:
                reason = "no changes specified"

            cxt['pending'].append({
                'when': time.strftime("%b %d %H:%M:%S", time.localtime(pb.getSubmitTime())),
                'delay': util.formatInterval(util.now() - pb.getSubmitTime()),
                'reason': reason,
                'id': pb.brid,
                'changes' : changes
                })

        numbuilds = int(req.args.get('numbuilds', ['5'])[0])
        recent = cxt['recent'] = []
        for build in b.generateFinishedBuilds(num_builds=int(numbuilds)):
            recent.append(self.get_line_values(req, build, False))

        sl = cxt['slaves'] = []
        connected_slaves = 0
        for slave in slaves:
            s = {}
            sl.append(s)
            s['link'] = path_to_slave(req, slave)
            s['name'] = slave.getName()
            c = s['connected'] = slave.isConnected()
            if c:
                s['admin'] = slave.getAdmin()
                connected_slaves += 1
        cxt['connected_slaves'] = connected_slaves

        cxt['authz'] = self.getAuthz(req)
        cxt['builder_url'] = path_to_builder(req, b)

        template = req.site.buildbot_service.templates.get_template("builder.html")
        return template.render(**cxt)
コード例 #5
0
    def content(self, req, cxt):
        b = self.builder_status

        cxt['name'] = b.getName()
        cxt['description'] = b.getDescription()
        req.setHeader('Cache-Control', 'no-cache')
        slaves = b.getSlaves()
        connected_slaves = [s for s in slaves if s.isConnected()]

        cxt['current'] = [self.builder(x, req) for x in b.getCurrentBuilds()]

        cxt['pending'] = []
        statuses = yield b.getPendingBuildRequestStatuses()
        for pb in statuses:
            changes = []

            source = yield pb.getSourceStamp()
            submitTime = yield pb.getSubmitTime()
            bsid = yield pb.getBsid()

            properties = yield \
                    pb.master.db.buildsets.getBuildsetProperties(bsid)

            if source.changes:
                for c in source.changes:
                    changes.append({ 'url' : path_to_change(req, c),
                                     'who' : c.who,
                                     'revision' : c.revision,
                                     'repo' : c.repository })

            cxt['pending'].append({
                'when': time.strftime("%b %d %H:%M:%S",
                                      time.localtime(submitTime)),
                'delay': util.formatInterval(util.now() - submitTime),
                'id': pb.brid,
                'changes' : changes,
                'num_changes' : len(changes),
                'properties' : properties,
                })

        numbuilds = int(req.args.get('numbuilds', [self.numbuilds])[0])
        recent = cxt['recent'] = []
        for build in b.generateFinishedBuilds(num_builds=int(numbuilds)):
            recent.append(self.get_line_values(req, build, False))

        sl = cxt['slaves'] = []
        connected_slaves = 0
        for slave in slaves:
            s = {}
            sl.append(s)
            s['link'] = path_to_slave(req, slave)
            s['name'] = slave.getName()
            c = s['connected'] = slave.isConnected()
            if c:
                s['admin'] = unicode(slave.getAdmin() or '', 'utf-8')
                connected_slaves += 1
        cxt['connected_slaves'] = connected_slaves

        cxt['authz'] = self.getAuthz(req)
        cxt['builder_url'] = path_to_builder(req, b)
        buildForceContext(cxt, req, self.getBuildmaster(req), b.getName())
        template = req.site.buildbot_service.templates.get_template("builder.html")
        defer.returnValue(template.render(**cxt))
コード例 #6
0
ファイル: builder.py プロジェクト: eminence/buildbot
    def content(self, req, cxt):
        b = self.builder_status

        # Grab all the parameters which are prefixed with 'property.'.
        # We'll use these to filter the builds and build requests we
        # show below.
        props = {}
        prop_prefix = 'property.'
        for arg, val in req.args.iteritems():
            if arg.startswith(prop_prefix):
                props[arg[len(prop_prefix):]] = val[0]

        def prop_match(oprops):
            for key, val in props.iteritems():
                if key not in oprops or val != str(oprops[key]):
                    return False
            return True

        cxt['name'] = b.getName()
        cxt['description'] = b.getDescription()
        req.setHeader('Cache-Control', 'no-cache')
        slaves = b.getSlaves()
        connected_slaves = [s for s in slaves if s.isConnected()]

        cxt['current'] = [
            self.builder(x, req) for x in b.getCurrentBuilds()
            if prop_match(x.getProperties())]

        cxt['pending'] = []
        statuses = yield b.getPendingBuildRequestStatuses()
        for pb in statuses:
            changes = []

            source = yield pb.getSourceStamp()
            submitTime = yield pb.getSubmitTime()
            bsid = yield pb.getBsid()

            properties = yield \
                pb.master.db.buildsets.getBuildsetProperties(bsid)
            if not prop_match(properties):
                continue

            if source.changes:
                for c in source.changes:
                    changes.append({'url': path_to_change(req, c),
                                    'who': c.who,
                                    'revision': c.revision,
                                    'repo': c.repository})

            cxt['pending'].append({
                'when': time.strftime("%b %d %H:%M:%S",
                                      time.localtime(submitTime)),
                'delay': util.formatInterval(util.now() - submitTime),
                'id': pb.brid,
                'changes': changes,
                'num_changes': len(changes),
                'properties': properties,
            })

        numbuilds = cxt['numbuilds'] = int(req.args.get('numbuilds', [self.numbuilds])[0])
        maxsearch = int(req.args.get('maxsearch', [200])[0])
        recent = cxt['recent'] = []
        for build in b.generateFinishedBuilds(
                num_builds=int(numbuilds),
                max_search=maxsearch,
                filter_fn=lambda b: prop_match(b.getProperties())):
            recent.append(self.get_line_values(req, build, False))

        sl = cxt['slaves'] = []
        connected_slaves = 0
        for slave in slaves:
            s = {}
            sl.append(s)
            s['link'] = path_to_slave(req, slave)
            s['name'] = slave.getName()
            c = s['connected'] = slave.isConnected()
            s['paused'] = slave.isPaused()
            s['admin'] = slave.getAdmin() or u''
            if c:
                connected_slaves += 1
        cxt['connected_slaves'] = connected_slaves

        cxt['authz'] = self.getAuthz(req)
        cxt['builder_url'] = path_to_builder(req, b)
        buildForceContext(cxt, req, self.getBuildmaster(req), b.getName())
        template = req.site.buildbot_service.templates.get_template("builder.html")
        defer.returnValue(template.render(**cxt))
コード例 #7
0
    def content(self, req, cxt):
        b = self.builder_status

        cxt['name'] = b.getName()
        req.setHeader('Cache-Control', 'no-cache')
        slaves = b.getSlaves()
        connected_slaves = [s for s in slaves if s.isConnected()]

        cxt['current'] = [self.builder(x, req) for x in b.getCurrentBuilds()]

        cxt['pending'] = []
        for pb in b.getPendingBuilds():
            source = pb.getSourceStamp()
            changes = []

            if source.changes:
                for c in source.changes:
                    changes.append({
                        'url': path_to_change(req, c),
                        'who': c.who,
                        'revision': c.revision,
                        'repo': c.repository
                    })

            cxt['pending'].append({
                'when':
                time.strftime("%b %d %H:%M:%S",
                              time.localtime(pb.getSubmitTime())),
                'delay':
                util.formatInterval(util.now() - pb.getSubmitTime()),
                'id':
                pb.brid,
                'changes':
                changes,
                'num_changes':
                len(changes),
            })

        numbuilds = int(req.args.get('numbuilds', ['5'])[0])
        recent = cxt['recent'] = []
        for build in b.generateFinishedBuilds(num_builds=int(numbuilds)):
            recent.append(self.get_line_values(req, build, False))

        sl = cxt['slaves'] = []
        connected_slaves = 0
        for slave in slaves:
            s = {}
            sl.append(s)
            s['link'] = path_to_slave(req, slave)
            s['name'] = slave.getName()
            c = s['connected'] = slave.isConnected()
            if c:
                s['admin'] = unicode(slave.getAdmin() or '', 'utf-8')
                connected_slaves += 1
        cxt['connected_slaves'] = connected_slaves

        cxt['authz'] = self.getAuthz(req)
        cxt['builder_url'] = path_to_builder(req, b)

        template = req.site.buildbot_service.templates.get_template(
            "builder.html")
        return template.render(**cxt)
コード例 #8
0
    def content(self, req, cxt):
        b = self.builder_status

        # Grab all the parameters which are prefixed with 'property.'.
        # We'll use these to filter the builds and build requests we
        # show below.
        props = {}
        prop_prefix = 'property.'
        for arg, val in req.args.iteritems():
            if arg.startswith(prop_prefix):
                props[arg[len(prop_prefix):]] = val[0]

        def prop_match(oprops):
            for key, val in props.iteritems():
                if key not in oprops or val != str(oprops[key]):
                    return False
            return True

        cxt['name'] = b.getName()
        cxt['description'] = b.getDescription()
        req.setHeader('Cache-Control', 'no-cache')
        slaves = b.getSlaves()
        connected_slaves = [s for s in slaves if s.isConnected()]

        cxt['current'] = [
            self.builder(x, req) for x in b.getCurrentBuilds()
            if prop_match(x.getProperties())
        ]

        cxt['pending'] = []
        statuses = yield b.getPendingBuildRequestStatuses()
        for pb in statuses:
            changes = []

            source = yield pb.getSourceStamp()
            submitTime = yield pb.getSubmitTime()
            bsid = yield pb.getBsid()

            properties = yield \
                pb.master.db.buildsets.getBuildsetProperties(bsid)
            if not prop_match(properties):
                continue

            if source.changes:
                for c in source.changes:
                    changes.append({
                        'url': path_to_change(req, c),
                        'who': c.who,
                        'revision': c.revision,
                        'repo': c.repository
                    })

            cxt['pending'].append({
                'when':
                time.strftime("%b %d %H:%M:%S", time.localtime(submitTime)),
                'delay':
                util.formatInterval(util.now() - submitTime),
                'id':
                pb.brid,
                'changes':
                changes,
                'num_changes':
                len(changes),
                'properties':
                properties,
            })

        try:
            numbuilds = cxt['numbuilds'] = int(
                req.args.get('numbuilds', [self.numbuilds])[0])
        except ValueError:
            numbuilds = cxt['numbuilds'] = 10
        maxsearch = int(req.args.get('maxsearch', [200])[0])
        recent = cxt['recent'] = []
        for build in b.generateFinishedBuilds(
                num_builds=int(numbuilds),
                max_search=maxsearch,
                filter_fn=lambda b: prop_match(b.getProperties())):
            recent.append(self.get_line_values(req, build, False))

        sl = cxt['slaves'] = []
        connected_slaves = 0
        for slave in slaves:
            s = {}
            sl.append(s)
            s['link'] = path_to_slave(req, slave)
            s['name'] = slave.getName()
            c = s['connected'] = slave.isConnected()
            s['paused'] = slave.isPaused()
            s['admin'] = slave.getAdmin() or u''
            if c:
                connected_slaves += 1
        cxt['connected_slaves'] = connected_slaves

        cxt['authz'] = self.getAuthz(req)
        cxt['builder_url'] = path_to_builder(req, b)
        buildForceContext(cxt, req, self.getBuildmaster(req), b.getName())
        template = req.site.buildbot_service.templates.get_template(
            "builder.html")
        defer.returnValue(template.render(**cxt))
コード例 #9
0
ファイル: web.py プロジェクト: chengdh/openerp-buildbot
    def content(self, req, cxt):
        """ Mainly the same with parent class, but enumerates test results, too """
        b = self.builder_status

        cxt['name'] = b.getName()
        req.setHeader('Cache-Control', 'no-cache')
        slaves = b.getSlaves()
        connected_slaves = [s for s in slaves if s.isConnected()]

        cxt['current'] = [self.builder(x, req) for x in b.getCurrentBuilds()]

        cxt['pending'] = []
        for pb in b.getPendingBuilds():
            source = pb.getSourceStamp()
            changes = []

            if source.changes:
                for c in source.changes:
                    changes.append({ 'url' : path_to_change(req, c),
                                            'who' : c.who})
            if source.revision:
                reason = source.revision
            else:
                reason = "no changes specified"

            cxt['pending'].append({
                'when': time.strftime("%b %d %H:%M:%S", time.localtime(pb.getSubmitTime())),
                'delay': util.formatInterval(util.now() - pb.getSubmitTime()),
                'reason': reason,
                'id': pb.brid,
                'changes' : changes
                })

        numbuilds = int(req.args.get('numbuilds', ['5'])[0])
        recent = cxt['recent'] = []
        tr_names = cxt['test_results_order'] = []
        for build in b.generateFinishedBuilds(num_builds=int(numbuilds)):
            lvals = self.get_line_values(req, build, False)
            recent.append(lvals)
            for trn in lvals.get('test_result_order',[]):
                if trn not in tr_names:
                    tr_names.append(trn)

        sl = cxt['slaves'] = []
        connected_slaves = 0
        for slave in slaves:
            s = {}
            sl.append(s)
            s['link'] = path_to_slave(req, slave)
            s['name'] = slave.getName()
            c = s['connected'] = slave.isConnected()
            if c:
                s['admin'] = unicode(slave.getAdmin() or '', 'utf-8')
                connected_slaves += 1
        cxt['connected_slaves'] = connected_slaves

        cxt['authz'] = self.getAuthz(req)
        cxt['builder_url'] = path_to_builder(req, b)

        template = req.site.buildbot_service.templates.get_template(self.tpl_page)
        return template.render(**cxt)
コード例 #10
0
ファイル: builder.py プロジェクト: abyx/buildbot
    def content(self, req, cxt):
        b = self.builder_status
        control = self.builder_control
        status = self.getStatus(req)

        cxt['name'] = b.getName()
        
        slaves = b.getSlaves()
        connected_slaves = [s for s in slaves if s.isConnected()]

        cxt['current'] = [self.builder(x, req) for x in b.getCurrentBuilds()]        
            
        cxt['pending'] = []        
        for pb in b.getPendingBuilds():
            changes = []

            if pb.source.changes:
                for c in pb.source.changes:
                    changes.append({ 'url' : path_to_change(req, c),
                                            'who' : c.who})
            elif pb.source.revision:
                reason = pb.source.revision
            else:
                reason = "no changes specified"
                    
            cxt['pending'].append({
                'when': time.strftime("%b %d %H:%M:%S", time.localtime(pb.getSubmitTime())),
                'delay': util.formatInterval(util.now() - pb.getSubmitTime()),
                'reason': reason,
                'id': id(pb),
                'changes' : changes
                })

        if self.builder_control is not None:
            cxt['cancel_url'] = path_to_builder(req, b) + '/cancelbuild'
                        
        numbuilds = int(req.args.get('numbuilds', ['5'])[0])
        recent = cxt['recent'] = []
        for build in b.generateFinishedBuilds(num_builds=int(numbuilds)):
            recent.append(self.get_line_values(req, build, False))

        sl = cxt['slaves'] = []
        for slave in slaves:
            s = {}
            sl.append(s)
            s['link'] = path_to_slave(req, slave)
            s['name'] = slave.getName()
            c = s['connected'] = slave.isConnected()
            if c:
                s['admin'] = slave.getAdmin()

        if control is not None and connected_slaves:
            cxt['force_url'] = path_to_builder(req, b) + '/force'
            cxt['use_user_passwd'] = self.isUsingUserPasswd(req)
        elif control is not None:
            cxt['all_slaves_offline'] = True

        if control is not None:
            cxt['ping_url'] = path_to_builder(req, b) + '/ping'

        template = req.site.buildbot_service.templates.get_template("builder.html")
        return template.render(**cxt)
コード例 #11
0
ファイル: builder.py プロジェクト: denny820909/builder
    def content(self, req, cxt):
        b = self.builder_status

        cxt["name"] = b.getName()
        cxt["description"] = b.getDescription()
        req.setHeader("Cache-Control", "no-cache")
        slaves = b.getSlaves()
        connected_slaves = [s for s in slaves if s.isConnected()]

        cxt["current"] = [self.builder(x, req) for x in b.getCurrentBuilds()]

        cxt["pending"] = []
        statuses = yield b.getPendingBuildRequestStatuses()
        for pb in statuses:
            changes = []

            source = yield pb.getSourceStamp()
            submitTime = yield pb.getSubmitTime()
            bsid = yield pb.getBsid()

            properties = yield pb.master.db.buildsets.getBuildsetProperties(bsid)

            if source.changes:
                for c in source.changes:
                    changes.append(
                        {"url": path_to_change(req, c), "who": c.who, "revision": c.revision, "repo": c.repository}
                    )

            cxt["pending"].append(
                {
                    "when": time.strftime("%b %d %H:%M:%S", time.localtime(submitTime)),
                    "delay": util.formatInterval(util.now() - submitTime),
                    "id": pb.brid,
                    "changes": changes,
                    "num_changes": len(changes),
                    "properties": properties,
                }
            )

        numbuilds = cxt["numbuilds"] = int(req.args.get("numbuilds", [self.numbuilds])[0])
        recent = cxt["recent"] = []
        for build in b.generateFinishedBuilds(num_builds=int(numbuilds)):
            recent.append(self.get_line_values(req, build, False))

        sl = cxt["slaves"] = []
        connected_slaves = 0
        for slave in slaves:
            s = {}
            sl.append(s)
            s["link"] = path_to_slave(req, slave)
            s["name"] = slave.getName()
            c = s["connected"] = slave.isConnected()
            s["paused"] = slave.isPaused()
            s["admin"] = unicode(slave.getAdmin() or "", "utf-8")
            if c:
                connected_slaves += 1
        cxt["connected_slaves"] = connected_slaves

        cxt["authz"] = self.getAuthz(req)
        cxt["builder_url"] = path_to_builder(req, b)
        buildForceContext(cxt, req, self.getBuildmaster(req), b.getName())
        template = req.site.buildbot_service.templates.get_template("builder.html")
        defer.returnValue(template.render(**cxt))
コード例 #12
0
ファイル: web.py プロジェクト: xrg/openerp-buildbot
    def content(self, req, cxt):
        """ Mainly the same with parent class, but enumerates test results, too """
        b = self.builder_status

        cxt["name"] = b.getName()
        req.setHeader("Cache-Control", "no-cache")
        slaves = b.getSlaves()
        connected_slaves = [s for s in slaves if s.isConnected()]

        cxt["current"] = [self.builder(x, req) for x in b.getCurrentBuilds()]

        cxt["pending"] = []
        for pb in b.getPendingBuilds():
            source = pb.getSourceStamp()
            changes = []

            if source.changes:
                for c in source.changes:
                    changes.append({"url": path_to_change(req, c), "who": c.who})
            if source.revision:
                reason = source.revision
            else:
                reason = "no changes specified"

            cxt["pending"].append(
                {
                    "when": time.strftime("%b %d %H:%M:%S", time.localtime(pb.getSubmitTime())),
                    "delay": util.formatInterval(util.now() - pb.getSubmitTime()),
                    "reason": reason,
                    "id": pb.brid,
                    "changes": changes,
                }
            )

        numbuilds = int(req.args.get("numbuilds", ["5"])[0])
        recent = cxt["recent"] = []
        tr_names = cxt["test_results_order"] = []
        for build in b.generateFinishedBuilds(num_builds=int(numbuilds)):
            lvals = self.get_line_values(req, build, False)
            recent.append(lvals)
            for trn in lvals.get("test_result_order", []):
                if trn not in tr_names:
                    tr_names.append(trn)

        sl = cxt["slaves"] = []
        connected_slaves = 0
        for slave in slaves:
            s = {}
            sl.append(s)
            s["link"] = path_to_slave(req, slave)
            s["name"] = slave.getName()
            c = s["connected"] = slave.isConnected()
            if c:
                s["admin"] = unicode(slave.getAdmin() or "", "utf-8")
                connected_slaves += 1
        cxt["connected_slaves"] = connected_slaves

        cxt["authz"] = self.getAuthz(req)
        cxt["builder_url"] = path_to_builder(req, b)

        template = req.site.buildbot_service.templates.get_template(self.tpl_page)
        return template.render(**cxt)