def debugTextReport(self, tsStart = 0): """ Used to get a SQL activity dump as text. """ cNsElapsed = 0; for aEntry in self._aoTraceBack: cNsElapsed += aEntry[2]; sHdr = 'SQL Debug Log (total time %s ns)' % (utils.formatNumber(cNsElapsed),); sDebug = sHdr + '\n' + '-' * len(sHdr) + '\n'; iEntry = 0; for aEntry in self._aoTraceBack: iEntry += 1; sHdr = 'Query #%s Timestamp: %s ns Elapsed: %s ns Rows: %s Caller: %s' \ % ( iEntry, utils.formatNumber(aEntry[0] - tsStart), utils.formatNumber(aEntry[2]), utils.formatNumber(aEntry[3]), aEntry[4], ); sDebug += '\n' + sHdr + '\n' + '-' * len(sHdr) + '\n'; sDebug += aEntry[1]; if sDebug[-1] != '\n': sDebug += '\n'; if aEntry[5] is not None: sDebug += 'Explain:\n' \ ' %s\n' \ % ( '\n'.join([aoRow[0] for aoRow in aEntry[5]]),); return sDebug;
def debugTextReport(self, tsStart=0): """ Used to get a SQL activity dump as text. """ cNsElapsed = 0 for aEntry in self._aoTraceBack: cNsElapsed += aEntry[2] sHdr = 'SQL Debug Log (total time %s ns)' % ( utils.formatNumber(cNsElapsed), ) sDebug = sHdr + '\n' + '-' * len(sHdr) + '\n' iEntry = 0 for aEntry in self._aoTraceBack: iEntry += 1 sHdr = 'Query #%s Timestamp: %s ns Elapsed: %s ns Rows: %s Caller: %s' \ % ( iEntry, utils.formatNumber(aEntry[0] - tsStart), utils.formatNumber(aEntry[2]), utils.formatNumber(aEntry[3]), aEntry[4], ) sDebug += '\n' + sHdr + '\n' + '-' * len(sHdr) + '\n' sDebug += aEntry[1] if sDebug[-1] != '\n': sDebug += '\n' if aEntry[5] is not None: sDebug += 'Explain:\n' \ ' %s\n' \ % ( '\n'.join([aoRow[0] for aoRow in aEntry[5]]),) return sDebug
def debugHtmlReport(self, tsStart = 0): """ Used to get a SQL activity dump as HTML, usually for WuiBase._sDebug. """ cNsElapsed = 0; for aEntry in self._aoTraceBack: cNsElapsed += aEntry[2]; sDebug = '<h3>SQL Debug Log (total time %s ns):</h3>\n' \ '<table class="tmsqltable">\n' \ ' <tr>\n' \ ' <th>No.</th>\n' \ ' <th>Timestamp (ns)</th>\n' \ ' <th>Elapsed (ns)</th>\n' \ ' <th>Rows Returned</th>\n' \ ' <th>Command</th>\n' \ ' <th>Caller</th>\n' \ ' </tr>\n' \ % (utils.formatNumber(cNsElapsed, ' '),); iEntry = 0; for aEntry in self._aoTraceBack: iEntry += 1; sDebug += ' <tr>\n' \ ' <td align="right">%s</td>\n' \ ' <td align="right">%s</td>\n' \ ' <td align="right">%s</td>\n' \ ' <td align="right">%s</td>\n' \ ' <td><pre>%s</pre></td>\n' \ ' <td>%s</td>\n' \ ' </tr>\n' \ % (iEntry, utils.formatNumber(aEntry[0] - tsStart, ' '), utils.formatNumber(aEntry[2], ' '), utils.formatNumber(aEntry[3], ' '), webutils.escapeElem(aEntry[1]), webutils.escapeElem(aEntry[4]), ); if aEntry[5] is not None: sDebug += ' <tr>\n' \ ' <td colspan="6"><pre style="white-space: pre-wrap;">%s</pre></td>\n' \ ' </tr>\n' \ % (webutils.escapeElem('\n'.join([aoRow[0] for aoRow in aEntry[5]])),); sDebug += '</table>'; return sDebug;
def debugHtmlReport(self, tsStart=0): """ Used to get a SQL activity dump as HTML, usually for WuiBase._sDebug. """ cNsElapsed = 0 for aEntry in self._aoTraceBack: cNsElapsed += aEntry[2] sDebug = '<h3>SQL Debug Log (total time %s ns):</h3>\n' \ '<table class="tmsqltable">\n' \ ' <tr>\n' \ ' <th>No.</th>\n' \ ' <th>Timestamp (ns)</th>\n' \ ' <th>Elapsed (ns)</th>\n' \ ' <th>Rows Returned</th>\n' \ ' <th>Command</th>\n' \ ' <th>Caller</th>\n' \ ' </tr>\n' \ % (utils.formatNumber(cNsElapsed, ' '),) iEntry = 0 for aEntry in self._aoTraceBack: iEntry += 1 sDebug += ' <tr>\n' \ ' <td align="right">%s</td>\n' \ ' <td align="right">%s</td>\n' \ ' <td align="right">%s</td>\n' \ ' <td align="right">%s</td>\n' \ ' <td><pre>%s</pre></td>\n' \ ' <td>%s</td>\n' \ ' </tr>\n' \ % (iEntry, utils.formatNumber(aEntry[0] - tsStart, ' '), utils.formatNumber(aEntry[2], ' '), utils.formatNumber(aEntry[3], ' '), webutils.escapeElem(aEntry[1]), webutils.escapeElem(aEntry[4]), ) if aEntry[5] is not None: sDebug += ' <tr>\n' \ ' <td colspan="6"><pre style="white-space: pre-wrap;">%s</pre></td>\n' \ ' </tr>\n' \ % (webutils.escapeElem('\n'.join([aoRow[0] for aoRow in aEntry[5]])),) sDebug += '</table>' return sDebug
def Ln(X, n, Xs, Ys): end_index = find_interval_end_index(Xs, X) #находим начальный индкс start_index = end_index - n # конечный if start_index < 0: # если нам нехватает элементов из таблицы, то мы просто уменьшаем промежуток по которому будет работь лагранж start_index = 0 n = end_index print("используем элемент от x{start} до x{end}".format(start=start_index, end=end_index)) formula_presentation = "" #то где будет хранить формулу в текстовом формате(для последующего построения и демонастрции Елене Антаольевне :) sum = 0 for k in range(start_index, end_index + 1): #проходимся от start_index до end_index + 1 nominator_presentation = "" nominator = 1 #числитель for t in range(start_index, end_index + 1): if t == k: continue nominator *= (X - Xs[t]) nominator_presentation += "( x - " + (formatNumber( Xs[t])) + " ) * " nominator_presentation = "(" + nominator_presentation[0:-3] + ")" denominator = 1 denominator_presentation = "" for t in range(start_index, end_index + 1): if t == k: continue denominator *= (Xs[k] - Xs[t]) denominator_presentation += "( " + formatNumber( Xs[k]) + " - " + (formatNumber(Xs[t])) + " ) * " denominator_presentation = "(" + denominator_presentation[0:-3] + ")" sum += nominator / denominator * Ys[k] formula_presentation += "(" + nominator_presentation + " / " + denominator_presentation + " * " + str( Ys[k]) + ") + " formula_presentation = formula_presentation[0:-3] print('FOMULA: {formula}'.format(formula=formula_presentation)) return sum
def generateReportBody(self): fInteractive = not self._fSubReport # Quick mockup. self._sTitle = 'Graph Wizzard' sHtml = '' sHtml += '<h2>Incomplete code - no complaints yet, thank you!!</h2>\n' # # Create a form for altering the data we're working with. # if fInteractive: (sTopOfForm, sEndOfForm) = self._generateInteractiveForm() sHtml += sTopOfForm del sTopOfForm # # Emit the graphs. At least one per sample source. # sHtml += ' <div id="graphwiz-graphs">\n' iGraph = 0 aoCollections = self._oModel.fetchGraphData() for iCollection, oCollection in enumerate(aoCollections): # Name the graph and add a checkbox for removing it. sSampleName = self._calcSampleName(oCollection) sHtml += ' <div class="graphwiz-collection" id="graphwiz-source-%u">\n' % ( iCollection, ) if fInteractive: sHtml += ' <div class="graphwiz-src-select">\n' \ ' <input type="checkbox" name="%s" id="%s" value="%s:%s%s" checked class="graphwiz-src-input">\n' \ ' <label for="%s">%s</label>\n' \ ' </div>\n' \ % ( WuiMain.ksParamReportSubjectIds, WuiMain.ksParamReportSubjectIds, oCollection.sType, ':'.join([str(idStr) for idStr in oCollection.aidStrTests]), ':%u' % oCollection.idStrValue if oCollection.idStrValue else '', WuiMain.ksParamReportSubjectIds, sSampleName ) if len(oCollection.aoSeries) > 0: # # Split the series into sub-graphs as needed and produce SVGs. # aaoSeries = self._splitSeries(oCollection.aoSeries) for aoSeries in aaoSeries: # Gather the data for this graph. (Most big stuff is passed by # reference, so there shouldn't be any large memory penalty for # repacking the data here.) sYUnit = None if aoSeries[0].iUnit < len(constants.valueunit.g_asNames ) and aoSeries[0].iUnit > 0: sYUnit = constants.valueunit.g_asNames[ aoSeries[0].iUnit] oData = WuiHlpGraphDataTableEx(sXUnit='Build revision', sYUnit=sYUnit) fSeriesName = self._figureSeriesNameBits(aoSeries) for oSeries in aoSeries: sSeriesName = self._getSeriesNameFromBits( oSeries, fSeriesName) asHtmlTooltips = None if len(oSeries.aoRevInfo) == len(oSeries.aiRevisions): asHtmlTooltips = [] for i in range(len(oSeries.aoRevInfo)): sPlusMinus = '' if oSeries.acSamples[i] > 1: sPlusMinus = ' (+%s/-%s; %u samples)' \ % ( utils.formatNumber(oSeries.aiErrorBarAbove[i]), utils.formatNumber(oSeries.aiErrorBarBelow[i]), oSeries.acSamples[i]) sTooltip = '<table class=\'graphwiz-tt\'><tr><td>%s:</td><td>%s %s %s</td></tr>'\ '<tr><td>Rev:</td><td>r%s</td></tr>' \ % ( sSeriesName, utils.formatNumber(oSeries.aiValues[i]), sYUnit, sPlusMinus, oSeries.aiRevisions[i], ) oRevInfo = oSeries.aoRevInfo[i] if oRevInfo.sAuthor is not None: sMsg = oRevInfo.sMessage[:80].strip() #if sMsg.find('\n') >= 0: # sMsg = sMsg[:sMsg.find('\n')].strip(); sTooltip += '<tr><td>Author:</td><td>%s</td></tr>' \ '<tr><td>Date:</td><td>%s</td><tr>' \ '<tr><td>Message:</td><td>%s%s</td></tr>' \ % ( oRevInfo.sAuthor, self.formatTsShort(oRevInfo.tsCreated), sMsg, '...' if len(oRevInfo.sMessage) > len(sMsg) else '') sTooltip += '</table>' asHtmlTooltips.append(sTooltip) oData.addDataSeries(sSeriesName, oSeries.aiRevisions, oSeries.aiValues, asHtmlTooltips, oSeries.aiErrorBarBelow, oSeries.aiErrorBarAbove) # Render the data into a graph. oGraph = self.oGraphClass('tmgraph-%u' % (iGraph, ), oData, self._oDisp) self._configureGraph(oGraph) oGraph.setTitle( self._calcGraphName(aoSeries[0], fSeriesName, sSampleName)) sHtml += ' <div class="graphwiz-graph" id="graphwiz-graph-%u">\n' % ( iGraph, ) sHtml += oGraph.renderGraph() sHtml += '\n </div>\n' iGraph += 1 # # Emit raw tabular data if requested. # if self._dParams[WuiMain.ksParamGraphWizTabular]: sHtml += ' <div class="graphwiz-tab-div" id="graphwiz-tab-%u">\n' \ ' <table class="tmtable graphwiz-tab">\n' \ % (iCollection, ) for aoSeries in aaoSeries: if aoSeries[0].iUnit < len( constants.valueunit.g_asNames ) and aoSeries[0].iUnit > 0: sUnit = constants.valueunit.g_asNames[ aoSeries[0].iUnit] else: sUnit = str(aoSeries[0].iUnit) for iSeries, oSeries in enumerate(aoSeries): sColor = self.oGraphClass.calcSeriesColor(iSeries) sHtml += '<thead class="tmheader">\n' \ ' <tr class="graphwiz-tab graphwiz-tab-new-series-row">\n' \ ' <th colspan="5"><span style="background-color:%s;"> </span> %s</th>\n' \ ' </tr>\n' \ ' <tr class="graphwiz-tab graphwiz-tab-col-hdr-row">\n' \ ' <th>Revision</th><th>Value (%s)</th><th>Δmax</th><th>Δmin</th>' \ '<th>Samples</th>\n' \ ' </tr>\n' \ '</thead>\n' \ % ( sColor, self._getSeriesNameFromBits(oSeries, self.kfSeriesName_All & ~self.kfSeriesName_OsArchs), sUnit ) for i in range(len(oSeries.aiRevisions)): sHtml += ' <tr class="%s"><td>r%s</td><td>%s</td><td>+%s</td><td>-%s</td><td>%s</td></tr>\n' \ % ( 'tmodd' if i & 1 else 'tmeven', oSeries.aiRevisions[i], oSeries.aiValues[i], oSeries.aiErrorBarAbove[i], oSeries.aiErrorBarBelow[i], oSeries.acSamples[i]) sHtml += ' </table>\n' \ ' </div>\n' else: sHtml += '<i>No results.</i>\n' sHtml += ' </div>\n' sHtml += ' </div>\n' # # Finish the form. # if fInteractive: sHtml += sEndOfForm return sHtml
def generateReportBody(self): fInteractive = not self._fSubReport; # Quick mockup. self._sTitle = 'Graph Wizzard'; sHtml = ''; sHtml += '<h2>Incomplete code - no complaints yet, thank you!!</h2>\n'; # # Create a form for altering the data we're working with. # if fInteractive: (sTopOfForm, sEndOfForm) = self._generateInteractiveForm(); sHtml += sTopOfForm; del sTopOfForm; # # Emit the graphs. At least one per sample source. # sHtml += ' <div id="graphwiz-graphs">\n'; iGraph = 0; aoCollections = self._oModel.fetchGraphData(); for iCollection, oCollection in enumerate(aoCollections): # Name the graph and add a checkbox for removing it. sSampleName = self._calcSampleName(oCollection); sHtml += ' <div class="graphwiz-collection" id="graphwiz-source-%u">\n' % (iCollection,); if fInteractive: sHtml += ' <div class="graphwiz-src-select">\n' \ ' <input type="checkbox" name="%s" id="%s" value="%s:%s%s" checked class="graphwiz-src-input">\n' \ ' <label for="%s">%s</label>\n' \ ' </div>\n' \ % ( WuiMain.ksParamReportSubjectIds, WuiMain.ksParamReportSubjectIds, oCollection.sType, ':'.join([str(idStr) for idStr in oCollection.aidStrTests]), ':%u' % oCollection.idStrValue if oCollection.idStrValue else '', WuiMain.ksParamReportSubjectIds, sSampleName ); if len(oCollection.aoSeries) > 0: # # Split the series into sub-graphs as needed and produce SVGs. # aaoSeries = self._splitSeries(oCollection.aoSeries); for aoSeries in aaoSeries: # Gather the data for this graph. (Most big stuff is passed by # reference, so there shouldn't be any large memory penalty for # repacking the data here.) sYUnit = None; if aoSeries[0].iUnit < len(constants.valueunit.g_asNames) and aoSeries[0].iUnit > 0: sYUnit = constants.valueunit.g_asNames[aoSeries[0].iUnit]; oData = WuiHlpGraphDataTableEx(sXUnit = 'Build revision', sYUnit = sYUnit); fSeriesName = self._figureSeriesNameBits(aoSeries); for oSeries in aoSeries: sSeriesName = self._getSeriesNameFromBits(oSeries, fSeriesName); asHtmlTooltips = None; if len(oSeries.aoRevInfo) == len(oSeries.aiRevisions): asHtmlTooltips = []; for i in range(len(oSeries.aoRevInfo)): sPlusMinus = ''; if oSeries.acSamples[i] > 1: sPlusMinus = ' (+%s/-%s; %u samples)' \ % ( utils.formatNumber(oSeries.aiErrorBarAbove[i]), utils.formatNumber(oSeries.aiErrorBarBelow[i]), oSeries.acSamples[i]) sTooltip = '<table class=\'graphwiz-tt\'><tr><td>%s:</td><td>%s %s %s</td></tr>'\ '<tr><td>Rev:</td><td>r%s</td></tr>' \ % ( sSeriesName, utils.formatNumber(oSeries.aiValues[i]), sYUnit, sPlusMinus, oSeries.aiRevisions[i], ); oRevInfo = oSeries.aoRevInfo[i]; if oRevInfo.sAuthor is not None: sMsg = oRevInfo.sMessage[:80].strip(); #if sMsg.find('\n') >= 0: # sMsg = sMsg[:sMsg.find('\n')].strip(); sTooltip += '<tr><td>Author:</td><td>%s</td></tr>' \ '<tr><td>Date:</td><td>%s</td><tr>' \ '<tr><td>Message:</td><td>%s%s</td></tr>' \ % ( oRevInfo.sAuthor, self.formatTsShort(oRevInfo.tsCreated), sMsg, '...' if len(oRevInfo.sMessage) > len(sMsg) else ''); sTooltip += '</table>'; asHtmlTooltips.append(sTooltip); oData.addDataSeries(sSeriesName, oSeries.aiRevisions, oSeries.aiValues, asHtmlTooltips, oSeries.aiErrorBarBelow, oSeries.aiErrorBarAbove); # Render the data into a graph. oGraph = self.oGraphClass('tmgraph-%u' % (iGraph,), oData, self._oDisp); self._configureGraph(oGraph); oGraph.setTitle(self._calcGraphName(aoSeries[0], fSeriesName, sSampleName)); sHtml += ' <div class="graphwiz-graph" id="graphwiz-graph-%u">\n' % (iGraph,); sHtml += oGraph.renderGraph(); sHtml += '\n </div>\n'; iGraph += 1; # # Emit raw tabular data if requested. # if self._dParams[WuiMain.ksParamGraphWizTabular]: sHtml += ' <div class="graphwiz-tab-div" id="graphwiz-tab-%u">\n' \ ' <table class="tmtable graphwiz-tab">\n' \ % (iCollection, ); for aoSeries in aaoSeries: if aoSeries[0].iUnit < len(constants.valueunit.g_asNames) and aoSeries[0].iUnit > 0: sUnit = constants.valueunit.g_asNames[aoSeries[0].iUnit]; else: sUnit = str(aoSeries[0].iUnit); for iSeries, oSeries in enumerate(aoSeries): sColor = self.oGraphClass.calcSeriesColor(iSeries); sHtml += '<thead class="tmheader">\n' \ ' <tr class="graphwiz-tab graphwiz-tab-new-series-row">\n' \ ' <th colspan="5"><span style="background-color:%s;"> </span> %s</th>\n' \ ' </tr>\n' \ ' <tr class="graphwiz-tab graphwiz-tab-col-hdr-row">\n' \ ' <th>Revision</th><th>Value (%s)</th><th>Δmax</th><th>Δmin</th>' \ '<th>Samples</th>\n' \ ' </tr>\n' \ '</thead>\n' \ % ( sColor, self._getSeriesNameFromBits(oSeries, self.kfSeriesName_All & ~self.kfSeriesName_OsArchs), sUnit ); for i in range(len(oSeries.aiRevisions)): sHtml += ' <tr class="%s"><td>r%s</td><td>%s</td><td>+%s</td><td>-%s</td><td>%s</td></tr>\n' \ % ( 'tmodd' if i & 1 else 'tmeven', oSeries.aiRevisions[i], oSeries.aiValues[i], oSeries.aiErrorBarAbove[i], oSeries.aiErrorBarBelow[i], oSeries.acSamples[i]); sHtml += ' </table>\n' \ ' </div>\n'; else: sHtml += '<i>No results.</i>\n'; sHtml += ' </div>\n' sHtml += ' </div>\n'; # # Finish the form. # if fInteractive: sHtml += sEndOfForm; return sHtml;
def _recursivelyGenerateEvents(self, oTestResult, sParentName, sLineage, iRow, iFailure, oTestSet, iDepth): # pylint: disable=R0914 """ Recursively generate event table rows for the result set. oTestResult is an object of the type TestResultDataEx. """ # Hack: Replace empty outer test result name with (pretty) command line. if iRow == 1: sName = '' sDisplayName = sParentName else: sName = oTestResult.sName if sParentName == '' else '%s, %s' % ( sParentName, oTestResult.sName, ) sDisplayName = webutils.escapeElem(sName) # Format error count. sErrCnt = '' if oTestResult.cErrors > 0: sErrCnt = ' (1 error)' if oTestResult.cErrors == 1 else ' (%d errors)' % oTestResult.cErrors # Format the include in graph checkboxes. sLineage += ':%u' % (oTestResult.idStrName, ) sResultGraph = '<input type="checkbox" name="%s" value="%s%s" title="Include result in graph."/>' \ % (WuiMain.ksParamReportSubjectIds, ReportGraphModel.ksTypeResult, sLineage,) sElapsedGraph = '' if oTestResult.tsElapsed is not None: sElapsedGraph = '<input type="checkbox" name="%s" value="%s%s" title="Include elapsed time in graph."/>' \ % ( WuiMain.ksParamReportSubjectIds, ReportGraphModel.ksTypeElapsed, sLineage) if len(oTestResult.aoChildren) == 0 \ and len(oTestResult.aoValues) == 0 \ and len(oTestResult.aoMsgs) == 0 \ and len(oTestResult.aoFiles) == 0: # Leaf - single row. tsEvent = oTestResult.tsCreated if oTestResult.tsElapsed is not None: tsEvent += oTestResult.tsElapsed sHtml = ' <tr class="%s tmtbl-events-leaf tmtbl-events-lvl%s tmstatusrow-%s">\n' \ ' <td>%s</td>\n' \ ' <td>%s</td>\n' \ ' <td>%s</td>\n' \ ' <td>%s</td>\n' \ ' <td colspan="2"%s>%s%s</td>\n' \ ' <td>%s</td>\n' \ ' </tr>\n' \ % ( 'tmodd' if iRow & 1 else 'tmeven', iDepth, oTestResult.enmStatus, webutils.escapeElem(self.formatTsShort(tsEvent)), sElapsedGraph, webutils.escapeElem(self.formatIntervalShort(oTestResult.tsElapsed)) if oTestResult.tsElapsed is not None else '', sDisplayName, ' id="failure-%u"' % (iFailure,) if oTestResult.isFailure() else '', webutils.escapeElem(oTestResult.enmStatus), webutils.escapeElem(sErrCnt), sResultGraph ) iRow += 1 else: # Multiple rows. sHtml = ' <tr class="%s tmtbl-events-first tmtbl-events-lvl%s ">\n' \ ' <td>%s</td>\n' \ ' <td></td>\n' \ ' <td></td>\n' \ ' <td>%s</td>\n' \ ' <td colspan="2">%s</td>\n' \ ' <td></td>\n' \ ' </tr>\n' \ % ( 'tmodd' if iRow & 1 else 'tmeven', iDepth, webutils.escapeElem(self.formatTsShort(oTestResult.tsCreated)), ## @todo more timeline stuff later. sDisplayName, 'running' if oTestResult.tsElapsed is None else '', ) iRow += 1 # Depth. for oChild in oTestResult.aoChildren: (sChildHtml, iRow, iFailure) = self._recursivelyGenerateEvents( oChild, sName, sLineage, iRow, iFailure, oTestSet, iDepth + 1) sHtml += sChildHtml # Messages. for oMsg in oTestResult.aoMsgs: sHtml += ' <tr class="%s tmtbl-events-message tmtbl-events-lvl%s">\n' \ ' <td>%s</td>\n' \ ' <td></td>\n' \ ' <td></td>\n' \ ' <td colspan="3">%s: %s</td>\n' \ ' <td></td>\n' \ ' </tr>\n' \ % ( 'tmodd' if iRow & 1 else 'tmeven', iDepth, webutils.escapeElem(self.formatTsShort(oMsg.tsCreated)), webutils.escapeElem(oMsg.enmLevel), webutils.escapeElem(oMsg.sMsg), ) iRow += 1 # Values. for oValue in oTestResult.aoValues: sHtml += ' <tr class="%s tmtbl-events-value tmtbl-events-lvl%s">\n' \ ' <td>%s</td>\n' \ ' <td></td>\n' \ ' <td></td>\n' \ ' <td>%s</td>\n' \ ' <td class="tmtbl-events-number">%s</td>\n' \ ' <td class="tmtbl-events-unit">%s</td>\n' \ ' <td><input type="checkbox" name="%s" value="%s%s:%u" title="Include value in graph."></td>\n' \ ' </tr>\n' \ % ( 'tmodd' if iRow & 1 else 'tmeven', iDepth, webutils.escapeElem(self.formatTsShort(oValue.tsCreated)), webutils.escapeElem(oValue.sName), utils.formatNumber(oValue.lValue).replace(' ', ' '), webutils.escapeElem(oValue.sUnit), WuiMain.ksParamReportSubjectIds, ReportGraphModel.ksTypeValue, sLineage, oValue.idStrName, ) iRow += 1 # Files. for oFile in oTestResult.aoFiles: if oFile.sMime in [ 'text/plain', ]: aoLinks = [ WuiTmLink('%s (%s)' % (oFile.sFile, oFile.sKind), '', { self._oDisp.ksParamAction: self._oDisp.ksActionViewLog, self._oDisp.ksParamLogSetId: oTestSet.idTestSet, self._oDisp.ksParamLogFileId: oFile.idTestResultFile, }, sTitle=oFile.sDescription), WuiTmLink( 'View Raw', '', { self._oDisp.ksParamAction: self._oDisp.ksActionGetFile, self._oDisp.ksParamGetFileSetId: oTestSet.idTestSet, self._oDisp.ksParamGetFileId: oFile.idTestResultFile, self._oDisp.ksParamGetFileDownloadIt: False, }, sTitle=oFile.sDescription), ] else: aoLinks = [ WuiTmLink( '%s (%s)' % (oFile.sFile, oFile.sKind), '', { self._oDisp.ksParamAction: self._oDisp.ksActionGetFile, self._oDisp.ksParamGetFileSetId: oTestSet.idTestSet, self._oDisp.ksParamGetFileId: oFile.idTestResultFile, self._oDisp.ksParamGetFileDownloadIt: False, }, sTitle=oFile.sDescription), ] aoLinks.append( WuiTmLink('Download', '', { self._oDisp.ksParamAction: self._oDisp.ksActionGetFile, self._oDisp.ksParamGetFileSetId: oTestSet.idTestSet, self._oDisp.ksParamGetFileId: oFile.idTestResultFile, self._oDisp.ksParamGetFileDownloadIt: True, }, sTitle=oFile.sDescription)) sHtml += ' <tr class="%s tmtbl-events-file tmtbl-events-lvl%s">\n' \ ' <td></td>\n' \ ' <td>%s</td>\n' \ ' <td></td>\n' \ ' <td>%s</td>\n' \ ' <td></td>\n' \ ' <td></td>\n' \ ' <td></td>\n' \ ' </tr>\n' \ % ( 'tmodd' if iRow & 1 else 'tmeven', iDepth, webutils.escapeElem(self.formatTsShort(oFile.tsCreated)), '\n'.join(oLink.toHtml() for oLink in aoLinks),) iRow += 1 # Done? if oTestResult.tsElapsed is not None: sHtml += ' <tr class="%s tmtbl-events-final tmtbl-events-lvl%s tmstatusrow-%s">\n' \ ' <td>%s</td>\n' \ ' <td>%s</td>\n' \ ' <td>%s</td>\n' \ ' <td>%s</td>\n' \ ' <td colspan="2"%s>%s%s</td>\n' \ ' <td>%s</td>\n' \ ' </tr>\n' \ % ( 'tmodd' if iRow & 1 else 'tmeven', iDepth, oTestResult.enmStatus, webutils.escapeElem(self.formatTsShort(oTestResult.tsCreated + oTestResult.tsElapsed)), sElapsedGraph, webutils.escapeElem(self.formatIntervalShort(oTestResult.tsElapsed)), sDisplayName, ' id="failure-%u"' % (iFailure,) if oTestResult.isFailure() else '', webutils.escapeElem(oTestResult.enmStatus), webutils.escapeElem(sErrCnt), sResultGraph) iRow += 1 if oTestResult.isFailure(): iFailure += 1 return (sHtml, iRow, iFailure)
def _generatePage(self): """ Generates the page using _sTemplate, _sPageTitle, _aaoMenus, and _sPageBody. """ assert self._sRedirectTo is None; # # Build the replacement string dictionary. # # Provide basic auth log out for browsers that supports it. sUserAgent = self._oSrvGlue.getUserAgent(); if (sUserAgent.startswith('Mozilla/') and sUserAgent.find('Firefox') > 0) \ or False: # Log in as the logout user in the same realm, the browser forgets # the old login and the job is done. (see apache sample conf) sLogOut = ' (<a href="%s://logout:logout@%s%slogout.py">logout</a>)' \ % (self._oSrvGlue.getUrlScheme(), self._oSrvGlue.getUrlNetLoc(), self._oSrvGlue.getUrlBasePath()); elif (sUserAgent.startswith('Mozilla/') and sUserAgent.find('Safari') > 0) \ or False: # For a 401, causing the browser to forget the old login. Works # with safari as well as the two above. Since safari consider the # above method a phishing attempt and displays a warning to that # effect, which when taken seriously aborts the logout, this method # is preferable, even if it throws logon boxes in the user's face # till he/she/it hits escape, because it always works. sLogOut = ' (<a href="logout2.py">logout</a>)' elif (sUserAgent.startswith('Mozilla/') and sUserAgent.find('MSIE') > 0) \ or (sUserAgent.startswith('Mozilla/') and sUserAgent.find('Chrome') > 0) \ or False: ## There doesn't seem to be any way to make IE really log out # without using a cookie and systematically 401 accesses based on # some logout state associated with it. Not sure how secure that # can be made and we really want to avoid cookies. So, perhaps, # just avoid IE for now. :-) ## Chrome/21.0 doesn't want to log out either. sLogOut = '' else: sLogOut = '' # Prep Menus. (sTopMenuItems, sSideMenuItems) = self._generateMenus(); # The dictionary (max variable length is 28 chars (see further down)). dReplacements = { '@@PAGE_TITLE@@': self._sPageTitle, '@@LOG_OUT@@': sLogOut, '@@TESTMANAGER_VERSION@@': config.g_ksVersion, '@@TESTMANAGER_REVISION@@': config.g_ksRevision, '@@BASE_URL@@': self._oSrvGlue.getBaseUrl(), '@@TOP_MENU_ITEMS@@': sTopMenuItems, '@@SIDE_MENU_ITEMS@@': sSideMenuItems, '@@SIDE_FILTER_CONTROL@@': self._sPageFilter, '@@SIDE_MENU_FORM_ATTRS@@': '', '@@PAGE_BODY@@': self._sPageBody, '@@DEBUG@@': '', }; # Side menu form attributes. if self._dSideMenuFormAttrs: dReplacements['@@SIDE_MENU_FORM_ATTRS@@'] = ' '.join(['%s="%s"' % (sKey, webutils.escapeAttr(sValue)) for sKey, sValue in self._dSideMenuFormAttrs.items()]); # Special current user handling. if self._oCurUser is not None: dReplacements['@@USER_NAME@@'] = self._oCurUser.sUsername; else: dReplacements['@@USER_NAME@@'] = 'unauthorized user "' + self._oSrvGlue.getLoginName() + '"'; # Prep debug section. if self._sDebug == '': if config.g_kfWebUiSqlTrace or self._fDbgSqlTrace or self._fDbgSqlExplain: self._sDebug = '<h3>Processed in %s ns.</h3>\n%s\n' \ % ( utils.formatNumber(utils.timestampNano() - self._oSrvGlue.tsStart,), self._oDb.debugHtmlReport(self._oSrvGlue.tsStart)); elif config.g_kfWebUiProcessedIn: self._sDebug = '<h3>Processed in %s ns.</h3>\n' \ % ( utils.formatNumber(utils.timestampNano() - self._oSrvGlue.tsStart,), ); if config.g_kfWebUiDebugPanel: self._sDebug += self._debugRenderPanel(); if self._sDebug != '': dReplacements['@@DEBUG@@'] = u'<div id="debug"><br><br><hr/>' \ + (utils.toUnicode(self._sDebug, errors='ignore') if isinstance(self._sDebug, str) else self._sDebug) \ + u'</div>\n'; # # Load the template. # oFile = open(os.path.join(self._oSrvGlue.pathTmWebUI(), self._sTemplate)); sTmpl = oFile.read(); oFile.close(); # # Process the template, outputting each part we process. # offStart = 0; offCur = 0; while offCur < len(sTmpl): # Look for a replacement variable. offAtAt = sTmpl.find('@@', offCur); if offAtAt < 0: break; offCur = offAtAt + 2; if sTmpl[offCur] not in string.ascii_uppercase: continue; offEnd = sTmpl.find('@@', offCur, offCur+28); if offEnd <= 0: continue; offCur = offEnd; sReplacement = sTmpl[offAtAt:offEnd+2]; if sReplacement in dReplacements: # Got a match! Write out the previous chunk followed by the replacement text. if offStart < offAtAt: self._oSrvGlue.write(sTmpl[offStart:offAtAt]); self._oSrvGlue.write(dReplacements[sReplacement]); # Advance past the replacement point in the template. offCur += 2; offStart = offCur; else: assert False, 'Unknown replacement "%s" at offset %s in %s' % (sReplacement, offAtAt, self._sTemplate ); # The final chunk. if offStart < len(sTmpl): self._oSrvGlue.write(sTmpl[offStart:]); return True;
def _recursivelyGenerateEvents(self, oTestResult, sParentName, sLineage, iRow, iFailure, oTestSet, iDepth): # pylint: disable=R0914 """ Recursively generate event table rows for the result set. oTestResult is an object of the type TestResultDataEx. """ # Hack: Replace empty outer test result name with (pretty) command line. if iRow == 1: sName = ''; sDisplayName = sParentName; else: sName = oTestResult.sName if sParentName == '' else '%s, %s' % (sParentName, oTestResult.sName,); sDisplayName = webutils.escapeElem(sName); # Format error count. sErrCnt = ''; if oTestResult.cErrors > 0: sErrCnt = ' (1 error)' if oTestResult.cErrors == 1 else ' (%d errors)' % oTestResult.cErrors; # Format bits for adding or editing the failure reason. Level 0 is handled at the top of the page. sChangeReason = ''; if oTestResult.cErrors > 0 and iDepth > 0: dTmp = { self._oDisp.ksParamAction: self._oDisp.ksActionTestResultFailureAdd if oTestResult.oReason is None else self._oDisp.ksActionTestResultFailureEdit, TestResultFailureData.ksParam_idTestResult: oTestResult.idTestResult, }; sChangeReason = ' <a href="?%s" class="tmtbl-edit-reason" onclick="addRedirectToAnchorHref(this)">%s</a> ' \ % ( webutils.encodeUrlParams(dTmp), WuiContentBase.ksShortEditLinkHtml ); # Format the include in graph checkboxes. sLineage += ':%u' % (oTestResult.idStrName,); sResultGraph = '<input type="checkbox" name="%s" value="%s%s" title="Include result in graph."/>' \ % (WuiMain.ksParamReportSubjectIds, ReportGraphModel.ksTypeResult, sLineage,); sElapsedGraph = ''; if oTestResult.tsElapsed is not None: sElapsedGraph = '<input type="checkbox" name="%s" value="%s%s" title="Include elapsed time in graph."/>' \ % ( WuiMain.ksParamReportSubjectIds, ReportGraphModel.ksTypeElapsed, sLineage); if len(oTestResult.aoChildren) == 0 \ and len(oTestResult.aoValues) + len(oTestResult.aoMsgs) + len(oTestResult.aoFiles) == 0: # Leaf - single row. tsEvent = oTestResult.tsCreated; if oTestResult.tsElapsed is not None: tsEvent += oTestResult.tsElapsed; sHtml = ' <tr class="%s tmtbl-events-leaf tmtbl-events-lvl%s tmstatusrow-%s" id="S%u">\n' \ ' <td id="E%u">%s</td>\n' \ ' <td>%s</td>\n' \ ' <td>%s</td>\n' \ ' <td>%s</td>\n' \ ' <td colspan="2"%s>%s%s%s</td>\n' \ ' <td>%s</td>\n' \ ' </tr>\n' \ % ( 'tmodd' if iRow & 1 else 'tmeven', iDepth, oTestResult.enmStatus, oTestResult.idTestResult, oTestResult.idTestResult, self._formatEventTimestampHtml(tsEvent, oTestResult.tsCreated, oTestResult.idTestResult, oTestSet), sElapsedGraph, webutils.escapeElem(self.formatIntervalShort(oTestResult.tsElapsed)) if oTestResult.tsElapsed is not None else '', sDisplayName, ' id="failure-%u"' % (iFailure,) if oTestResult.isFailure() else '', webutils.escapeElem(oTestResult.enmStatus), webutils.escapeElem(sErrCnt), sChangeReason if oTestResult.oReason is None else '', sResultGraph ); iRow += 1; else: # Multiple rows. sHtml = ' <tr class="%s tmtbl-events-first tmtbl-events-lvl%s ">\n' \ ' <td>%s</td>\n' \ ' <td></td>\n' \ ' <td></td>\n' \ ' <td>%s</td>\n' \ ' <td colspan="2">%s</td>\n' \ ' <td></td>\n' \ ' </tr>\n' \ % ( 'tmodd' if iRow & 1 else 'tmeven', iDepth, self._formatEventTimestampHtml(oTestResult.tsCreated, oTestResult.tsCreated, oTestResult.idTestResult, oTestSet), sDisplayName, 'running' if oTestResult.tsElapsed is None else '', ); iRow += 1; # Depth. Check if our error count is just reflecting the one of our children. cErrorsBelow = 0; for oChild in oTestResult.aoChildren: (sChildHtml, iRow, iFailure) = self._recursivelyGenerateEvents(oChild, sName, sLineage, iRow, iFailure, oTestSet, iDepth + 1); sHtml += sChildHtml; cErrorsBelow += oChild.cErrors; # Messages. for oMsg in oTestResult.aoMsgs: sHtml += ' <tr class="%s tmtbl-events-message tmtbl-events-lvl%s">\n' \ ' <td>%s</td>\n' \ ' <td></td>\n' \ ' <td></td>\n' \ ' <td colspan="3">%s: %s</td>\n' \ ' <td></td>\n' \ ' </tr>\n' \ % ( 'tmodd' if iRow & 1 else 'tmeven', iDepth, self._formatEventTimestampHtml(oMsg.tsCreated, oMsg.tsCreated, oMsg.idTestResultMsg, oTestSet), webutils.escapeElem(oMsg.enmLevel), webutils.escapeElem(oMsg.sMsg), ); iRow += 1; # Values. for oValue in oTestResult.aoValues: sHtml += ' <tr class="%s tmtbl-events-value tmtbl-events-lvl%s">\n' \ ' <td>%s</td>\n' \ ' <td></td>\n' \ ' <td></td>\n' \ ' <td>%s</td>\n' \ ' <td class="tmtbl-events-number">%s</td>\n' \ ' <td class="tmtbl-events-unit">%s</td>\n' \ ' <td><input type="checkbox" name="%s" value="%s%s:%u" title="Include value in graph."></td>\n' \ ' </tr>\n' \ % ( 'tmodd' if iRow & 1 else 'tmeven', iDepth, self._formatEventTimestampHtml(oValue.tsCreated, oValue.tsCreated, oValue.idTestResultValue, oTestSet), webutils.escapeElem(oValue.sName), utils.formatNumber(oValue.lValue).replace(' ', ' '), webutils.escapeElem(oValue.sUnit), WuiMain.ksParamReportSubjectIds, ReportGraphModel.ksTypeValue, sLineage, oValue.idStrName, ); iRow += 1; # Files. for oFile in oTestResult.aoFiles: if oFile.sMime in [ 'text/plain', ]: aoLinks = [ WuiTmLink('%s (%s)' % (oFile.sFile, oFile.sKind), '', { self._oDisp.ksParamAction: self._oDisp.ksActionViewLog, self._oDisp.ksParamLogSetId: oTestSet.idTestSet, self._oDisp.ksParamLogFileId: oFile.idTestResultFile, }, sTitle = oFile.sDescription), WuiTmLink('View Raw', '', { self._oDisp.ksParamAction: self._oDisp.ksActionGetFile, self._oDisp.ksParamGetFileSetId: oTestSet.idTestSet, self._oDisp.ksParamGetFileId: oFile.idTestResultFile, self._oDisp.ksParamGetFileDownloadIt: False, }, sTitle = oFile.sDescription), ] else: aoLinks = [ WuiTmLink('%s (%s)' % (oFile.sFile, oFile.sKind), '', { self._oDisp.ksParamAction: self._oDisp.ksActionGetFile, self._oDisp.ksParamGetFileSetId: oTestSet.idTestSet, self._oDisp.ksParamGetFileId: oFile.idTestResultFile, self._oDisp.ksParamGetFileDownloadIt: False, }, sTitle = oFile.sDescription), ] aoLinks.append(WuiTmLink('Download', '', { self._oDisp.ksParamAction: self._oDisp.ksActionGetFile, self._oDisp.ksParamGetFileSetId: oTestSet.idTestSet, self._oDisp.ksParamGetFileId: oFile.idTestResultFile, self._oDisp.ksParamGetFileDownloadIt: True, }, sTitle = oFile.sDescription)); sHtml += ' <tr class="%s tmtbl-events-file tmtbl-events-lvl%s">\n' \ ' <td>%s</td>\n' \ ' <td></td>\n' \ ' <td></td>\n' \ ' <td>%s</td>\n' \ ' <td></td>\n' \ ' <td></td>\n' \ ' <td></td>\n' \ ' </tr>\n' \ % ( 'tmodd' if iRow & 1 else 'tmeven', iDepth, self._formatEventTimestampHtml(oFile.tsCreated, oFile.tsCreated, oFile.idTestResultFile, oTestSet), '\n'.join(oLink.toHtml() for oLink in aoLinks),); iRow += 1; # Done? if oTestResult.tsElapsed is not None: tsEvent = oTestResult.tsCreated + oTestResult.tsElapsed; sHtml += ' <tr class="%s tmtbl-events-final tmtbl-events-lvl%s tmstatusrow-%s" id="E%d">\n' \ ' <td>%s</td>\n' \ ' <td>%s</td>\n' \ ' <td>%s</td>\n' \ ' <td>%s</td>\n' \ ' <td colspan="2"%s>%s%s%s</td>\n' \ ' <td>%s</td>\n' \ ' </tr>\n' \ % ( 'tmodd' if iRow & 1 else 'tmeven', iDepth, oTestResult.enmStatus, oTestResult.idTestResult, self._formatEventTimestampHtml(tsEvent, tsEvent, oTestResult.idTestResult, oTestSet), sElapsedGraph, webutils.escapeElem(self.formatIntervalShort(oTestResult.tsElapsed)), sDisplayName, ' id="failure-%u"' % (iFailure,) if oTestResult.isFailure() else '', webutils.escapeElem(oTestResult.enmStatus), webutils.escapeElem(sErrCnt), sChangeReason if cErrorsBelow < oTestResult.cErrors and oTestResult.oReason is None else '', sResultGraph); iRow += 1; # Failure reason. if oTestResult.oReason is not None: sReasonText = '%s / %s' % ( oTestResult.oReason.oFailureReason.oCategory.sShort, oTestResult.oReason.oFailureReason.sShort, ); sCommentHtml = ''; if oTestResult.oReason.sComment is not None and len(oTestResult.oReason.sComment.strip()) > 0: sCommentHtml = '<br>' + webutils.escapeElem(oTestResult.oReason.sComment.strip()); sCommentHtml = sCommentHtml.replace('\n', '<br>'); sDetailedReason = ' <a href="?%s" class="tmtbl-show-reason">%s</a>' \ % ( webutils.encodeUrlParams({ self._oDisp.ksParamAction: self._oDisp.ksActionTestResultFailureDetails, TestResultFailureData.ksParam_idTestResult: oTestResult.idTestResult,}), WuiContentBase.ksShortDetailsLinkHtml,); sHtml += ' <tr class="%s tmtbl-events-reason tmtbl-events-lvl%s">\n' \ ' <td>%s</td>\n' \ ' <td colspan="2">%s</td>\n' \ ' <td colspan="3">%s%s%s%s</td>\n' \ ' <td>%s</td>\n' \ ' </tr>\n' \ % ( 'tmodd' if iRow & 1 else 'tmeven', iDepth, webutils.escapeElem(self.formatTsShort(oTestResult.oReason.tsEffective)), oTestResult.oReason.oAuthor.sUsername, webutils.escapeElem(sReasonText), sDetailedReason, sChangeReason, sCommentHtml, 'todo'); iRow += 1; if oTestResult.isFailure(): iFailure += 1; return (sHtml, iRow, iFailure);
def _generatePage(self): """ Generates the page using _sTemplate, _sPageTitle, _aaoMenus, and _sPageBody. """ assert self._sRedirectTo is None # Load the template. oFile = open( os.path.join(self._oSrvGlue.pathTmWebUI(), self._sTemplate)) sTmpl = oFile.read() oFile.close() # Do replacements. sTmpl = sTmpl.replace('@@PAGE_TITLE@@', self._sPageTitle) sTmpl = sTmpl.replace('@@PAGE_BODY@@', self._sPageBody) if self._oCurUser is not None: sTmpl = sTmpl.replace('@@USER_NAME@@', self._oCurUser.sUsername) else: sTmpl = sTmpl.replace( '@@USER_NAME@@', 'unauthorized user "' + self._oSrvGlue.getLoginName() + '"') sTmpl = sTmpl.replace('@@TESTMANAGER_VERSION@@', config.g_ksVersion) sTmpl = sTmpl.replace('@@TESTMANAGER_REVISION@@', config.g_ksRevision) sTmpl = sTmpl.replace('@@BASE_URL@@', self._oSrvGlue.getBaseUrl()) (sTopMenuItems, sSideMenuItems) = self._generateMenus() sTmpl = sTmpl.replace('@@TOP_MENU_ITEMS@@', sTopMenuItems) sTmpl = sTmpl.replace('@@SIDE_MENU_ITEMS@@', sSideMenuItems) # Provide basic auth log out for browsers that supports it. sUserAgent = self._oSrvGlue.getUserAgent() if (sUserAgent.startswith('Mozilla/') and sUserAgent.find('Firefox') > 0) \ or False: # Log in as the logout user in the same realm, the browser forgets # the old login and the job is done. (see apache sample conf) sLogOut = ' (<a href="%s://logout:logout@%s%slogout.py">logout</a>)' \ % (self._oSrvGlue.getUrlScheme(), self._oSrvGlue.getUrlNetLoc(), self._oSrvGlue.getUrlBasePath()) elif (sUserAgent.startswith('Mozilla/') and sUserAgent.find('Safari') > 0) \ or False: # For a 401, causing the browser to forget the old login. Works # with safari as well as the two above. Since safari consider the # above method a phishing attempt and displays a warning to that # effect, which when taken seriously aborts the logout, this method # is preferable, even if it throws logon boxes in the user's face # till he/she/it hits escape, because it always works. sLogOut = ' (<a href="logout2.py">logout</a>)' elif (sUserAgent.startswith('Mozilla/') and sUserAgent.find('MSIE') > 0) \ or (sUserAgent.startswith('Mozilla/') and sUserAgent.find('Chrome') > 0) \ or False: ## There doesn't seem to be any way to make IE really log out # without using a cookie and systematically 401 accesses based on # some logout state associated with it. Not sure how secure that # can be made and we really want to avoid cookies. So, perhaps, # just avoid IE for now. :-) ## Chrome/21.0 doesn't want to log out either. sLogOut = '' else: sLogOut = '' sTmpl = sTmpl.replace('@@LOG_OUT@@', sLogOut) # Debug section. if self._sDebug == '': if config.g_kfWebUiSqlTrace or self._fDbgSqlTrace or self._fDbgSqlExplain: self._sDebug = '<h3>Processed in %s ns.</h3>\n%s\n' \ % ( utils.formatNumber(utils.timestampNano() - self._oSrvGlue.tsStart,), self._oDb.debugHtmlReport(self._oSrvGlue.tsStart)) elif config.g_kfWebUiProcessedIn: self._sDebug = '<h3>Processed in %s ns.</h3>\n' \ % ( utils.formatNumber(utils.timestampNano() - self._oSrvGlue.tsStart,), ) if config.g_kfWebUiDebugPanel: self._sDebug += self._debugRenderPanel() if self._sDebug != '': sTmpl = sTmpl.replace('@@DEBUG@@', '<div id="debug"><br><br><hr/>' + \ unicode(self._sDebug, errors='ignore') if isinstance(self._sDebug, str) else self._sDebug + '</div>') else: sTmpl = sTmpl.replace('@@DEBUG@@', '') # Output the result. self._oSrvGlue.write(sTmpl) return True
def _generatePage(self): """ Generates the page using _sTemplate, _sPageTitle, _aaoMenus, and _sPageBody. """ assert self._sRedirectTo is None; # # Build the replacement string dictionary. # # Provide basic auth log out for browsers that supports it. sUserAgent = self._oSrvGlue.getUserAgent(); if (sUserAgent.startswith('Mozilla/') and sUserAgent.find('Firefox') > 0) \ or False: # Log in as the logout user in the same realm, the browser forgets # the old login and the job is done. (see apache sample conf) sLogOut = ' (<a href="%s://logout:logout@%s%slogout.py">logout</a>)' \ % (self._oSrvGlue.getUrlScheme(), self._oSrvGlue.getUrlNetLoc(), self._oSrvGlue.getUrlBasePath()); elif (sUserAgent.startswith('Mozilla/') and sUserAgent.find('Safari') > 0) \ or False: # For a 401, causing the browser to forget the old login. Works # with safari as well as the two above. Since safari consider the # above method a phishing attempt and displays a warning to that # effect, which when taken seriously aborts the logout, this method # is preferable, even if it throws logon boxes in the user's face # till he/she/it hits escape, because it always works. sLogOut = ' (<a href="logout2.py">logout</a>)' elif (sUserAgent.startswith('Mozilla/') and sUserAgent.find('MSIE') > 0) \ or (sUserAgent.startswith('Mozilla/') and sUserAgent.find('Chrome') > 0) \ or False: ## There doesn't seem to be any way to make IE really log out # without using a cookie and systematically 401 accesses based on # some logout state associated with it. Not sure how secure that # can be made and we really want to avoid cookies. So, perhaps, # just avoid IE for now. :-) ## Chrome/21.0 doesn't want to log out either. sLogOut = '' else: sLogOut = '' # Prep Menus. (sTopMenuItems, sSideMenuItems) = self._generateMenus(); # The dictionary (max variable length is 28 chars (see further down)). dReplacements = { '@@PAGE_TITLE@@': self._sPageTitle, '@@LOG_OUT@@': sLogOut, '@@TESTMANAGER_VERSION@@': config.g_ksVersion, '@@TESTMANAGER_REVISION@@': config.g_ksRevision, '@@BASE_URL@@': self._oSrvGlue.getBaseUrl(), '@@TOP_MENU_ITEMS@@': sTopMenuItems, '@@SIDE_MENU_ITEMS@@': sSideMenuItems, '@@SIDE_FILTER_CONTROL@@': self._sPageFilter, '@@PAGE_BODY@@': self._sPageBody, '@@DEBUG@@': '', }; # Special current user handling. if self._oCurUser is not None: dReplacements['@@USER_NAME@@'] = self._oCurUser.sUsername; else: dReplacements['@@USER_NAME@@'] = 'unauthorized user "' + self._oSrvGlue.getLoginName() + '"'; # Prep debug section. if self._sDebug == '': if config.g_kfWebUiSqlTrace or self._fDbgSqlTrace or self._fDbgSqlExplain: self._sDebug = '<h3>Processed in %s ns.</h3>\n%s\n' \ % ( utils.formatNumber(utils.timestampNano() - self._oSrvGlue.tsStart,), self._oDb.debugHtmlReport(self._oSrvGlue.tsStart)); elif config.g_kfWebUiProcessedIn: self._sDebug = '<h3>Processed in %s ns.</h3>\n' \ % ( utils.formatNumber(utils.timestampNano() - self._oSrvGlue.tsStart,), ); if config.g_kfWebUiDebugPanel: self._sDebug += self._debugRenderPanel(); if self._sDebug != '': dReplacements['@@DEBUG@@'] = '<div id="debug"><br><br><hr/>' + \ unicode(self._sDebug, errors='ignore') if isinstance(self._sDebug, str) else self._sDebug + '</div>'; # # Load the template. # oFile = open(os.path.join(self._oSrvGlue.pathTmWebUI(), self._sTemplate)); sTmpl = oFile.read(); oFile.close(); # # Process the template, outputting each part we process. # offStart = 0; offCur = 0; while offCur < len(sTmpl): # Look for a replacement variable. offAtAt = sTmpl.find('@@', offCur); if offAtAt < 0: break; offCur = offAtAt + 2; if sTmpl[offCur] not in string.ascii_uppercase: continue; offEnd = sTmpl.find('@@', offCur, offCur+28); if offEnd <= 0: continue; offCur = offEnd; sReplacement = sTmpl[offAtAt:offEnd+2]; if sReplacement in dReplacements: # Got a match! Write out the previous chunk followed by the replacement text. if offStart < offAtAt: self._oSrvGlue.write(sTmpl[offStart:offAtAt]); self._oSrvGlue.write(dReplacements[sReplacement]); # Advance past the replacement point in the template. offCur += 2; offStart = offCur; else: assert False, 'Unknown replacement "%s" at offset %s in %s' % (sReplacement, offAtAt, self._sTemplate ); # The final chunk. if offStart < offCur: self._oSrvGlue.write(sTmpl[offStart:]); return True;
def _generatePage(self): """ Generates the page using _sTemplate, _sPageTitle, _aaoMenus, and _sPageBody. """ assert self._sRedirectTo is None; # Load the template. oFile = open(os.path.join(self._oSrvGlue.pathTmWebUI(), self._sTemplate)); sTmpl = oFile.read(); oFile.close(); # Do replacements. sTmpl = sTmpl.replace('@@PAGE_TITLE@@', self._sPageTitle); sTmpl = sTmpl.replace('@@PAGE_BODY@@', self._sPageBody); if self._oCurUser is not None: sTmpl = sTmpl.replace('@@USER_NAME@@', self._oCurUser.sUsername); else: sTmpl = sTmpl.replace('@@USER_NAME@@', 'unauthorized user "' + self._oSrvGlue.getLoginName() + '"'); sTmpl = sTmpl.replace('@@TESTMANAGER_VERSION@@', config.g_ksVersion); sTmpl = sTmpl.replace('@@TESTMANAGER_REVISION@@', config.g_ksRevision); sTmpl = sTmpl.replace('@@BASE_URL@@', self._oSrvGlue.getBaseUrl()); (sTopMenuItems, sSideMenuItems) = self._generateMenus(); sTmpl = sTmpl.replace('@@TOP_MENU_ITEMS@@', sTopMenuItems); sTmpl = sTmpl.replace('@@SIDE_MENU_ITEMS@@', sSideMenuItems); # Provide basic auth log out for browsers that supports it. sUserAgent = self._oSrvGlue.getUserAgent(); if (sUserAgent.startswith('Mozilla/') and sUserAgent.find('Firefox') > 0) \ or False: # Log in as the logout user in the same realm, the browser forgets # the old login and the job is done. (see apache sample conf) sLogOut = ' (<a href="%s://logout:logout@%s%slogout.py">logout</a>)' \ % (self._oSrvGlue.getUrlScheme(), self._oSrvGlue.getUrlNetLoc(), self._oSrvGlue.getUrlBasePath()); elif (sUserAgent.startswith('Mozilla/') and sUserAgent.find('Safari') > 0) \ or False: # For a 401, causing the browser to forget the old login. Works # with safari as well as the two above. Since safari consider the # above method a phishing attempt and displays a warning to that # effect, which when taken seriously aborts the logout, this method # is preferable, even if it throws logon boxes in the user's face # till he/she/it hits escape, because it always works. sLogOut = ' (<a href="logout2.py">logout</a>)' elif (sUserAgent.startswith('Mozilla/') and sUserAgent.find('MSIE') > 0) \ or (sUserAgent.startswith('Mozilla/') and sUserAgent.find('Chrome') > 0) \ or False: ## There doesn't seem to be any way to make IE really log out # without using a cookie and systematically 401 accesses based on # some logout state associated with it. Not sure how secure that # can be made and we really want to avoid cookies. So, perhaps, # just avoid IE for now. :-) ## Chrome/21.0 doesn't want to log out either. sLogOut = '' else: sLogOut = '' sTmpl = sTmpl.replace('@@LOG_OUT@@', sLogOut) # Debug section. if self._sDebug == '': if config.g_kfWebUiSqlTrace or self._fDbgSqlTrace or self._fDbgSqlExplain: self._sDebug = '<h3>Processed in %s ns.</h3>\n%s\n' \ % ( utils.formatNumber(utils.timestampNano() - self._oSrvGlue.tsStart,), self._oDb.debugHtmlReport(self._oSrvGlue.tsStart)); elif config.g_kfWebUiProcessedIn: self._sDebug = '<h3>Processed in %s ns.</h3>\n' \ % ( utils.formatNumber(utils.timestampNano() - self._oSrvGlue.tsStart,), ); if config.g_kfWebUiDebugPanel: self._sDebug += self._debugRenderPanel(); if self._sDebug != '': sTmpl = sTmpl.replace('@@DEBUG@@', '<div id="debug"><br><br><hr/>' + \ unicode(self._sDebug, errors='ignore') if isinstance(self._sDebug, str) else self._sDebug + '</div>'); else: sTmpl = sTmpl.replace('@@DEBUG@@', ''); # Output the result. self._oSrvGlue.write(sTmpl); return True;
def _recursivelyGenerateEvents(self, oTestResult, sParentName, sLineage, iRow, iFailure, oTestSet, iDepth): # pylint: disable=R0914 """ Recursively generate event table rows for the result set. oTestResult is an object of the type TestResultDataEx. """ # Hack: Replace empty outer test result name with (pretty) command line. if iRow == 1: sName = ''; sDisplayName = sParentName; else: sName = oTestResult.sName if sParentName == '' else '%s, %s' % (sParentName, oTestResult.sName,); sDisplayName = webutils.escapeElem(sName); # Format error count. sErrCnt = ''; if oTestResult.cErrors > 0: sErrCnt = ' (1 error)' if oTestResult.cErrors == 1 else ' (%d errors)' % oTestResult.cErrors; # Format the include in graph checkboxes. sLineage += ':%u' % (oTestResult.idStrName,); sResultGraph = '<input type="checkbox" name="%s" value="%s%s" title="Include result in graph."/>' \ % (WuiMain.ksParamReportSubjectIds, ReportGraphModel.ksTypeResult, sLineage,); sElapsedGraph = ''; if oTestResult.tsElapsed is not None: sElapsedGraph = '<input type="checkbox" name="%s" value="%s%s" title="Include elapsed time in graph."/>' \ % ( WuiMain.ksParamReportSubjectIds, ReportGraphModel.ksTypeElapsed, sLineage); if len(oTestResult.aoChildren) == 0 \ and len(oTestResult.aoValues) == 0 \ and len(oTestResult.aoMsgs) == 0 \ and len(oTestResult.aoFiles) == 0: # Leaf - single row. tsEvent = oTestResult.tsCreated; if oTestResult.tsElapsed is not None: tsEvent += oTestResult.tsElapsed; sHtml = ' <tr class="%s tmtbl-events-leaf tmtbl-events-lvl%s tmstatusrow-%s">\n' \ ' <td>%s</td>\n' \ ' <td>%s</td>\n' \ ' <td>%s</td>\n' \ ' <td>%s</td>\n' \ ' <td colspan="2"%s>%s%s</td>\n' \ ' <td>%s</td>\n' \ ' </tr>\n' \ % ( 'tmodd' if iRow & 1 else 'tmeven', iDepth, oTestResult.enmStatus, webutils.escapeElem(self.formatTsShort(tsEvent)), sElapsedGraph, webutils.escapeElem(self.formatIntervalShort(oTestResult.tsElapsed)) if oTestResult.tsElapsed is not None else '', sDisplayName, ' id="failure-%u"' % (iFailure,) if oTestResult.isFailure() else '', webutils.escapeElem(oTestResult.enmStatus), webutils.escapeElem(sErrCnt), sResultGraph ); iRow += 1; else: # Multiple rows. sHtml = ' <tr class="%s tmtbl-events-first tmtbl-events-lvl%s ">\n' \ ' <td>%s</td>\n' \ ' <td></td>\n' \ ' <td></td>\n' \ ' <td>%s</td>\n' \ ' <td colspan="2">%s</td>\n' \ ' <td></td>\n' \ ' </tr>\n' \ % ( 'tmodd' if iRow & 1 else 'tmeven', iDepth, webutils.escapeElem(self.formatTsShort(oTestResult.tsCreated)), ## @todo more timeline stuff later. sDisplayName, 'running' if oTestResult.tsElapsed is None else '', ); iRow += 1; # Depth. for oChild in oTestResult.aoChildren: (sChildHtml, iRow, iFailure) = self._recursivelyGenerateEvents(oChild, sName, sLineage, iRow, iFailure, oTestSet, iDepth + 1); sHtml += sChildHtml; # Messages. for oMsg in oTestResult.aoMsgs: sHtml += ' <tr class="%s tmtbl-events-message tmtbl-events-lvl%s">\n' \ ' <td>%s</td>\n' \ ' <td></td>\n' \ ' <td></td>\n' \ ' <td colspan="3">%s: %s</td>\n' \ ' <td></td>\n' \ ' </tr>\n' \ % ( 'tmodd' if iRow & 1 else 'tmeven', iDepth, webutils.escapeElem(self.formatTsShort(oMsg.tsCreated)), webutils.escapeElem(oMsg.enmLevel), webutils.escapeElem(oMsg.sMsg), ); iRow += 1; # Values. for oValue in oTestResult.aoValues: sHtml += ' <tr class="%s tmtbl-events-value tmtbl-events-lvl%s">\n' \ ' <td>%s</td>\n' \ ' <td></td>\n' \ ' <td></td>\n' \ ' <td>%s</td>\n' \ ' <td class="tmtbl-events-number">%s</td>\n' \ ' <td class="tmtbl-events-unit">%s</td>\n' \ ' <td><input type="checkbox" name="%s" value="%s%s:%u" title="Include value in graph."></td>\n' \ ' </tr>\n' \ % ( 'tmodd' if iRow & 1 else 'tmeven', iDepth, webutils.escapeElem(self.formatTsShort(oValue.tsCreated)), webutils.escapeElem(oValue.sName), utils.formatNumber(oValue.lValue).replace(' ', ' '), webutils.escapeElem(oValue.sUnit), WuiMain.ksParamReportSubjectIds, ReportGraphModel.ksTypeValue, sLineage, oValue.idStrName, ); iRow += 1; # Files. for oFile in oTestResult.aoFiles: if oFile.sMime in [ 'text/plain', ]: aoLinks = [ WuiTmLink('%s (%s)' % (oFile.sFile, oFile.sKind), '', { self._oDisp.ksParamAction: self._oDisp.ksActionViewLog, self._oDisp.ksParamLogSetId: oTestSet.idTestSet, self._oDisp.ksParamLogFileId: oFile.idTestResultFile, }, sTitle = oFile.sDescription), WuiTmLink('View Raw', '', { self._oDisp.ksParamAction: self._oDisp.ksActionGetFile, self._oDisp.ksParamGetFileSetId: oTestSet.idTestSet, self._oDisp.ksParamGetFileId: oFile.idTestResultFile, self._oDisp.ksParamGetFileDownloadIt: False, }, sTitle = oFile.sDescription), ] else: aoLinks = [ WuiTmLink('%s (%s)' % (oFile.sFile, oFile.sKind), '', { self._oDisp.ksParamAction: self._oDisp.ksActionGetFile, self._oDisp.ksParamGetFileSetId: oTestSet.idTestSet, self._oDisp.ksParamGetFileId: oFile.idTestResultFile, self._oDisp.ksParamGetFileDownloadIt: False, }, sTitle = oFile.sDescription), ] aoLinks.append(WuiTmLink('Download', '', { self._oDisp.ksParamAction: self._oDisp.ksActionGetFile, self._oDisp.ksParamGetFileSetId: oTestSet.idTestSet, self._oDisp.ksParamGetFileId: oFile.idTestResultFile, self._oDisp.ksParamGetFileDownloadIt: True, }, sTitle = oFile.sDescription)); sHtml += ' <tr class="%s tmtbl-events-file tmtbl-events-lvl%s">\n' \ ' <td></td>\n' \ ' <td>%s</td>\n' \ ' <td></td>\n' \ ' <td>%s</td>\n' \ ' <td></td>\n' \ ' <td></td>\n' \ ' <td></td>\n' \ ' </tr>\n' \ % ( 'tmodd' if iRow & 1 else 'tmeven', iDepth, webutils.escapeElem(self.formatTsShort(oFile.tsCreated)), '\n'.join(oLink.toHtml() for oLink in aoLinks),); iRow += 1; # Done? if oTestResult.tsElapsed is not None: sHtml += ' <tr class="%s tmtbl-events-final tmtbl-events-lvl%s tmstatusrow-%s">\n' \ ' <td>%s</td>\n' \ ' <td>%s</td>\n' \ ' <td>%s</td>\n' \ ' <td>%s</td>\n' \ ' <td colspan="2"%s>%s%s</td>\n' \ ' <td>%s</td>\n' \ ' </tr>\n' \ % ( 'tmodd' if iRow & 1 else 'tmeven', iDepth, oTestResult.enmStatus, webutils.escapeElem(self.formatTsShort(oTestResult.tsCreated + oTestResult.tsElapsed)), sElapsedGraph, webutils.escapeElem(self.formatIntervalShort(oTestResult.tsElapsed)), sDisplayName, ' id="failure-%u"' % (iFailure,) if oTestResult.isFailure() else '', webutils.escapeElem(oTestResult.enmStatus), webutils.escapeElem(sErrCnt), sResultGraph); iRow += 1; if oTestResult.isFailure(): iFailure += 1; return (sHtml, iRow, iFailure);
def F(x): return 2 * x + 3 * log(x + 0.5) # return sin(x) print("===================TABLE=====================") # Xs = [0, 0.2, 0.4, 0.6, 0.8, 1] # Ys = [0, 0.1987, 0.3894, 0.5646, 0.7174, 0.8415] current = X0 print(' X | Y ') Xs = [] Ys = [] while current < XN: print(formatNumber(current), formatNumber(F(current))) Xs.append(current) Ys.append(F(current)) current += H N = n1 print("===================LAGRANZ {N} POWER=====================".format(N=N)) for INPUT_VALUE in INPUT_VALUES: print( "===========расчет для {value}============".format(value=INPUT_VALUE)) result = Ln(INPUT_VALUE, N, Xs, Ys) actualResult = F(INPUT_VALUE) print("апроксимированный результат: {result}".format(result=result)) print("реальный резльутат: {result}".format(result=actualResult)) print("реальная ошибка: {result}".format(result=abs(actualResult - result)))