Changeset 65051 in vbox
- Timestamp:
- Jan 2, 2017 11:55:03 AM (8 years ago)
- Location:
- trunk/src/VBox/ValidationKit/testmanager
- Files:
-
- 9 edited
-
core/base.py (modified) (3 diffs)
-
core/testresults.py (modified) (9 diffs)
-
htdocs/css/common.css (modified) (1 diff)
-
htdocs/js/common.js (modified) (2 diffs)
-
webui/template.html (modified) (2 diffs)
-
webui/wuiadminsystemchangelog.py (modified) (1 diff)
-
webui/wuibase.py (modified) (3 diffs)
-
webui/wuicontentbase.py (modified) (1 diff)
-
webui/wuimain.py (modified) (8 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/ValidationKit/testmanager/core/base.py
r65039 r65051 1186 1186 ## @} 1187 1187 1188 def __init__(self, sName, sVarNm = None, sTypeNm = ksType_UInt, sState = ksState_NotSelected, sKind = ksKind_AnyOf): 1188 def __init__(self, sName, sVarNm = None, sType = ksType_UInt, sState = ksState_NotSelected, sKind = ksKind_AnyOf): 1189 assert len(sVarNm) in (2,3); # required by wuimain.py 1189 1190 self.sName = sName; 1190 1191 self.sState = sState; 1191 1192 self.sVarNm = sVarNm if sVarNm is not None else sName; 1192 self.sType Nm = sTypeNm;1193 self.sType = sType; 1193 1194 self.sKind = sKind; 1194 1195 self.aoSelected = []; # Single value, any type. … … 1201 1202 1202 1203 Filters are used to narrow down data that is displayed in a list or 1203 report. It differs a little from ModelDataBase in that it's not tied to a1204 database table, but one or more database queries that are typically very1205 complicated.1204 report. This class differs a little from ModelDataBase in that it is not 1205 tied to a database table, but one or more database queries that are 1206 typically rather complicated. 1206 1207 1207 1208 The filter object has two roles: … … 1234 1235 if oCriterion.sType == FilterCriterion.ksType_UInt: 1235 1236 oCriterion.aoSelected = oDisp.getListOfIntParams(oCriterion.sVarNm, iMin = 0, aiDefaults = []); 1237 elif oCriterion.sType == FilterCriterion.ksType_String: 1238 oCriterion.aoSelected = oDisp.getListOfStrParams(oCriterion.sVarNm, asDefaults = []); 1236 1239 else: 1237 oCriterion.aoSelected = oDisp.getListOfStrParams(oCriterion.sVarNm, asDefaults = []);1238 if len(oCriterion.aoSelected) :1239 oCriterion.sState = FilterCriterion.ksState_Selected;1240 assert False; 1241 if len(oCriterion.aoSelected) > 0: 1242 oCriterion.sState = FilterCriterion.ksState_Selected; 1240 1243 else: 1241 oCriterion.sState = FilterCriterion.ksState_NotSelected;1244 oCriterion.sState = FilterCriterion.ksState_NotSelected; 1242 1245 return self; 1243 1244 1246 1245 1247 -
trunk/src/VBox/ValidationKit/testmanager/core/testresults.py
r64951 r65051 37 37 from common import constants; 38 38 from testmanager import config; 39 from testmanager.core.base import ModelDataBase, ModelLogicBase, ModelDataBaseTestCase, TMExceptionBase, \ 40 TMTooManyRows, TMRowNotFound; 39 from testmanager.core.base import ModelDataBase, ModelLogicBase, ModelDataBaseTestCase, ModelFilterBase, \ 40 FilterCriterion, FilterCriterionValueAndDescription, \ 41 TMExceptionBase, TMTooManyRows, TMRowNotFound; 41 42 from testmanager.core.testgroup import TestGroupData; 42 43 from testmanager.core.build import BuildDataEx, BuildCategoryData; … … 638 639 """Hanging offence committed by test case.""" 639 640 pass; 641 642 643 class TestResultFilter(ModelFilterBase): 644 """ 645 Test result filter. 646 """ 647 648 kiTestStatus = 0; 649 kiSchedGroups = 1; 650 kiTestBoxes = 2; 651 652 def __init__(self): 653 ModelFilterBase.__init__(self); 654 oCrit = FilterCriterion('Test status', sVarNm = 'ts', sType = FilterCriterion.ksType_String); 655 oCrit.aoPossible = ( 656 FilterCriterionValueAndDescription(TestResultData.ksTestStatus_Success, 'Success'), 657 FilterCriterionValueAndDescription(TestResultData.ksTestStatus_Running, 'Running'), 658 FilterCriterionValueAndDescription(TestResultData.ksTestStatus_Skipped, 'Skipped'), 659 FilterCriterionValueAndDescription(TestResultData.ksTestStatus_Aborted, 'Aborted'), 660 FilterCriterionValueAndDescription(TestResultData.ksTestStatus_Failure, 'Failure'), 661 FilterCriterionValueAndDescription(TestResultData.ksTestStatus_TimedOut, 'Timed out'), 662 FilterCriterionValueAndDescription(TestResultData.ksTestStatus_Rebooted, 'Rebooted'), 663 ); 664 self.aCriteria.append(oCrit); 665 assert self.aCriteria[self.kiTestStatus] is oCrit; 666 667 oCrit = FilterCriterion('Sched groups', sVarNm = 'sg'); 668 self.aCriteria.append(oCrit); 669 assert self.aCriteria[self.kiSchedGroups] is oCrit; 670 671 oCrit = FilterCriterion('Testboxes', sVarNm = 'tb'); 672 self.aCriteria.append(oCrit); 673 assert self.aCriteria[self.kiTestBoxes] is oCrit; 640 674 641 675 … … 849 883 return sRet 850 884 851 def fetchResultsForListing(self, iStart, cMaxRows, tsNow, sInterval, enmResultSortBy, # pylint: disable=R0913885 def fetchResultsForListing(self, iStart, cMaxRows, tsNow, sInterval, oFilter, enmResultSortBy, # pylint: disable=R0913 852 886 enmResultsGroupingType, iResultsGroupingValue, fOnlyFailures, fOnlyNeedingReason): 853 887 """ … … 864 898 Raises exception on error. 865 899 """ 900 901 _ = oFilter; 866 902 867 903 # … … 939 975 sQuery += ' AND TestSets.enmStatus != \'success\'::TestStatus_T\n' \ 940 976 ' AND TestSets.enmStatus != \'running\'::TestStatus_T\n'; 977 if oFilter.aCriteria[oFilter.kiTestStatus].sState == FilterCriterion.ksState_Selected: 978 sQuery += ' AND TestSets.enmStatus IN (' \ 979 + ', '.join('\'%s\'' % sValue for sValue in oFilter.aCriteria[oFilter.kiTestStatus].aoSelected) + ')\n'; 980 if oFilter.aCriteria[oFilter.kiSchedGroups].sState == FilterCriterion.ksState_Selected: 981 sQuery += ' AND TestSets.idSchedGroup IN (' \ 982 + ', '.join(str(iVal) for iVal in oFilter.aCriteria[oFilter.kiSchedGroups].aoSelected) + ')\n'; 983 if oFilter.aCriteria[oFilter.kiTestBoxes].sState == FilterCriterion.ksState_Selected: 984 sQuery += ' AND TestSets.idTestBox IN (' \ 985 + ', '.join(str(iVal) for iVal in oFilter.aCriteria[oFilter.kiTestBoxes].aoSelected) + ')\n'; 941 986 if fOnlyNeedingReason: 942 987 sQuery += ' AND TestResultFailures.idTestSet IS NULL\n'; … … 1070 1115 1071 1116 1072 def getEntriesCount(self, tsNow, sInterval, enmResultsGroupingType, iResultsGroupingValue, fOnlyFailures, fOnlyNeedingReason): 1117 def getEntriesCount(self, tsNow, sInterval, oFilter, enmResultsGroupingType, iResultsGroupingValue, 1118 fOnlyFailures, fOnlyNeedingReason): 1073 1119 """ 1074 1120 Get number of table records. … … 1081 1127 @param iResultsGroupingValue is ignored. 1082 1128 """ 1129 _ = oFilter; 1083 1130 1084 1131 # … … 1108 1155 sQuery += ' AND TestSets.enmStatus != \'success\'::TestStatus_T\n' \ 1109 1156 ' AND TestSets.enmStatus != \'running\'::TestStatus_T\n'; 1157 if oFilter.aCriteria[oFilter.kiTestStatus].sState == FilterCriterion.ksState_Selected: 1158 sQuery += ' AND TestSets.enmStatus IN (' \ 1159 + ', '.join('\'%s\'' % sValue for sValue in oFilter.aCriteria[oFilter.kiTestStatus].aoSelected) + ')\n'; 1160 if oFilter.aCriteria[oFilter.kiSchedGroups].sState == FilterCriterion.ksState_Selected: 1161 sQuery += ' AND TestSets.idSchedGroup IN (' \ 1162 + ', '.join(str(iVal) for iVal in oFilter.aCriteria[oFilter.kiSchedGroups].aoSelected) + ')\n'; 1163 if oFilter.aCriteria[oFilter.kiTestBoxes].sState == FilterCriterion.ksState_Selected: 1164 sQuery += ' AND TestSets.idTestBox IN (' \ 1165 + ', '.join(str(iVal) for iVal in oFilter.aCriteria[oFilter.kiTestBoxes].aoSelected) + ')\n'; 1110 1166 if fOnlyNeedingReason: 1111 1167 sQuery += ' AND TestResultFailures.idTestSet IS NULL\n'; … … 1298 1354 except IndexError: 1299 1355 return None 1356 1357 1358 def fetchPossibleFilterOptions(self, oFilter, tsNow, sPeriod): 1359 """ 1360 Fetches the available filter criteria. 1361 Returns oFilter. 1362 """ 1363 assert isinstance(oFilter, TestResultFilter); 1364 1365 # Scheduling groups (see getSchedGroups). 1366 oCrit = oFilter.aCriteria[TestResultFilter.kiSchedGroups]; 1367 self._oDb.execute('SELECT SchedGroups.idSchedGroup, SchedGroups.sName\n' 1368 'FROM ( SELECT idSchedGroup,\n' 1369 ' MAX(TestSets.tsCreated) AS tsNow\n' 1370 ' FROM TestSets\n' 1371 ' WHERE ' + self._getTimePeriodQueryPart(tsNow, sPeriod, ' ') + 1372 ' GROUP BY idSchedGroup\n' 1373 ' ) AS SchedGroupIDs\n' 1374 ' INNER JOIN SchedGroups\n' 1375 ' ON SchedGroups.idSchedGroup = SchedGroupIDs.idSchedGroup\n' 1376 ' AND SchedGroups.tsExpire > SchedGroupIDs.tsNow\n' 1377 ' AND SchedGroups.tsEffective <= SchedGroupIDs.tsNow\n' 1378 'ORDER BY SchedGroups.sName\n' ); 1379 for aoRow in self._oDb.fetchAll(): 1380 oCrit.aoPossible.append(FilterCriterionValueAndDescription(aoRow[0], aoRow[1])); 1381 1382 # Scheduling groups (see getTestBoxes). 1383 oCrit = oFilter.aCriteria[TestResultFilter.kiTestBoxes]; 1384 self._oDb.execute('SELECT TestBoxesWithStrings.idTestBox, TestBoxesWithStrings.sName\n' 1385 'FROM ( SELECT idTestBox AS idTestBox,\n' 1386 ' MAX(idGenTestBox) AS idGenTestBox\n' 1387 ' FROM TestSets\n' 1388 ' WHERE ' + self._getTimePeriodQueryPart(tsNow, sPeriod, ' ') + 1389 ' GROUP BY idTestBox\n' 1390 ' ) AS TestBoxIDs\n' 1391 ' LEFT OUTER JOIN TestBoxesWithStrings\n' 1392 ' ON TestBoxesWithStrings.idGenTestBox = TestBoxIDs.idGenTestBox\n' 1393 'ORDER BY TestBoxesWithStrings.sName\n' ); 1394 for aoRow in self._oDb.fetchAll(): 1395 oCrit.aoPossible.append(FilterCriterionValueAndDescription(aoRow[0], aoRow[1])); 1396 1397 return oFilter; 1300 1398 1301 1399 -
trunk/src/VBox/ValidationKit/testmanager/htdocs/css/common.css
r65043 r65051 303 303 } 304 304 305 #side-filters dd { 306 font-size: 0.86em; 307 max-height: 22em; 308 overflow: auto; 309 } 310 305 311 306 312 #side-footer { -
trunk/src/VBox/ValidationKit/testmanager/htdocs/js/common.js
r64986 r65051 368 368 var oParent = oAnchor.parentElement; 369 369 var sClass = oParent.className; 370 var oUncle = oParent.nextSibling; 370 371 /* Find the DD sibling tag */ 372 var oDdElement = oParent.nextSibling; 373 while (oDdElement != null && oDdElement.tagName != 'DD') 374 oDdElement = oDdElement.nextSibling; 375 376 /* Determin the new class and arrow char. */ 371 377 var sNewClass; 372 378 var sNewChar; 373 374 /* Determin the new class and arrow char. */375 379 if (sClass.endsWith('collapsable')) 376 380 { … … 393 397 oAnchor.firstChild.textContent = sNewChar + oAnchor.firstChild.textContent.substr(1); 394 398 395 /* Update the uncle (DD) class. */396 if (o Uncle)397 o Uncle.className = sNewClass;399 /* Update the uncle (DD) class. */ 400 if (oDdElement) 401 oDdElement.className = sNewClass; 398 402 return true; 399 403 } -
trunk/src/VBox/ValidationKit/testmanager/webui/template.html
r65010 r65051 2 2 <html lang="en"> 3 3 <head> 4 <meta charset="UTF-8" /> 4 5 <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> 5 6 <meta http-equiv="content-language" content="en" /> … … 34 35 35 36 <div id="side-menu"> 36 <form id="side-menu-form" >37 <form id="side-menu-form"@@SIDE_MENU_FORM_ATTRS@@> 37 38 <ul> 38 39 @@SIDE_MENU_ITEMS@@ -
trunk/src/VBox/ValidationKit/testmanager/webui/wuiadminsystemchangelog.py
r65046 r65051 386 386 % (sRowClass, cAttribsChanged + 1, cAttribsChanged + 1, sRowClass); 387 387 for j, oChange in enumerate(oChangeEntry.aoChanges): 388 fLastRow = j + 1 == len(oChangeEntry.aoChanges); 388 389 sHtml += u' <tr class="%s%s tmsyschlogattr%s">\n' \ 389 % ( sRowClass, 'odd' if j & 1 else 'even', 390 ' tmsyschlogattrfinal' if j + 1 == len(oChangeEntry.aoChanges) else '',); 390 % ( sRowClass, 'odd' if j & 1 else 'even', ' tmsyschlogattrfinal' if fLastRow else '',); 391 391 if j == 0: 392 392 sHtml += u' <td class="%s tmsyschlogspacer" rowspan="%d"></td>\n' % (sRowClass, cAttribsChanged - 1,); 393 393 394 394 if isinstance(oChange, AttributeChangeEntryPre): 395 sHtml += u' <td >%s</td>\n' \395 sHtml += u' <td class="%s%s">%s</td>\n' \ 396 396 u' <td><div class="tdpre"><pre>%s</pre></div></td>\n' \ 397 u' <td><div class="tdpre"><pre>%s</pre></div></td>\n' \ 398 % ( webutils.escapeElem(oChange.sAttr), 397 u' <td class="%s%s"><div class="tdpre"><pre>%s</pre></div></td>\n' \ 398 % ( ' tmtopleft' if j == 0 else '', ' tmbottomleft' if fLastRow else '', 399 webutils.escapeElem(oChange.sAttr), 399 400 webutils.escapeElem(oChange.sOldText), 401 ' tmtopright' if j == 0 else '', ' tmbottomright' if fLastRow else '', 400 402 webutils.escapeElem(oChange.sNewText), ); 401 403 else: 402 sHtml += u' <td >%s</td>\n' \404 sHtml += u' <td class="%s%s">%s</td>\n' \ 403 405 u' <td>%s</td>\n' \ 404 u' <td>%s</td>\n' \ 405 % ( webutils.escapeElem(oChange.sAttr), 406 u' <td class="%s%s">%s</td>\n' \ 407 % ( ' tmtopleft' if j == 0 else '', ' tmbottomleft' if fLastRow else '', 408 webutils.escapeElem(oChange.sAttr), 406 409 webutils.escapeElem(oChange.sOldText), 410 ' tmtopright' if j == 0 else '', ' tmbottomright' if fLastRow else '', 407 411 webutils.escapeElem(oChange.sNewText), ); 408 412 sHtml += u' </tr>\n'; -
trunk/src/VBox/ValidationKit/testmanager/webui/wuibase.py
r64986 r65051 118 118 self._sPageFilter = ''; # The filter controls (optional). 119 119 self._sPageBody = '$$TODO$$'; # The body text. 120 self._dSideMenuFormAttrs = {}; # key/value with attributes for the side menu <form> tag. 120 121 self._sRedirectTo = None; 121 122 self._sDebug = ''; … … 266 267 '@@SIDE_MENU_ITEMS@@': sSideMenuItems, 267 268 '@@SIDE_FILTER_CONTROL@@': self._sPageFilter, 269 '@@SIDE_MENU_FORM_ATTRS@@': '', 268 270 '@@PAGE_BODY@@': self._sPageBody, 269 271 '@@DEBUG@@': '', 270 272 }; 273 274 # Side menu form attributes. 275 if len(self._dSideMenuFormAttrs) > 0: 276 dReplacements['@@SIDE_MENU_FORM_ATTRS@@'] = ' '.join(['%s="%s"' % (sKey, webutils.escapeAttr(sValue)) 277 for sKey, sValue in self._dSideMenuFormAttrs.iteritems()]); 271 278 272 279 # Special current user handling. … … 746 753 for sKey, oValue in self._dParams.iteritems(): 747 754 if sKey not in self.kasDbgParams: 748 sHtml += ' <input type="hidden" name="%s" value="%s"/>\n' \ 749 % (webutils.escapeAttr(sKey), webutils.escapeAttrToStr(oValue),); 755 if hasattr(oValue, 'startswith'): 756 sHtml += ' <input type="hidden" name="%s" value="%s"/>\n' \ 757 % (webutils.escapeAttr(sKey), webutils.escapeAttrToStr(oValue),); 758 else: 759 for oSubValue in oValue: 760 sHtml += ' <input type="hidden" name="%s" value="%s"/>\n' \ 761 % (webutils.escapeAttr(sKey), webutils.escapeAttrToStr(oSubValue),); 750 762 751 763 for aoCheckBox in ( -
trunk/src/VBox/ValidationKit/testmanager/webui/wuicontentbase.py
r65040 r65051 84 84 if dParams[sKey] is None: 85 85 dParams[sKey] = ''; 86 self.sUrl += '?' + webutils.encodeUrlParams(dParams) 86 self.sUrl += '?' + webutils.encodeUrlParams(dParams); 87 87 88 88 if sFragmentId is not None: -
trunk/src/VBox/ValidationKit/testmanager/webui/wuimain.py
r64986 r65051 335 335 """Show the default admin page.""" 336 336 from testmanager.webui.wuitestresult import WuiGroupedResultList; 337 from testmanager.core.testresults import TestResultLogic ;337 from testmanager.core.testresults import TestResultLogic, TestResultFilter; 338 338 self._sAction = self.ksActionResultsUnGrouped 339 339 return self._actionGroupedResultsListing(TestResultLogic.ksResultsGroupingTypeNone, 340 TestResultLogic, 341 WuiGroupedResultList) 340 TestResultLogic, TestResultFilter, WuiGroupedResultList); 342 341 343 342 def _isMenuMatch(self, sMenuUrl, sActionParam): … … 722 721 enmResultsGroupingType, 723 722 oResultsLogicType, 723 oResultFilterType, 724 724 oResultsListContentType): 725 725 """ 726 726 Override generic listing action. 727 727 728 oLogicType implements fetchForListing. 729 oListContentType is a child of WuiListContentBase. 728 oResultsLogicType implements getEntriesCount, fetchResultsForListing and more. 729 oResultFilterType is a child of ModelFilterBase. 730 oResultsListContentType is a child of WuiListContentBase. 730 731 """ 731 732 from testmanager.core.testresults import TestResultLogic; … … 740 741 asValidValues = TestResultLogic.kasResultsSortBy, 741 742 sDefault = TestResultLogic.ksResultsSortByRunningAndStart); 743 oFilter = oResultFilterType().initFromParams(self); 742 744 743 745 # Get testing results period and validate it … … 833 835 cEntries = oResultLogic.getEntriesCount(tsNow = tsEffective, 834 836 sInterval = sCurPeriod, 837 oFilter = oFilter, 835 838 enmResultsGroupingType = enmResultsGroupingType, 836 839 iResultsGroupingValue = idMember, … … 843 846 tsNow = tsEffective, 844 847 sInterval = sCurPeriod, 848 oFilter = oFilter, 845 849 enmResultSortBy = enmResultSortBy, 846 850 enmResultsGroupingType = enmResultsGroupingType, … … 890 894 # Now, generate a filter control panel for the side bar. 891 895 # 892 self._sPageFilter = self._generateResultFilter(oResultLogic, 893 tsNow = tsEffective, 894 sInterval = sCurPeriod, 896 self._sPageFilter = self._generateResultFilter(oFilter, oResultLogic, tsEffective, sCurPeriod, 895 897 enmResultsGroupingType = enmResultsGroupingType, 896 898 aoGroupMembers = aoGroupMembers, … … 899 901 return True; 900 902 901 def _generateResultFilter(self, o ResultLogic, tsNow, sInterval, enmResultsGroupingType, aoGroupMembers,903 def _generateResultFilter(self, oFilter, oResultLogic, tsNow, sPeriod, enmResultsGroupingType, aoGroupMembers, 902 904 fOnlyFailures, fOnlyNeedingReason): 903 905 """ 904 906 Generates the result filter for the left hand side. 905 907 """ 906 sHtml = u'<div id="side-filters">\n' \ 908 _ = enmResultsGroupingType; _ = aoGroupMembers; _ = fOnlyFailures; _ = fOnlyNeedingReason; 909 oResultLogic.fetchPossibleFilterOptions(oFilter, tsNow, sPeriod) 910 911 # Add non-filter parameters as hidden fields so we can use 'GET' and have URLs to bookmark. 912 self._dSideMenuFormAttrs['method'] = 'GET'; 913 sHtml = u''; 914 for sKey, oValue in self._oSrvGlue.getParameters().iteritems(): 915 if len(sKey) > 3: 916 if hasattr(oValue, 'startswith'): 917 sHtml += u'<input type="hidden" name="%s" value="%s"/>\n' \ 918 % (webutils.escapeAttr(sKey), webutils.escapeAttr(oValue),); 919 else: 920 for oSubValue in oValue: 921 sHtml += u'<input type="hidden" name="%s" value="%s"/>\n' \ 922 % (webutils.escapeAttr(sKey), webutils.escapeAttr(oSubValue),); 923 924 # Generate the filter panel. 925 sHtml += u'<div id="side-filters">\n' \ 907 926 u' <p>Filters</p>\n' \ 908 927 u' <dl>\n'; 909 928 910 sHtml += u' <dt class="sf-collapsable"><a href="javascript:void(0)" onclick="toggleCollapsableDtDd(this);">▼ Test filter 1</a></dd>\n'; 911 sHtml += u' <dd class="sf-collapsable"><ul><li>stuff 1</li><li>stuff 2</li><ul></dd>\n' 912 913 sHtml += u' <dt class="sf-expandable"><a href="javascript:void(0)" onclick="toggleCollapsableDtDd(this);">▶ Test filter 2</a></dd>\n'; 914 sHtml += u' <dd class="sf-expandable"><ul><li>stuff 3</li><li>stuff 4</li><ul></dd>\n' 915 916 917 sHtml += u' </dl>\n' \ 918 u'</div>\n'; 929 for iCrit, oCrit in enumerate(oFilter.aCriteria): 930 sClass = 'sf-collapsable' if oCrit.sState == oCrit.ksState_Selected else 'sf-expandable'; 931 sChar = '▼' if oCrit.sState == oCrit.ksState_Selected else '▶'; 932 sHtml += u' <dt class="%s"><a href="javascript:void(0)" onclick="toggleCollapsableDtDd(this);">%s'\ 933 u' %s</a></dt>\n' \ 934 u' <dd class="%s">\n' \ 935 u' <ul>\n' \ 936 % (sClass, sChar, webutils.escapeElem(oCrit.sName), sClass); 937 for oDesc in oCrit.aoPossible: 938 fChecked = oDesc.oValue in oCrit.aoSelected; 939 sHtml += u' <li><input type="checkbox" name="%s" value="%s"%s/>%s</li>\n' \ 940 % (oCrit.sVarNm, oDesc.oValue, ' checked' if fChecked else '', webutils.escapeElem(oDesc.sDesc),); 941 942 sHtml += u' </ul>\n'; 943 if iCrit + 1 < len(oFilter.aCriteria): ## @todo fix me. 944 sHtml += u' <div class="filterend"> </div>\n'; ## @todo fix me. 945 sHtml += u' </dd>\n'; 946 947 sHtml += u' </dl>\n'; 948 sHtml += u' <input type="submit" value="Apply"/>\n'; 949 sHtml += u'</div>\n'; 919 950 return sHtml; 920 951 … … 922 953 """ Action wrapper. """ 923 954 from testmanager.webui.wuitestresult import WuiGroupedResultList; 924 from testmanager.core.testresults import TestResultLogic ;955 from testmanager.core.testresults import TestResultLogic, TestResultFilter; 925 956 #return self._actionResultsListing(TestResultLogic, WuiGroupedResultList)? 926 957 return self._actionGroupedResultsListing(TestResultLogic.ksResultsGroupingTypeNone, 927 TestResultLogic, WuiGroupedResultList);958 TestResultLogic, TestResultFilter, WuiGroupedResultList); 928 959 929 960 def _actionResultsGroupedByTestGroup(self): 930 961 """ Action wrapper. """ 931 962 from testmanager.webui.wuitestresult import WuiGroupedResultList; 932 from testmanager.core.testresults import TestResultLogic ;963 from testmanager.core.testresults import TestResultLogic, TestResultFilter; 933 964 return self._actionGroupedResultsListing(TestResultLogic.ksResultsGroupingTypeTestGroup, 934 TestResultLogic, WuiGroupedResultList);965 TestResultLogic, TestResultFilter, WuiGroupedResultList); 935 966 936 967 def _actionResultsGroupedByBuildRev(self): 937 968 """ Action wrapper. """ 938 969 from testmanager.webui.wuitestresult import WuiGroupedResultList; 939 from testmanager.core.testresults import TestResultLogic ;970 from testmanager.core.testresults import TestResultLogic, TestResultFilter; 940 971 return self._actionGroupedResultsListing(TestResultLogic.ksResultsGroupingTypeBuildRev, 941 TestResultLogic, WuiGroupedResultList);972 TestResultLogic, TestResultFilter, WuiGroupedResultList); 942 973 943 974 def _actionResultsGroupedByBuildCat(self): 944 975 """ Action wrapper. """ 945 976 from testmanager.webui.wuitestresult import WuiGroupedResultList; 946 from testmanager.core.testresults import TestResultLogic ;977 from testmanager.core.testresults import TestResultLogic, TestResultFilter; 947 978 return self._actionGroupedResultsListing(TestResultLogic.ksResultsGroupingTypeBuildCat, 948 TestResultLogic, WuiGroupedResultList);979 TestResultLogic, TestResultFilter, WuiGroupedResultList); 949 980 950 981 def _actionResultsGroupedByTestBox(self): 951 982 """ Action wrapper. """ 952 983 from testmanager.webui.wuitestresult import WuiGroupedResultList; 953 from testmanager.core.testresults import TestResultLogic ;984 from testmanager.core.testresults import TestResultLogic, TestResultFilter; 954 985 return self._actionGroupedResultsListing(TestResultLogic.ksResultsGroupingTypeTestBox, 955 TestResultLogic, WuiGroupedResultList);986 TestResultLogic, TestResultFilter, WuiGroupedResultList); 956 987 957 988 def _actionResultsGroupedByTestCase(self): 958 989 """ Action wrapper. """ 959 990 from testmanager.webui.wuitestresult import WuiGroupedResultList; 960 from testmanager.core.testresults import TestResultLogic ;991 from testmanager.core.testresults import TestResultLogic, TestResultFilter; 961 992 return self._actionGroupedResultsListing(TestResultLogic.ksResultsGroupingTypeTestCase, 962 TestResultLogic, WuiGroupedResultList);993 TestResultLogic, TestResultFilter, WuiGroupedResultList); 963 994 964 995 def _actionResultsGroupedByOS(self): 965 996 """ Action wrapper. """ 966 997 from testmanager.webui.wuitestresult import WuiGroupedResultList; 967 from testmanager.core.testresults import TestResultLogic ;998 from testmanager.core.testresults import TestResultLogic, TestResultFilter; 968 999 return self._actionGroupedResultsListing(TestResultLogic.ksResultsGroupingTypeOS, 969 TestResultLogic, WuiGroupedResultList);1000 TestResultLogic, TestResultFilter, WuiGroupedResultList); 970 1001 971 1002 def _actionResultsGroupedByArch(self): 972 1003 """ Action wrapper. """ 973 1004 from testmanager.webui.wuitestresult import WuiGroupedResultList; 974 from testmanager.core.testresults import TestResultLogic ;1005 from testmanager.core.testresults import TestResultLogic, TestResultFilter; 975 1006 return self._actionGroupedResultsListing(TestResultLogic.ksResultsGroupingTypeArch, 976 TestResultLogic, WuiGroupedResultList);1007 TestResultLogic, TestResultFilter, WuiGroupedResultList); 977 1008 978 1009 def _actionResultsGroupedBySchedGroup(self): 979 1010 """ Action wrapper. """ 980 1011 from testmanager.webui.wuitestresult import WuiGroupedResultList; 981 from testmanager.core.testresults import TestResultLogic ;1012 from testmanager.core.testresults import TestResultLogic, TestResultFilter; 982 1013 return self._actionGroupedResultsListing(TestResultLogic.ksResultsGroupingTypeSchedGroup, 983 TestResultLogic, WuiGroupedResultList);1014 TestResultLogic, TestResultFilter, WuiGroupedResultList); 984 1015 985 1016
Note:
See TracChangeset
for help on using the changeset viewer.

