Edgewall Software

Changeset 1001


Ignore:
Timestamp:
Jun 3, 2011, 12:15:50 PM (13 years ago)
Author:
cmlenz
Message:

Improve layout and customizability of build status summary.

Location:
trunk/bitten
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/bitten/htdocs/bitten.css

    r846 r1001  
    66  background-image: url(bitten_buildf.png) !important;
    77}
     8
     9/* Build page */
    810
    911#content.build h2.config, #content.build h2.step { background: #f7f7f7;
     
    5759
    5860#content.build p.path { color: #999; font-size: smaller; margin-top: 0; }
     61
     62#content.build .summary { color: #666; font-size: smaller; margin-top: 1em; }
     63#content.build .summary p { margin: 0; }
     64#content.build .summary p .detail { color: #999; font-style: italic; }
    5965
    6066#content.build #charts { clear: right; float: right; margin-left: 0.5em; }
  • trunk/bitten/recipe.py

    r913 r1001  
    269269        self.ctxt = Context(basedir, config, vars)
    270270        self._root = xml
    271         self.onerror_default = vars.get('onerror', 'fail')
     271        self.onerror_default = vars.get('onerror', 'fail')
    272272        assert self.onerror_default in ('fail', 'ignore', 'continue')
    273273
  • trunk/bitten/templates/bitten_config.html

    r1000 r1001  
    3838      ${slave.processor or slave.machine or ''}
    3939    </div>
    40    
     40
    4141    <ul py:def="build_steps(steps)" py:if="steps" class="steps">
    4242      <li py:for="step in steps"
     
    5151      </li>
    5252    </ul>
    53  
     53
     54    <div py:def="status_summary(config)" class="summary">
     55      <p class="pending">
     56        ${config.builds_pending} build<py:if test="config.builds_pending != 1">s</py:if> pending
     57        <span py:if="'platforms' in config" class="detail">(<py:for
     58          each="platform, sep in separated([p for p in config.platforms if p.builds_inprogress], ', ')">${platform.name}:
     59          ${platform.builds_pending}$sep</py:for>)</span>
     60      </p>
     61      <p class="inprogress">
     62        ${config.builds_inprogress or 'No'} build<py:if test="config.builds_inprogress != 1">s</py:if> in progress
     63        <span py:if="'platforms' in config" class="detail">(<py:for
     64          each="platform, sep in separated([p for p in config.platforms if p.builds_inprogress], ', ')">${platform.name}:
     65          ${platform.builds_inprogress}$sep</py:for>)</span>
     66      </p>
     67    </div>
     68
    5469    <div id="content" class="build">
    5570      <h1>$title</h1><py:choose test="page_mode"><py:when test="'overview'">
    56       <py:if test="builds_pending">
    57        <div>$builds_pending pending build<py:if test="builds_pending > 1">s</py:if>
    58        </div></py:if><py:if test="builds_inprogress">
    59        <div>$builds_inprogress in-progress build<py:if test="builds_inprogress > 1">s</py:if>
    60       </div></py:if>
     71      ${status_summary(dict(builds_pending=builds_pending, builds_inprogress=builds_inprogress))}
    6172      <form id="prefs" method="get" action="">
    6273        <div>
     
    6879          <input type="submit" value="Update" />
    6980        </div>
    70       </form><py:for each="config in configs">
    71       <h2 class="config ${not config.active and 'deactivated' or ''}">
    72         <a href="$config.href">$config.label</a>
    73       </h2><py:if test="config.builds_pending">
    74         <div>$config.builds_pending pending
    75           build<py:if test="config.builds_pending > 1">s</py:if>&nbsp;<i>(<py:for each="platform in config.platforms">
    76         <py:if test="platform.builds_pending">
    77           $platform.name: $platform.builds_pending
    78         </py:if></py:for>)</i>
    79        </div></py:if><py:if test="config.builds_inprogress">
    80        <div>$config.builds_inprogress in-progress
    81          build<py:if test="config.builds_inprogress > 1">s</py:if>&nbsp;<i>(<py:for each="platform in config.platforms"><py:if test="platform.builds_inprogress">
    82             $platform.name: $platform.builds_inprogress
    83           </py:if></py:for>)</i>
    84       </div></py:if>
    85       <div py:if="config.description" class="description">
    86         $config.description
    87       </div><py:if test="len(config.builds)">
    88       <h3 class="builds"><a href="$config.href">Latest builds</a></h3>
    89       <table class="builds"><tbody><tr>
    90         <th py:with="youngest_rev = config.youngest_rev">
    91           <a href="$youngest_rev.href">[$youngest_rev.display_rev]</a>
    92           by ${format_author(youngest_rev.author)}<p class="date">$youngest_rev.date</p>
    93           <p class="message">$youngest_rev.message</p>
    94         </th>
    95         <td py:for="build in config.builds" class="$build.cls"><py:choose>
    96         <py:when test="build.status != 'pending'">
    97           <a href="$build.href">$build.platform</a>
    98           <p class="date">$build.stopped</p>
    99           ${slave_info(build.slave)}
    100           ${build_status(build.status)}
    101         </py:when><py:otherwise>
    102           <strong>$build.platform</strong>
    103           <p class="nobuild">No build yet</p>
    104         </py:otherwise></py:choose>
    105         </td>
    106       </tr></tbody></table></py:if></py:for>
     81      </form>
     82
     83      <py:for each="config in configs">
     84        <h2 class="config ${not config.active and 'deactivated' or ''}">
     85          <a href="$config.href">$config.label</a>
     86        </h2>
     87        ${status_summary(config)}
     88        <div py:if="config.description" class="description">
     89          $config.description
     90        </div><py:if test="len(config.builds)">
     91        <h3 class="builds"><a href="$config.href">Latest builds</a></h3>
     92        <table class="builds"><tbody><tr>
     93          <th py:with="youngest_rev = config.youngest_rev">
     94            <a href="$youngest_rev.href">[$youngest_rev.display_rev]</a>
     95            by ${format_author(youngest_rev.author)}<p class="date">$youngest_rev.date</p>
     96            <p class="message">$youngest_rev.message</p>
     97          </th>
     98          <td py:for="build in config.builds" class="$build.cls"><py:choose>
     99          <py:when test="build.status != 'pending'">
     100            <a href="$build.href">$build.platform</a>
     101            <p class="date">$build.stopped</p>
     102            ${slave_info(build.slave)}
     103            ${build_status(build.status)}
     104          </py:when><py:otherwise>
     105            <strong>$build.platform</strong>
     106            <p class="nobuild">No build yet</p>
     107          </py:otherwise></py:choose>
     108          </td>
     109        </tr></tbody></table></py:if>
     110      </py:for>
    107111
    108112    </py:when><py:when test="'view_config'">
     
    111115        <div id="chart_${chart.category}" style="${chart.style}"></div>
    112116        <script type="text/javascript">
    113           $(document).ready(function() {
    114                
    115               $.getJSON('${chart.href}', function(json) {
    116                    
     117          $(document).ready(function() {
     118              $.getJSON('${chart.href}', function(json) {
    117119                  $("#chart_${chart.category}_title").append(json.title);
    118120                  json.options['xaxis']['tickFormatter'] = function(rev) { return "[" + rev + "]"; };
    119121                  $.plot($("#chart_${chart.category}"), json.data, json.options);
    120               }); 
     122              });
    121123          });
    122124        </script>
     
    153155        </py:if>
    154156      </p>
     157      ${status_summary(config)}
    155158      <div py:if="config.description" class="description">
    156159        $config.description
     
    160163      </div>
    161164      ${list_of_attachments(config.attachments, compact=True)}
    162       <py:if test="config.builds_pending">
    163       <div>$config.builds_pending pending build<py:if test="config.builds_pending > 1">s</py:if>&nbsp;<i>(<py:for each="platform in config.platforms">
    164         <py:if test="platform.builds_pending">
    165           $platform.name: $platform.builds_pending
    166         </py:if></py:for>)</i>
    167        </div></py:if><py:if test="config.builds_inprogress">
    168         <div>$config.builds_inprogress in-progress build<py:if test="config.builds_inprogress > 1">s</py:if>&nbsp;<i>(<py:for each="platform in config.platforms"><py:if test="platform.builds_inprogress">
    169         $platform.name: $platform.builds_inprogress
    170         </py:if></py:for>)</i>
    171       </div></py:if>
    172165
    173166      <table py:if="config.platforms and config.builds"
Note: See TracChangeset for help on using the changeset viewer.