<div xmlns:py="http://genshi.edgewall.org/"> | |
<?python from genshi.builder import tag ?> | |
<?python from genshi.util import flatten ?> | |
<table class="datatable test_verdicts"> | |
<tr> | |
<th></th> | |
<th>Value</th> | |
<th>Maximum allowed</th> | |
<th>Pass/Fail</th> | |
</tr> | |
<tr> | |
<td class="vertical_header_th">Max offset:</td> | |
<td>${"%s mm" % results.max_offset if results.max_offset is not None else 'N/A'}</td> | |
<td>${"%s" % settings['maxoffset']} mm</td> | |
<td class="${'' if results.offset_verdict is None else 'passed' if results.offset_verdict else 'failed'}" > | |
${"N/A" if results.offset_verdict is None else "Pass" if results.offset_verdict else "Fail"} | |
</td> | |
</tr> | |
<tr> | |
<td class="vertical_header_th">Max jitter:</td> | |
<td>${"%s mm" % results.max_jitter if results.max_jitter is not None else 'N/A'}</td> | |
<td>${"%s" % settings['maxjitter']} mm</td> | |
<td class="${'' if results.jitter_verdict is None else 'passed' if results.jitter_verdict else 'failed'}" > | |
${'N/A' if results.jitter_verdict is None else "Pass" if results.jitter_verdict else "Fail"} | |
</td> | |
</tr> | |
<tr> | |
<td class="vertical_header_th">Missing swipes:</td> | |
<td>${results.missing_swipes}/${results.total_swipes}</td> | |
<td>${int(settings['maxmissingswipes'])}</td> | |
<td class="${'passed' if results.missing_swipes_verdict else 'failed'}">${"Pass" if results.missing_swipes_verdict else "Fail"}</td> | |
</tr> | |
<tr> | |
<td class="vertical_header_th">Errors:</td> | |
<td>${len(results.errors)}</td> | |
<td>0</td> | |
<td class="${'passed' if results.errors_verdict else 'failed'}">${"Pass" if results.errors_verdict else "Fail"}</td> | |
</tr> | |
<tr py:if="len(results.errors) > 0"> | |
<td class="vertical_header_th">Error descriptions:</td> | |
<td colspan="2">${tag(flatten((e,tag.br) for e in sorted(results.errors)))}</td> | |
<td></td> | |
</tr> | |
</table> | |
<div py:if="'noimages' not in kwargs" py:for="img in results.images" class="preview"> | |
<a href="${img[1]}"> | |
<img src="${img[0]}" alt="Preview image"/> | |
</a> | |
</div> | |
<!--! Preview table --> | |
<div class="dtable no_print"> | |
<div class="dtable_row"> | |
<div class="dtable_header narrow_cell">Toggle:</div> | |
<div class="dtable_header narrow_cell"><button class="all_lines_button">All</button></div> | |
<div class="dtable_header narrow_cell"><button class="failed_lines_button">Failed</button></div> | |
<div class="dtable_header narrow_cell"><button class="passed_lines_button">Passed</button></div> | |
</div> | |
</div> | |
<div class="dtable subplot_table"> | |
<div class="dtable_row"> | |
<div class="dtable_header narrow_cell">Swipe</div> | |
<div class="dtable_header narrow_cell"># of Fingers</div> | |
<div class="dtable_header narrow_cell">Errors</div> | |
<div class="dtable_header narrow_cell">Max offset</div> | |
<div class="dtable_header narrow_cell">Max jitter</div> | |
<div class="dtable_header narrow_cell">Pass/Fail</div> | |
<div class="dtable_header no_print">Detailed plot</div> | |
</div> | |
<div py:for="swipe in results.swipes" class="dtable_row plot_header"> | |
<div class="dtable_cell narrow_cell">${swipe.id}</div> | |
<div class="dtable_cell narrow_cell">${swipe.num_fingers}</div> | |
<div class="dtable_cell narrow_cell">${len(swipe.errors)}</div> | |
<div class="dtable_cell narrow_cell">${swipe.max_offset}</div> | |
<div class="dtable_cell narrow_cell">${swipe.max_jitter}</div> | |
<div class="dtable_cell narrow_cell ${swipe.verdict_class}">${swipe.verdict_text}</div> | |
<div class="dtable_cell no_print"><button type="button" class="show_plot">Show/Hide</button></div> | |
<div class="plot" data-src="${swipe.image}"/> | |
</div> | |
</div> | |
</div> |