Mercurial > bitten > bitten-test
changeset 557:b4d3d9cbf200
Alter the appearance of the ''Build Status'' button, to show the current build status [eblot] - fixes #373
This is off by default and can be enabled with the `bitten.quick_status` option in `trac.ini`
author | dfraser |
---|---|
date | Mon, 11 May 2009 09:26:10 +0000 |
parents | 12747ea5e6a5 |
children | 1a4541c87021 |
files | bitten/admin.py bitten/htdocs/bitten.css bitten/master.py bitten/templates/bitten_admin_master.html bitten/web_ui.py |
diffstat | 5 files changed, 78 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/bitten/admin.py +++ b/bitten/admin.py @@ -14,7 +14,7 @@ from trac.core import * from trac.admin import IAdminPanelProvider -from trac.web.chrome import add_stylesheet +from trac.web.chrome import add_stylesheet, add_script from bitten.model import BuildConfig, TargetPlatform from bitten.recipe import Recipe, InvalidRecipeError @@ -71,6 +71,12 @@ self.config['bitten'].set('slave_timeout', str(slave_timeout)) changed = True + quick_status = 'quick_status' in req.args + if quick_status != master.quick_status: + self.config['bitten'].set('quick_status', + quick_status and 'yes' or 'no') + changed = True + logs_dir = req.args.get('logs_dir', None) if logs_dir != master.logs_dir: self.config['bitten'].set('logs_dir', str(logs_dir))
--- a/bitten/htdocs/bitten.css +++ b/bitten/htdocs/bitten.css @@ -181,3 +181,16 @@ #content.build table.listing :link, #content.build table.listing :visited { border: none; } +#mainnav .bitteninprogress, #mainnav .bitteninprogress :hover { + border-right: 4px solid #edd400 !important; +} +#mainnav .bittencompleted, #mainnav .bittencompleted :hover { + border-right: 4px solid #0b0 !important; +} +#mainnav .bittenfailed, #mainnav .bittenfailed :hover { + border-right: 4px hidden !important; + background-color: #d99; +} +#mainnav .bittenpending, #mainnav .bittenpending :hover { + border-right: 4px hidden !important; +}
--- a/bitten/master.py +++ b/bitten/master.py @@ -60,6 +60,10 @@ logs_dir = PathOption('bitten', 'logs_dir', "log/bitten", doc= """The directory on the server in which client log files will be stored.""") + quick_status = BoolOption('bitten', 'quick_status', False, doc= + """Whether to show the current build status withing the Trac main + navigation bar""") + # IRequestHandler methods def match_request(self, req):
--- a/bitten/templates/bitten_admin_master.html +++ b/bitten/templates/bitten_admin_master.html @@ -53,6 +53,19 @@ <hr /> <div class="field"> <label> + Show quick status in main navigation bar: + <input type="checkbox" id="quick_status" name="quick_status" + checked="${master.quick_status and 'checked' + or None}" /> + </label> + </div> + <p class="hint"> + Show the latest build status within the Trac navigation bar.<br/> + The Bitten button appearance reflects the build status. + </p> + <hr /> + <div class="field"> + <label> Connection timeout for build slaves: <input type="text" id="slave_timeout" name="slave_timeout" value="$master.slave_timeout" size="5" />
--- a/bitten/web_ui.py +++ b/bitten/web_ui.py @@ -22,12 +22,13 @@ from trac.util import escape, pretty_timedelta, format_datetime, shorten_line, \ Markup from trac.util.html import html -from trac.web import IRequestHandler +from trac.web import IRequestHandler, IRequestFilter from trac.web.chrome import INavigationContributor, ITemplateProvider, \ add_link, add_stylesheet, add_ctxtnav, \ prevnext_nav, add_script from trac.wiki import wiki_to_html, wiki_to_oneliner from bitten.api import ILogFormatter, IReportChartGenerator, IReportSummarizer +from bitten.master import BuildMaster from bitten.model import BuildConfig, TargetPlatform, Build, BuildStep, \ BuildLog, Report from bitten.queue import collect_changes @@ -86,8 +87,34 @@ """Return the navigation item for access the build status overview from the Trac navigation bar.""" if 'BUILD_VIEW' in req.perm: + status = '' + if BuildMaster(self.env).quick_status: + repos = self.env.get_repository(req.authname) + if hasattr(repos, 'sync'): + repos.sync() + for config in BuildConfig.select(self.env, + include_inactive=False): + prev_rev = None + for platform, rev, build in collect_changes(repos, config): + if rev != prev_rev: + if prev_rev is not None: + break + prev_rev = rev + if build: + build_data = _get_build_data(self.env, req, build) + if build_data['status'] == 'failed': + status='bittenfailed' + break + if build_data['status'] == 'in progress': + status='bitteninprogress' + elif not status: + if (build_data['status'] == 'completed'): + status='bittencompleted' + if not status: + status='bittenpending' yield ('mainnav', 'build', - tag.a('Builds Status', href=req.href.build(), accesskey=5)) + tag.a('Builds Status', href=req.href.build(), accesskey=5, + class_=status)) # ITemplatesProvider methods @@ -103,7 +130,7 @@ class BuildConfigController(Component): """Implements the web interface for build configurations.""" - implements(IRequestHandler) + implements(IRequestHandler, IRequestFilter) # IRequestHandler methods @@ -131,6 +158,17 @@ add_stylesheet(req, 'bitten/bitten.css') return 'bitten_config.html', data, None + # IRequestHandler methods + + def pre_process_request(self, req, handler): + return handler + + def post_process_request(self, req, template, data, content_type): + if template: + add_stylesheet(req, 'bitten/bitten.css') + + return template, data, content_type + # Internal methods def _render_overview(self, req):