Changeset 65051 in vbox for trunk/src/VBox/ValidationKit/testmanager/webui
- Timestamp:
- Jan 2, 2017 11:55:03 AM (8 years ago)
- svn:sync-xref-src-repo-rev:
- 112548
- Location:
- trunk/src/VBox/ValidationKit/testmanager/webui
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
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.