cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync# -*- coding: utf-8 -*-
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync# $Id$
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync"""
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncTest Manager Web-UI - Form Helpers.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync"""
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync__copyright__ = \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync"""
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncCopyright (C) 2012-2014 Oracle Corporation
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncThis file is part of VirtualBox Open Source Edition (OSE), as
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncavailable from http://www.virtualbox.org. This file is free software;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncyou can redistribute it and/or modify it under the terms of the GNU
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncGeneral Public License (GPL) as published by the Free Software
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncFoundation, in version 2 as it comes in the "COPYING" file of the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncVirtualBox OSE distribution. VirtualBox OSE is distributed in the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsynchope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncThe contents of this file may alternatively be used under the terms
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncof the Common Development and Distribution License Version 1.0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync(CDDL) only, as it comes in the "COPYING.CDDL" file of the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncVirtualBox OSE distribution, in which case the provisions of the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncCDDL are applicable instead of those of the GPL.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncYou may elect to license modified versions of this file under the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncterms and conditions of either the GPL or the CDDL or both.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync"""
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync__version__ = "$Revision$"
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync# Standard python imports.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncimport copy;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync# Validation Kit imports.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncfrom common import utils;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncfrom common.webutils import escapeAttr, escapeElem;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncfrom testmanager import config;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncfrom testmanager.core.schedgroup import SchedGroupMemberData, SchedGroupDataEx;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncfrom testmanager.core.testcaseargs import TestCaseArgsData;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncfrom testmanager.core.testgroup import TestGroupMemberData, TestGroupDataEx;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncclass WuiHlpForm(object):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Helper for constructing a form.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ksItemsList = 'ksItemsList'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def __init__(self, sId, sAction, dErrors = None, fReadOnly = False):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._fFinalized = False;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._fReadOnly = fReadOnly;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._dErrors = dErrors if dErrors is not None else dict();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._sBody = u'\n' \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync u'<div id="%s" class="tmform">\n' \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync u' <form action="%s" method="post">\n' \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync u' <ul>\n' \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync % (sId, sAction);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def _add(self, sText):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """Internal worker for appending text to the body."""
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync assert not self._fFinalized;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if not self._fFinalized:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._sBody += unicode(sText, errors='ignore') if isinstance(sText, str) else sText;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return True;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return False;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def _escapeErrorText(self, sText):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """Escapes error text, preserving some predefined HTML tags."""
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if sText.find('<br>') >= 0:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync asParts = sText.split('<br>');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync for i in range(len(asParts)):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync asParts[i] = escapeElem(asParts[i].strip());
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sText = '<br>\n'.join(asParts);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync else:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sText = escapeElem(sText);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return sText;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def _addLabel(self, sName, sLabel, sDivSubClass = 'normal'):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """Internal worker for adding a label."""
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if sName in self._dErrors:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sError = self._dErrors[sName];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if utils.isString(sError): # List error trick (it's an associative array).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return self._add(' <li>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <div class="tmform-field"><div class="tmform-field-%s">\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <label for="%s" class="tmform-error-label">%s\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <span class="tmform-error-desc">%s</span>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' </label>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync % (escapeAttr(sDivSubClass), escapeAttr(sName), escapeElem(sLabel),
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._escapeErrorText(sError), ) );
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return self._add(' <li>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <div class="tmform-field"><div class="tmform-field-%s">\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <label for="%s">%s</label>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync % (escapeAttr(sDivSubClass), escapeAttr(sName), escapeElem(sLabel)) );
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def finalize(self):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Finalizes the form and returns the body.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if not self._fFinalized:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._add(' </ul>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' </form>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync '</div>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync '<div class="clear"></div>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync );
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return self._sBody;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def addTextHidden(self, sName, sValue, sExtraAttribs = ''):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """Adds a hidden text input."""
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return self._add(' <div class="tmform-field-hidden">\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <input name="%s" id="%s" type="text" hidden%s value="%s" class="tmform-hidden">\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' </div>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' </li>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync % ( escapeAttr(sName), escapeAttr(sName), sExtraAttribs, escapeElem(str(sValue)) ));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Text input fields.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def addText(self, sName, sValue, sLabel, sSubClass = 'string', sExtraAttribs = '', sPostHtml = ''):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """Adds a text input."""
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if self._fReadOnly:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return self.addTextRO(sName, sValue, sLabel, sSubClass, sExtraAttribs);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if sSubClass not in ('int', 'long', 'string', 'uuid', 'timestamp', 'wide'): raise Exception(sSubClass);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._addLabel(sName, sLabel, sSubClass);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return self._add(' <input name="%s" id="%s" type="text"%s value="%s">%s\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' </div></div>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' </li>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync % ( escapeAttr(sName), escapeAttr(sName), sExtraAttribs, escapeElem(sValue), sPostHtml ));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def addTextRO(self, sName, sValue, sLabel, sSubClass = 'string', sExtraAttribs = '', sPostHtml = ''):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """Adds a read-only text input."""
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if sSubClass not in ('int', 'long', 'string', 'uuid', 'timestamp', 'wide'): raise Exception(sSubClass);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._addLabel(sName, sLabel, sSubClass);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return self._add(' <input name="%s" id="%s" type="text" readonly%s value="%s" class="tmform-input-readonly">%s\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' </div></div>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' </li>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync % ( escapeAttr(sName), escapeAttr(sName), sExtraAttribs, escapeElem(str(sValue)), sPostHtml ));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def addWideText(self, sName, sValue, sLabel, sExtraAttribs = ''):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """Adds a wide text input."""
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return self.addText(sName, sValue, sLabel, 'wide', sExtraAttribs);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def addWideTextRO(self, sName, sValue, sLabel, sExtraAttribs = ''):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """Adds a wide read-only text input."""
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return self.addTextRO(sName, sValue, sLabel, 'wide', sExtraAttribs);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def addMultilineText(self, sName, sValue, sLabel, sSubClass = 'string', sExtraAttribs = ''):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """Adds a multiline text input."""
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if self._fReadOnly:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return self.addMultilineTextRO(sName, sValue, sLabel, sSubClass, sExtraAttribs);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if sSubClass not in ('int', 'long', 'string', 'uuid', 'timestamp'): raise Exception(sSubClass)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._addLabel(sName, sLabel, sSubClass)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sNewValue = str(sValue) if not isinstance(sValue, list) else '\n'.join(sValue)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return self._add(' <textarea name="%s" id="%s" %s>%s</textarea>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' </div></div>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' </li>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync % ( escapeAttr(sName), escapeAttr(sName), sExtraAttribs, escapeElem(sNewValue)))
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def addMultilineTextRO(self, sName, sValue, sLabel, sSubClass = 'string', sExtraAttribs = ''):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """Adds a multiline read-only text input."""
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if sSubClass not in ('int', 'long', 'string', 'uuid', 'timestamp'): raise Exception(sSubClass)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._addLabel(sName, sLabel, sSubClass)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sNewValue = str(sValue) if not isinstance(sValue, list) else '\n'.join(sValue)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return self._add(' <textarea name="%s" id="%s" readonly %s>%s</textarea>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' </div></div>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' </li>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync % ( escapeAttr(sName), escapeAttr(sName), sExtraAttribs, escapeElem(sNewValue)))
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def addInt(self, sName, iValue, sLabel, sExtraAttribs = ''):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """Adds an integer input."""
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return self.addText(sName, str(iValue), sLabel, 'int', sExtraAttribs);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def addIntRO(self, sName, iValue, sLabel, sExtraAttribs = ''):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """Adds an integer input."""
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return self.addTextRO(sName, str(iValue), sLabel, 'int', sExtraAttribs);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def addLong(self, sName, lValue, sLabel, sExtraAttribs = ''):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """Adds a long input."""
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return self.addText(sName, str(lValue), sLabel, 'long', sExtraAttribs);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def addLongRO(self, sName, lValue, sLabel, sExtraAttribs = ''):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """Adds a long input."""
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return self.addTextRO(sName, str(lValue), sLabel, 'long', sExtraAttribs);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def addUuid(self, sName, uuidValue, sLabel, sExtraAttribs = ''):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """Adds an UUID input."""
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return self.addText(sName, str(uuidValue), sLabel, 'uuid', sExtraAttribs);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def addUuidRO(self, sName, uuidValue, sLabel, sExtraAttribs = ''):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """Adds a read-only UUID input."""
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return self.addTextRO(sName, str(uuidValue), sLabel, 'uuid', sExtraAttribs);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def addTimestampRO(self, sName, sTimestamp, sLabel, sExtraAttribs = ''):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """Adds a read-only database string timstamp input."""
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return self.addTextRO(sName, sTimestamp, sLabel, 'timestamp', sExtraAttribs);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Text areas.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Combo boxes.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def addComboBox(self, sName, sSelected, sLabel, aoOptions, sExtraAttribs = ''):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """Adds a combo box."""
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if self._fReadOnly:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return self.addComboBoxRO(sName, sSelected, sLabel, aoOptions, sExtraAttribs);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._addLabel(sName, sLabel, 'combobox');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._add(' <select name="%s" id="%s" class="tmform-combobox"%s>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync % (escapeAttr(sName), escapeAttr(sName), sExtraAttribs));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync for iValue, sText, _ in aoOptions:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sValue = str(iValue);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._add(' <option value="%s"%s>%s</option>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync % (escapeAttr(sValue), ' selected' if sValue == str(sSelected) else '',
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync escapeElem(sText)));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return self._add(' </select>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' </div></div>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' </li>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync );
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def addComboBoxRO(self, sName, sSelected, sLabel, aoOptions, sExtraAttribs = ''):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """Adds a read-only combo box."""
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.addTextHidden(sName, sSelected);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._addLabel(sName, sLabel, 'combobox-readonly');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._add(' <select name="%s" id="%s" disabled class="tmform-combobox"%s>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync % (escapeAttr(sName), escapeAttr(sName), sExtraAttribs));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync for iValue, sText, _ in aoOptions:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sValue = str(iValue);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._add(' <option value="%s"%s>%s</option>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync % (escapeAttr(sValue), ' selected' if sValue == str(sSelected) else '',
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync escapeElem(sText)));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return self._add(' </select>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' </div></div>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' </li>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync );
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Check boxes.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync @staticmethod
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def _reinterpretBool(fValue):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """Reinterprets a value as a boolean type."""
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if fValue is not type(True):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if fValue is None:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fValue = False;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync elif str(fValue) in ('True', 'true', '1'):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fValue = True;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync else:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fValue = False;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return fValue;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def addCheckBox(self, sName, fChecked, sLabel, sExtraAttribs = ''):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """Adds an check box."""
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if self._fReadOnly:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return self.addCheckBoxRO(sName, fChecked, sLabel, sExtraAttribs);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._addLabel(sName, sLabel, 'checkbox');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fChecked = self._reinterpretBool(fChecked);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return self._add(' <input name="%s" id="%s" type="checkbox"%s%s value="1" class="tmform-checkbox">\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' </div></div>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' </li>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync % (escapeAttr(sName), escapeAttr(sName), ' checked' if fChecked else '', sExtraAttribs));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def addCheckBoxRO(self, sName, fChecked, sLabel, sExtraAttribs = ''):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """Adds an readonly check box."""
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._addLabel(sName, sLabel, 'checkbox');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fChecked = self._reinterpretBool(fChecked);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Hack Alert! The onclick and onkeydown are for preventing editing and fake readonly/disabled.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return self._add(' <input name="%s" id="%s" type="checkbox"%s readonly%s value="1" class="readonly"\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' onclick="return false" onkeydown="return false">\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' </div></div>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' </li>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync % (escapeAttr(sName), escapeAttr(sName), ' checked' if fChecked else '', sExtraAttribs));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # List of items to check
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def _addList(self, sName, aoRows, sLabel, fUseTable = False, sId = 'dummy', sExtraAttribs = ''):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Adds a list of items to check.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync @param sName Name of HTML form element
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync @param aoRows List of [sValue, fChecked, sName] sub-arrays.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync @param sLabel Label of HTML form element
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fReadOnly = self._fReadOnly; ## @todo add this as a parameter.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if fReadOnly:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sExtraAttribs += ' readonly onclick="return false" onkeydown="return false"';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._addLabel(sName, sLabel, 'list');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if len(aoRows) == 0:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return self._add('No items</div></div></li>')
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sNameEscaped = escapeAttr(sName);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._add(' <div class="tmform-checkboxes-container" id="%s">\n' % (escapeAttr(sId),));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if fUseTable:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._add(' <table>\n');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync for asRow in aoRows:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync assert len(asRow) == 3; # Don't allow sloppy input data!
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fChecked = self._reinterpretBool(asRow[1])
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._add(' <tr>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <td><input type="checkbox" name="%s" value="%s"%s%s></td>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <td>%s</td>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' </tr>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync % ( sNameEscaped, escapeAttr(str(asRow[0])), ' checked' if fChecked else '', sExtraAttribs,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync escapeElem(str(asRow[2])), ));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._add(' </table>\n');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync else:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync for asRow in aoRows:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync assert len(asRow) == 3; # Don't allow sloppy input data!
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fChecked = self._reinterpretBool(asRow[1])
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._add(' <div class="tmform-checkbox-holder">'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync '<input type="checkbox" name="%s" value="%s"%s%s> %s</input></div>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync % ( sNameEscaped, escapeAttr(str(asRow[0])), ' checked' if fChecked else '', sExtraAttribs,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync escapeElem(str(asRow[2])),));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return self._add(' </div></div></div>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' </li>\n');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def addListOfOsArches(self, sName, aoOsArches, sLabel, sExtraAttribs = ''):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync List of checkboxes for OS/ARCH selection.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync asOsArches is a list of [sValue, fChecked, sName] sub-arrays.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return self._addList(sName, aoOsArches, sLabel, fUseTable = False, sId = 'tmform-checkbox-list-os-arches',
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sExtraAttribs = sExtraAttribs);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def addListOfTypes(self, sName, aoTypes, sLabel, sExtraAttribs = ''):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync List of checkboxes for build type selection.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync aoTypes is a list of [sValue, fChecked, sName] sub-arrays.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return self._addList(sName, aoTypes, sLabel, fUseTable = False, sId = 'tmform-checkbox-list-build-types',
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sExtraAttribs = sExtraAttribs);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def addListOfTestCases(self, sName, aoTestCases, sLabel, sExtraAttribs = ''):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync List of checkboxes for test box (dependency) selection.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync aoTestCases is a list of [sValue, fChecked, sName] sub-arrays.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return self._addList(sName, aoTestCases, sLabel, fUseTable = False, sId = 'tmform-checkbox-list-testcases',
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sExtraAttribs = sExtraAttribs);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def addListOfResources(self, sName, aoTestCases, sLabel, sExtraAttribs = ''):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync List of checkboxes for resource selection.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync aoTestCases is a list of [sValue, fChecked, sName] sub-arrays.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return self._addList(sName, aoTestCases, sLabel, fUseTable = False, sId = 'tmform-checkbox-list-resources',
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sExtraAttribs = sExtraAttribs);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def addListOfTestGroups(self, sName, aoTestGroups, sLabel, sExtraAttribs = ''):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync List of checkboxes for test group selection.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync aoTestGroups is a list of [sValue, fChecked, sName] sub-arrays.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return self._addList(sName, aoTestGroups, sLabel, fUseTable = False, sId = 'tmform-checkbox-list-testgroups',
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sExtraAttribs = sExtraAttribs);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def addListOfTestCaseArgs(self, sName, aoVariations, sLabel): # pylint: disable=R0915
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Adds a list of test case argument variations to the form.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync @param sName Name of HTML form element
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync @param aoVariations List of TestCaseArgsData instances.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync @param sLabel Label of HTML form element
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._addLabel(sName, sLabel);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sTableId = 'TestArgsExtendingListRoot';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fReadOnly = self._fReadOnly; ## @todo argument?
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sReadOnlyAttr = ' readonly class="tmform-input-readonly"' if fReadOnly else '';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml = '<li>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Define javascript function for extending the list of test case
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # variations. Doing it here so we can use the python constants. This
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # also permits multiple argument lists on one page should that ever be
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # required...
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if not fReadOnly:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += '<script type="text/javascript">\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += '\n';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += 'g_%s_aItems = { %s };\n' % (sName, ', '.join(('%s: 1' % (i,)) for i in range(len(aoVariations))),);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += 'g_%s_cItems = %s;\n' % (sName, len(aoVariations),);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += 'g_%s_iIdMod = %s;\n' % (sName, len(aoVariations) + 32);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += '\n';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += 'function %s_removeEntry(sId)\n' % (sName,);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += '{\n';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' if (g_%s_cItems > 1)\n' % (sName,);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' {\n';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' g_%s_cItems--;\n' % (sName,);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' delete g_%s_aItems[sId];\n' % (sName,);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' setElementValueToKeyList(\'%s\', g_%s_aItems);\n' % (sName, sName);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += '\n';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync for iInput in range(8):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' removeHtmlNode(\'%s[\' + sId + \'][%s]\');\n' % (sName, iInput,);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' }\n';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += '}\n';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += '\n';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += 'function %s_extendListEx(cGangMembers, cSecTimeout, sArgs, sTestBoxReqExpr, sBuildReqExpr)\n' % (sName,);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += '{\n';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' var oElement = document.getElementById(\'%s\');\n' % (sTableId,);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' var oTBody = document.createElement(\'tbody\');\n';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' var sHtml = \'\';\n';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' var sId;\n';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += '\n';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' g_%s_iIdMod += 1;\n' % (sName,);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' sId = g_%s_iIdMod.toString();\n' % (sName,);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oVarDefaults = TestCaseArgsData();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oVarDefaults.convertToParamNull();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += '\n';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' sHtml += \'<tr class="tmform-testcasevars-first-row">\';\n';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' sHtml += \' <td>Gang Members:</td>\';\n';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' sHtml += \' <td class="tmform-field-tiny-int">' \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync '<input name="%s[\' + sId + \'][%s]" id="%s[\' + sId + \'][0]" value="\' + cGangMembers + \'"></td>\';\n' \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync % (sName, TestCaseArgsData.ksParam_cGangMembers, sName,);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' sHtml += \' <td>Timeout:</td>\';\n';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' sHtml += \' <td class="tmform-field-int">' \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync '<input name="%s[\' + sId + \'][%s]" id="%s[\' + sId + \'][1]" value="\'+ cSecTimeout + \'"></td>\';\n' \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync % (sName, TestCaseArgsData.ksParam_cSecTimeout, sName,);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' sHtml += \' <td><a href="#" onclick="%s_removeEntry(\\\'\' + sId + \'\\\');"> Remove</a></td>\';\n' \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync % (sName, );
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' sHtml += \' <td></td>\';\n';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' sHtml += \'</tr>\';\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += '\n';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' sHtml += \'<tr class="tmform-testcasevars-inner-row">\';\n';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' sHtml += \' <td>Arguments:</td>\';\n';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' sHtml += \' <td class="tmform-field-wide100" colspan="4">' \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync '<input name="%s[\' + sId + \'][%s]" id="%s[\' + sId + \'][2]" value="\' + sArgs + \'"></td>\';\n' \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync % (sName, TestCaseArgsData.ksParam_sArgs, sName,);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' sHtml += \' <td></td>\';\n';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' sHtml += \'</tr>\';\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += '\n';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' sHtml += \'<tr class="tmform-testcasevars-inner-row">\';\n';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' sHtml += \' <td>TestBox Reqs:</td>\';\n';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' sHtml += \' <td class="tmform-field-wide100" colspan="4">' \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync '<input name="%s[\' + sId + \'][%s]" id="%s[\' + sId + \'][2]" value="\' + sTestBoxReqExpr' \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' + \'"></td>\';\n' \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync % (sName, TestCaseArgsData.ksParam_sTestBoxReqExpr, sName,);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' sHtml += \' <td></td>\';\n';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' sHtml += \'</tr>\';\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += '\n';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' sHtml += \'<tr class="tmform-testcasevars-final-row">\';\n';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' sHtml += \' <td>Build Reqs:</td>\';\n';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' sHtml += \' <td class="tmform-field-wide100" colspan="4">' \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync '<input name="%s[\' + sId + \'][%s]" id="%s[\' + sId + \'][2]" value="\' + sBuildReqExpr + \'"></td>\';\n' \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync % (sName, TestCaseArgsData.ksParam_sBuildReqExpr, sName,);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' sHtml += \' <td></td>\';\n';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' sHtml += \'</tr>\';\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += '\n';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' oTBody.id = \'%s[\' + sId + \'][6]\';\n' % (sName,);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' oTBody.innerHTML = sHtml;\n';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += '\n';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' oElement.appendChild(oTBody);\n';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += '\n';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' g_%s_aItems[sId] = 1;\n' % (sName,);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' g_%s_cItems++;\n' % (sName,);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' setElementValueToKeyList(\'%s\', g_%s_aItems);\n' % (sName, sName);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += '}\n';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += 'function %s_extendList()\n' % (sName,);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += '{\n';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' %s_extendListEx("%s", "%s", "%s", "%s", "%s");\n' % (sName,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync escapeAttr(str(oVarDefaults.cGangMembers)), escapeAttr(str(oVarDefaults.cSecTimeout)),
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync escapeAttr(oVarDefaults.sArgs), escapeAttr(oVarDefaults.sTestBoxReqExpr),
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync escapeAttr(oVarDefaults.sBuildReqExpr), );
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += '}\n';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if config.g_kfVBoxSpecific:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sSecTimeoutDef = escapeAttr(str(oVarDefaults.cSecTimeout));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += 'function vbox_%s_add_uni()\n' % (sName,);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += '{\n';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' %s_extendListEx("1", "%s", "--cpu-counts 1 --virt-modes raw", ' \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' "", "");\n' % (sName, sSecTimeoutDef);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' %s_extendListEx("1", "%s", "--cpu-counts 1 --virt-modes hwvirt", ' \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' "fCpuHwVirt is True", "");\n' % (sName, sSecTimeoutDef);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' %s_extendListEx("1", "%s", "--cpu-counts 1 --virt-modes hwvirt-np", ' \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' "fCpuNestedPaging is True", "");\n' % (sName, sSecTimeoutDef);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += '}\n';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += 'function vbox_%s_add_uni_amd64()\n' % (sName,);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += '{\n';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' %s_extendListEx("1", "%s", "--cpu-counts 1 --virt-modes hwvirt", ' \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' "fCpuHwVirt is True", "");\n' % (sName, sSecTimeoutDef);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' %s_extendListEx("1", "%s", "--cpu-counts 1 --virt-modes hwvirt-np", ' \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' "fCpuNestedPaging is True", "");\n' % (sName, sSecTimeoutDef);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += '}\n';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += 'function vbox_%s_add_smp()\n' % (sName,);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += '{\n';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' %s_extendListEx("1", "%s", "--cpu-counts 2 --virt-modes hwvirt",' \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' "fCpuHwVirt is True and cCpus >= 2", "");\n' % (sName, sSecTimeoutDef);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' %s_extendListEx("1", "%s", "--cpu-counts 2 --virt-modes hwvirt-np",' \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' "fCpuNestedPaging is True and cCpus >= 2", "");\n' % (sName, sSecTimeoutDef);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' %s_extendListEx("1", "%s", "--cpu-counts 3 --virt-modes hwvirt",' \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' "fCpuHwVirt is True and cCpus >= 3", "");\n' % (sName, sSecTimeoutDef);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' %s_extendListEx("1", "%s", "--cpu-counts 4 --virt-modes hwvirt-np ",' \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' "fCpuNestedPaging is True and cCpus >= 4", "");\n' % (sName, sSecTimeoutDef);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #sHtml += ' %s_extendListEx("1", "%s", "--cpu-counts 6 --virt-modes hwvirt",' \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # ' "fCpuHwVirt is True and cCpus >= 6", "");\n' % (sName, sSecTimeoutDef);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #sHtml += ' %s_extendListEx("1", "%s", "--cpu-counts 8 --virt-modes hwvirt-np",' \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # ' "fCpuNestedPaging is True and cCpus >= 8", "");\n' % (sName, sSecTimeoutDef);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += '}\n';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += '</script>\n';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # List current entries.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += '<input type="hidden" name="%s" id="%s" value="%s">\n' \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync % (sName, sName, ','.join(str(i) for i in range(len(aoVariations))), );
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' <table id="%s" class="tmform-testcasevars">\n' % (sTableId,)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if not fReadOnly:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' <caption>\n' \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <a href="#" onClick="%s_extendList()">Add</a>\n' % (sName,);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if config.g_kfVBoxSpecific:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' [<a href="#" onClick="vbox_%s_add_uni()">Single CPU Variations</a>\n' % (sName,);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' <a href="#" onClick="vbox_%s_add_uni_amd64()">amd64</a>]\n' % (sName,);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' [<a href="#" onClick="vbox_%s_add_smp()">SMP Variations</a>]\n' % (sName,);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' </caption>\n';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dSubErrors = {};
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if sName in self._dErrors and isinstance(self._dErrors[sName], dict):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync dSubErrors = self._dErrors[sName];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync for iVar in range(len(aoVariations)):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oVar = copy.copy(aoVariations[iVar]);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oVar.convertToParamNull();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += '<tbody id="%s[%s][6]">\n' % (sName, iVar,)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' <tr class="tmform-testcasevars-first-row">\n' \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <td>Gang Members:</td>' \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <td class="tmform-field-tiny-int"><input name="%s[%s][%s]" id="%s[%s][1]" value="%s"%s></td>\n' \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <td>Timeout:</td>' \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <td class="tmform-field-int"><input name="%s[%s][%s]" id="%s[%s][2]" value="%s"%s></td>\n' \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync % ( sName, iVar, TestCaseArgsData.ksParam_cGangMembers, sName, iVar, oVar.cGangMembers, sReadOnlyAttr,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sName, iVar, TestCaseArgsData.ksParam_cSecTimeout, sName, iVar,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync utils.formatIntervalSeconds2(oVar.cSecTimeout), sReadOnlyAttr, );
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if not fReadOnly:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' <td><a href="#" onclick="%s_removeEntry(\'%s\');">Remove</a></td>\n' \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync % (sName, iVar);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync else:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' <td></td>\n';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' <td class="tmform-testcasevars-stupid-border-column"></td>\n' \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' </tr>\n';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' <tr class="tmform-testcasevars-inner-row">\n' \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <td>Arguments:</td>' \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <td class="tmform-field-wide100" colspan="4">' \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync '<input name="%s[%s][%s]" id="%s[%s][3]" value="%s"%s></td>\n' \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <td></td>\n' \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' </tr>\n' \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync % ( sName, iVar, TestCaseArgsData.ksParam_sArgs, sName, iVar, escapeAttr(oVar.sArgs), sReadOnlyAttr)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' <tr class="tmform-testcasevars-inner-row">\n' \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <td>TestBox Reqs:</td>' \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <td class="tmform-field-wide100" colspan="4">' \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync '<input name="%s[%s][%s]" id="%s[%s][4]" value="%s"%s></td>\n' \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <td></td>\n' \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' </tr>\n' \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync % ( sName, iVar, TestCaseArgsData.ksParam_sTestBoxReqExpr, sName, iVar,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync escapeAttr(oVar.sTestBoxReqExpr), sReadOnlyAttr)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' <tr class="tmform-testcasevars-final-row">\n' \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <td>Build Reqs:</td>' \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <td class="tmform-field-wide100" colspan="4">' \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync '<input name="%s[%s][%s]" id="%s[%s][5]" value="%s"%s></td>\n' \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <td></td>\n' \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' </tr>\n' \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync % ( sName, iVar, TestCaseArgsData.ksParam_sBuildReqExpr, sName, iVar,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync escapeAttr(oVar.sBuildReqExpr), sReadOnlyAttr)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if iVar in dSubErrors:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' <tr><td colspan="4"><p align="left" class="tmform-error-desc">%s</p></td></tr>\n' \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync % (self._escapeErrorText(dSubErrors[iVar]),);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += '</tbody>\n';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += ' </table>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHtml += '</li>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return self._add(sHtml)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def addListOfTestGroupMembers(self, sName, aoTestGroupMembers, aoAllTestCases, sLabel, # pylint: disable=R0914
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fReadOnly = True):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync For WuiTestGroup.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync assert len(aoTestGroupMembers) <= len(aoAllTestCases);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._addLabel(sName, sLabel);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if len(aoAllTestCases) == 0:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return self._add('<li>No testcases available.</li>\n')
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._add('<input name="%s" type="hidden" value="%s">\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync % ( TestGroupDataEx.ksParam_aidTestCases,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ','.join([str(oTestCase.idTestCase) for oTestCase in aoAllTestCases]), ));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._add('<table class="tmformtbl">\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <thead>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <tr>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <th rowspan="2"></th>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <th rowspan="2">Test Case</th>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <th rowspan="2">All Vars</th>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <th rowspan="2">Priority [0..31]</th>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <th colspan="4" align="center">Variations</th>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' </tr>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <tr>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <th>Included</th>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <th>Gang size</th>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <th>Timeout</th>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <th>Arguments</th>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' </tr>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' </thead>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <tbody>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync );
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if self._fReadOnly:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fReadOnly = True;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sCheckBoxAttr = ' readonly onclick="return false" onkeydown="return false"' if fReadOnly else '';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oDefMember = TestGroupMemberData();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync aoTestGroupMembers = list(aoTestGroupMembers); # Copy it so we can pop.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync for iTestCase in range(len(aoAllTestCases)):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oTestCase = aoAllTestCases[iTestCase];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Is it a member?
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oMember = None;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync for i in range(len(aoTestGroupMembers)):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if aoTestGroupMembers[i].oTestCase.idTestCase == oTestCase.idTestCase:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oMember = aoTestGroupMembers.pop(i);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync break;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Start on the rows...
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sPrefix = '%s[%d]' % (sName, oTestCase.idTestCase,);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._add(' <tr class="%s">\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <td rowspan="%d">\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <input name="%s[%s]" type="hidden" value="%s">\n' # idTestCase
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <input name="%s[%s]" type="hidden" value="%s">\n' # idTestGroup
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <input name="%s[%s]" type="hidden" value="%s">\n' # tsExpire
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <input name="%s[%s]" type="hidden" value="%s">\n' # tsEffective
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <input name="%s[%s]" type="hidden" value="%s">\n' # uidAuthor
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <input name="%s" type="checkbox"%s%s value="%d" class="tmform-checkbox" title="#%d - %s">\n' # (list)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' </td>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync % ( 'tmodd' if iTestCase & 1 else 'tmeven',
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync len(oTestCase.aoTestCaseArgs),
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sPrefix, TestGroupMemberData.ksParam_idTestCase, oTestCase.idTestCase,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sPrefix, TestGroupMemberData.ksParam_idTestGroup, -1 if oMember is None else oMember.idTestGroup,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sPrefix, TestGroupMemberData.ksParam_tsExpire, '' if oMember is None else oMember.tsExpire,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sPrefix, TestGroupMemberData.ksParam_tsEffective, '' if oMember is None else oMember.tsEffective,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sPrefix, TestGroupMemberData.ksParam_uidAuthor, '' if oMember is None else oMember.uidAuthor,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync TestGroupDataEx.ksParam_aoMembers, '' if oMember is None else ' checked', sCheckBoxAttr,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oTestCase.idTestCase, oTestCase.idTestCase, escapeElem(oTestCase.sName),
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._add(' <td rowspan="%d" align="left">%s</td>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync % ( len(oTestCase.aoTestCaseArgs), escapeElem(oTestCase.sName), ));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._add(' <td rowspan="%d" title="Include all variations (checked) or choose a set?">\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <input name="%s[%s]" type="checkbox"%s%s value="-1">\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' </td>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync % ( len(oTestCase.aoTestCaseArgs),
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sPrefix, TestGroupMemberData.ksParam_aidTestCaseArgs,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' checked' if oMember is None or oMember.aidTestCaseArgs is None else '', sCheckBoxAttr, ));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._add(' <td rowspan="%d" align="center">\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <input name="%s[%s]" type="text" value="%s" style="max-width:3em;" %s>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' </td>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync % ( len(oTestCase.aoTestCaseArgs),
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sPrefix, TestGroupMemberData.ksParam_iSchedPriority,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync (oMember if oMember is not None else oDefMember).iSchedPriority,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' readonly class="tmform-input-readonly"' if fReadOnly else '', ));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Argument variations.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync aidTestCaseArgs = [] if oMember is None or oMember.aidTestCaseArgs is None else oMember.aidTestCaseArgs;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync for iVar in range(len(oTestCase.aoTestCaseArgs)):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oVar = oTestCase.aoTestCaseArgs[iVar];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if iVar > 0:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._add(' <tr class="%s">\n' % ('tmodd' if iTestCase & 1 else 'tmeven',));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._add(' <td align="center">\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <input name="%s[%s]" type="checkbox"%s%s value="%d">'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' </td>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync % ( sPrefix, TestGroupMemberData.ksParam_aidTestCaseArgs,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' checked' if oVar.idTestCaseArgs in aidTestCaseArgs else '', sCheckBoxAttr, oVar.idTestCaseArgs,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._add(' <td align="center">%s</td>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <td align="center">%s</td>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <td align="left">%s</td>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync % ( oVar.cGangMembers,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'Default' if oVar.cSecTimeout is None else oVar.cSecTimeout,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync escapeElem(oVar.sArgs) ));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._add(' </tr>\n');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if len(oTestCase.aoTestCaseArgs) == 0:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._add(' <td></td> <td></td> <td></td> <td></td>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' </tr>\n');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return self._add(' </tbody>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync '</table>\n');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def addListOfSchedGroupMembers(self, sName, aoSchedGroupMembers, aoAllTestGroups, # pylint: disable=R0914
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sLabel, fReadOnly = True):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync For WuiAdminSchedGroup.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if self._fReadOnly:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fReadOnly = True;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync assert len(aoSchedGroupMembers) <= len(aoAllTestGroups);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._addLabel(sName, sLabel);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if len(aoAllTestGroups) == 0:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return self._add('<li>No test groups available.</li>\n')
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._add('<input name="%s" type="hidden" value="%s">\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync % ( SchedGroupDataEx.ksParam_aidTestGroups,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ','.join([str(oTestGroup.idTestGroup) for oTestGroup in aoAllTestGroups]), ));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._add('<table class="tmformtbl">\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <thead>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <tr>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <th></th>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <th>Test Group</th>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <th>Priority [0..31]</th>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <th>Prerequisite Test Group</th>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <th>Weekly schedule</th>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' </tr>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' </thead>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <tbody>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync );
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sCheckBoxAttr = ' readonly onclick="return false" onkeydown="return false"' if fReadOnly else '';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sComboBoxAttr = ' disabled' if fReadOnly else '';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oDefMember = SchedGroupMemberData();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync aoSchedGroupMembers = list(aoSchedGroupMembers); # Copy it so we can pop.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync for iTestGroup in range(len(aoAllTestGroups)):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oTestGroup = aoAllTestGroups[iTestGroup];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Is it a member?
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oMember = None;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync for i in range(len(aoSchedGroupMembers)):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if aoSchedGroupMembers[i].oTestGroup.idTestGroup == oTestGroup.idTestGroup:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oMember = aoSchedGroupMembers.pop(i);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync break;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Start on the rows...
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sPrefix = '%s[%d]' % (sName, oTestGroup.idTestGroup,);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._add(' <tr class="%s">\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <td>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <input name="%s[%s]" type="hidden" value="%s">\n' # idTestGroup
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <input name="%s[%s]" type="hidden" value="%s">\n' # idSchedGroup
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <input name="%s[%s]" type="hidden" value="%s">\n' # tsExpire
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <input name="%s[%s]" type="hidden" value="%s">\n' # tsEffective
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <input name="%s[%s]" type="hidden" value="%s">\n' # uidAuthor
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <input name="%s" type="checkbox"%s%s value="%d" class="tmform-checkbox" title="#%d - %s">\n' # (list)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' </td>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync % ( 'tmodd' if iTestGroup & 1 else 'tmeven',
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sPrefix, SchedGroupMemberData.ksParam_idTestGroup, oTestGroup.idTestGroup,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sPrefix, SchedGroupMemberData.ksParam_idSchedGroup, -1 if oMember is None else oMember.idSchedGroup,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sPrefix, SchedGroupMemberData.ksParam_tsExpire, '' if oMember is None else oMember.tsExpire,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sPrefix, SchedGroupMemberData.ksParam_tsEffective, '' if oMember is None else oMember.tsEffective,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sPrefix, SchedGroupMemberData.ksParam_uidAuthor, '' if oMember is None else oMember.uidAuthor,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync SchedGroupDataEx.ksParam_aoMembers, '' if oMember is None else ' checked', sCheckBoxAttr,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oTestGroup.idTestGroup, oTestGroup.idTestGroup, escapeElem(oTestGroup.sName),
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._add(' <td align="left">%s</td>\n' % ( escapeElem(oTestGroup.sName), ));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._add(' <td align="center">\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <input name="%s[%s]" type="text" value="%s" style="max-width:3em;" %s>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' </td>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync % ( sPrefix, SchedGroupMemberData.ksParam_iSchedPriority,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync (oMember if oMember is not None else oDefMember).iSchedPriority,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' readonly class="tmform-input-readonly"' if fReadOnly else '', ));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._add(' <td align="center">\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <select name="%s[%s]" id="%s[%s]" class="tmform-combobox"%s>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <option value="-1"%s>None</option>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync % ( sPrefix, SchedGroupMemberData.ksParam_idTestGroupPreReq,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sPrefix, SchedGroupMemberData.ksParam_idTestGroupPreReq,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sComboBoxAttr,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' selected' if oMember is None or oMember.idTestGroupPreReq is None else '',
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync for oTestGroup2 in aoAllTestGroups:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if oTestGroup2 != oTestGroup:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fSelected = oMember is not None and oTestGroup2.idTestGroup == oMember.idTestGroupPreReq;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._add(' <option value="%s"%s>%s</option>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync % ( oTestGroup2.idTestGroup, ' selected' if fSelected else '', escapeElem(oTestGroup2.sName), ));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._add(' </select>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' </td>\n');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._add(' <td align="left">\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' Todo<input name="%s[%s]" type="hidden" value="%s">\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' </td>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync % ( sPrefix, SchedGroupMemberData.ksParam_bmHourlySchedule,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync '' if oMember is None else oMember.bmHourlySchedule, ));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._add(' </tr>\n');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return self._add(' </tbody>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync '</table>\n');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Buttons.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def addSubmit(self, sLabel = 'Submit'):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """Adds the submit button to the form."""
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if self._fReadOnly:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return True;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return self._add(' <li>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <br>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <div class="tmform-field"><div class="tmform-field-submit">\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <label>&nbsp;</label>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <input type="submit" value="%s">\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' </div></div>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' </li>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync % (escapeElem(sLabel),));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def addReset(self):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """Adds a reset button to the form."""
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if self._fReadOnly:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return True;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return self._add(' <li>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <div class="tmform-button"><div class="tmform-button-reset">\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' <input type="reset" value="%s">\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' </div></div>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ' </li>\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync );
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync