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):
Copyright (C) 2012-2017 Edgewall Software