Пример #1
0
    def GenerateOverviewHTML(self):

        ModuleData = self.FetchData()
        HtmlParser = self.TestResultEnvironmentObject.HtmlParser

        HTMLTemplate = self.TestResultEnvironmentObject.ProductionOverviewHTMLTemplate
        FinalHTML = HTMLTemplate

        # Stylesheet
        StylesheetHTMLTemplate = HtmlParser.getSubpart(
            HTMLTemplate, '###HEAD_STYLESHEET_TEMPLATE###')
        StylesheetHTML = HtmlParser.substituteMarkerArray(
            StylesheetHTMLTemplate, {
                '###STYLESHEET###':
                self.TestResultEnvironmentObject.MainStylesheet +
                self.TestResultEnvironmentObject.ProductionOverviewStylesheet,
            })
        FinalHTML = HtmlParser.substituteSubpart(FinalHTML,
                                                 '###HEAD_STYLESHEETS###',
                                                 StylesheetHTML)
        FinalHTML = HtmlParser.substituteSubpart(
            FinalHTML, '###HEAD_STYLESHEET_TEMPLATE###', '')
        FinalHTML = HtmlParser.substituteMarkerArray(
            FinalHTML, {
                '###PAGETITLE###': self.Attributes['Title'],
            })

        ContentHTML = ''

        ### load modules
        for SubPage in self.SubPages:
            SubModule = SubPage['Module']
            importdir = self.ImportPath + '.' + SubModule
            try:
                f = __import__(
                    importdir + '.' + SubModule,
                    fromlist=[importdir + '.' + 'ProductionOverview'])
            except ImportError as inst:
                f = __import__(importdir + '.ProductionOverview',
                               fromlist=[''])
            pass
            SubPage['ProductionOverview'] = f

        ### run submodules
        for SubPage in self.SubPages:

            InitialAttributes = {}
            if SubPage.has_key('InitialAttributes'):
                InitialAttributes = SubPage['InitialAttributes']

            InitialAttributes['BasePath'] = self.Attributes['BasePath']

            ### instanciate submodule
            SubPageClass = SubPage['ProductionOverview'].ProductionOverview(
                TestResultEnvironmentObject=self.TestResultEnvironmentObject,
                InitialAttributes=InitialAttributes,
                ParentObject=self)

            ### generate html overview of submodule
            #try:
            SubPageContentHTML = SubPageClass.GenerateOverview()
            #except:
            #    SubPageContentHTML = "sub page module not found or 'SubPage['ProductionOverview'].GenerateOverview()' failed"

            ### add to this module html page
            ContentHTML += SubPageContentHTML

        FinalHTML = HtmlParser.substituteSubpart(FinalHTML,
                                                 '###PRODUCTIONOVERVIEW###',
                                                 ContentHTML)

        # Clickpath
        Levels = self.Attributes['BasePath'][:].split('/')

        ClickPathEntries = []
        ClickPathEntryTemplate = HtmlParser.getSubpart(
            HTMLTemplate, '###CLICKPATH_ENTRY###')
        LevelPath = ''
        i = 0
        tmpTestResultObject = self
        for Level in Levels[2:]:
            LevelPath = '../' * i
            ClickPathEntries.append(
                HtmlParser.substituteMarkerArray(
                    ClickPathEntryTemplate, {
                        '###URL###':
                        HtmlParser.MaskHTML(LevelPath + self.HTMLFileName),
                        '###LABEL###':
                        HtmlParser.MaskHTML(
                            tmpTestResultObject.Attributes['Title'])
                    }))
            try:
                if self.ParentObject:
                    tmpTestResultObject = tmpTestResultObject.ParentObject
            except:
                pass

            i += 1

        OverviewHTMLLink = '../../ProductionOverview/ProductionOverview.html'
        ClickPathEntries.append(
            HtmlParser.substituteMarkerArray(
                ClickPathEntryTemplate, {
                    '###URL###': HtmlParser.MaskHTML(OverviewHTMLLink),
                    '###LABEL###': 'Production Overview'
                }))
        ClickPathEntries.reverse()
        CSSClasses = ''

        FinalHTML = HtmlParser.substituteSubpartArray(
            FinalHTML, {
                '###CLICKPATH_ENTRY###': ''.join(ClickPathEntries),
            })

        return FinalHTML
Пример #2
0
    def TableData(self, ModuleID=None, TestDate=None, GlobalOverviewList=True):
        HtmlParser = self.TestResultEnvironmentObject.HtmlParser

        if self.TestResultEnvironmentObject.Configuration['Database'][
                'UseGlobal']:
            Rows = {}
        else:
            SortMode = self.TestResultEnvironmentObject.Configuration[
                'QualificationOverviewSort'].strip().split(',')
            SortClause = ''
            if len(SortMode) > 0:
                for i in range(0, len(SortMode)):
                    parts = SortMode[i].strip().split(' ')
                    if len(parts) > 0:
                        if parts[0] in ['ModuleID', 'TestType', 'TestDate']:
                            SortClause = SortClause + parts[0]
                        if len(parts) > 1:
                            if parts[1].upper() in ['ASC', 'DESC']:
                                SortClause = SortClause + ' ' + parts[1]
                        SortClause = SortClause + ','
                SortClause = SortClause.strip(',')
            else:
                SortClause = 'ModuleID ASC,TestType ASC,TestDate ASC'

            AdditionalWhere = ''
            if ModuleID:
                AdditionalWhere += ' AND ModuleID=:ModuleID '
            if TestDate:
                AdditionalWhere += ' AND TestDate=:TestDate '
            self.TestResultEnvironmentObject.LocalDBConnectionCursor.execute(
                'SELECT * FROM ModuleTestResults ' + 'WHERE 1=1 ' +
                AdditionalWhere + 'ORDER BY ' + SortClause, {
                    'ModuleID': ModuleID,
                    'TestDate': TestDate
                })
            Rows = self.TestResultEnvironmentObject.LocalDBConnectionCursor.fetchall(
            )

        TableHTMLTemplate = HtmlParser.getSubpart(
            self.TestResultEnvironmentObject.OverviewHTMLTemplate,
            '###OVERVIEWTABLE###')
        TableBodyHTMLTemplate = HtmlParser.getSubpart(TableHTMLTemplate,
                                                      '###BODY###')
        CellLinkHTMLTemplate = HtmlParser.getSubpart(TableBodyHTMLTemplate,
                                                     '###LINK###')

        ShowTestCenter = self.TestResultEnvironmentObject.Configuration[
            'SystemConfiguration']['show_test_center']

        TableColumns = [
            {
                'Label': 'Module ID',
                'DBColumnName': 'ModuleID',
                'InGlobalOverviewList': True
            },
            {
                'Label': 'Test Date',
                'DBColumnName': 'TestDate',
                'InGlobalOverviewList': True
            },
            {
                'Label': 'Analysis',
                'DBColumnName': 'KeyValueDictPairs/AnalysisDate',
                'InGlobalOverviewList': True
            },
            {
                'Label': 'TestCenter',
                'DBColumnName': 'KeyValueDictPairs/TestCenter',
                'InGlobalOverviewList': ShowTestCenter,
                'InFullList': ShowTestCenter,
            },
            {
                'Label': 'Qualification Type',
                'DBColumnName': 'QualificationType',
                'InGlobalOverviewList': True,
                'InFullList': False
            },
            {
                'Label': 'Test Type',
                'DBColumnName': 'TestType',
                'InGlobalOverviewList': True
            },
            {
                'Label': 'Grade',
                'DBColumnName': 'Grade',
                'InGlobalOverviewList': True
            },
            {
                'Label': 'Pixel Defects',
                'DBColumnName': 'PixelDefects',
                'InGlobalOverviewList': True
            },
            {
                'Label': 'ROCs < 1%',
                'DBColumnName': 'ROCsLessThanOnePercent',
                'InGlobalOverviewList': True
            },
            {
                'Label': 'ROCs > 1%',
                'DBColumnName': 'ROCsMoreThanOnePercent',
                'InGlobalOverviewList': True
            },
            {
                'Label': 'ROCs > 4%',
                'DBColumnName': 'ROCsMoreThanFourPercent',
                'InGlobalOverviewList': True
            },
            {
                'Label': 'Noise',
                'DBColumnName': 'Noise',
                'InGlobalOverviewList': True
            },
            {
                'Label': 'Trimming',
                'DBColumnName': 'Trimming',
                'InGlobalOverviewList': True
            },
            {
                'Label': 'PHCalibration',
                'DBColumnName': 'PHCalibration',
                'InGlobalOverviewList': True
            },
            {
                'Label': 'I(150V)',
                'DBColumnName': 'CurrentAtVoltage150V'
            },
            {
                'Label': 'I_rec(150V)',
                'DBColumnName': 'RecalculatedVoltage'
            },
            {
                'Label': 'IV Slope',
                'DBColumnName': 'IVSlope'
            },
            {
                'Label': 'Temperature',
                'DBColumnName': 'Temperature'
            },
            {
                'Label': 'initial Current',
                'DBColumnName': 'initialCurrent',
                'InGlobalOverviewList': True,
            },
            {
                'Label': 'Comments',
                'DBColumnName': 'Comments',
                'InGlobalOverviewList': True,
            },
            {
                'Label': 'no of Cycles',
                'DBColumnName': 'nCycles',
                'InGlobalOverviewList': False,
                'InFullList': False
            },
            {
                'Label': 'CycleTempLow',
                'DBColumnName': 'CycleTempLow',
                'InGlobalOverviewList': False,
                'InFullList': False,
            },
            {
                'Label': 'CycleTempHigh',
                'DBColumnName': 'CycleTempHigh',
                'InGlobalOverviewList': False,
                'InFullList': False,
            },
        ]

        TableData = {
            'HEADER': [[]],
            'BODY': [],
            'FOOTER': [],
        }
        TableColumnList = []

        for ColumnDict in TableColumns:
            if ((not GlobalOverviewList and ColumnDict.has_key('InFullList')
                 and ColumnDict['InFullList'] == True)
                    or (not GlobalOverviewList
                        and not ColumnDict.has_key('InFullList'))
                    or (GlobalOverviewList
                        and ColumnDict.has_key('InGlobalOverviewList')
                        and ColumnDict['InGlobalOverviewList'] == True)):
                TableData['HEADER'][0].append(ColumnDict['Label'])
                TableColumnList.append(ColumnDict['DBColumnName'])

        FinalModuleRowsDict = {}
        ModuleIDList = []

        for RowTuple in Rows:
            Identificator = RowTuple['ModuleID']
            if not GlobalOverviewList:
                Identificator += '_%s' % RowTuple['TestType']
                if RowTuple['TestType'] == 'TemperatureCycle':
                    continue
            else:
                Identificator += '_%s' % RowTuple['QualificationType']
#            Identificator+='_%s'%RowTuple['TestDate']
#            print Identificator
            if not FinalModuleRowsDict.has_key(Identificator):
                FinalModuleRowsDict[Identificator] = {}
                ModuleIDList.append(Identificator)
                #                print 'added'

                ResultHTMLFileName = 'TestResult.html'
                QualificationGroupSubfolder = 'QualificationGroup'

                RowDict = FinalModuleRowsDict[Identificator]
                for Key in TableColumnList:
                    try:
                        if Key.startswith('KeyValueDictPairs/'):
                            try:
                                KeyValueDictPairsFileName = self.TestResultEnvironmentObject.GlobalOverviewPath + '/' + RowTuple[
                                    'RelativeModuleFinalResultsPath'] + '/' + QualificationGroupSubfolder + '/KeyValueDictPairs.json'
                                with open(KeyValueDictPairsFileName
                                          ) as data_file:
                                    KeyValueDictPairs = json.load(data_file)
                                RowDict[Key] = KeyValueDictPairs[Key.split('/')
                                                                 [1]]['Value']
                            except:
                                RowDict[Key] = ''
                        else:
                            RowDict[Key] = RowTuple[Key]
                    except IndexError as e:
                        print 'searched Key:  ', Key
                        print 'existing Keys: ', RowTuple.keys()
                        raise e

                if GlobalOverviewList:
                    Link = os.path.relpath(
                        self.TestResultEnvironmentObject.GlobalOverviewPath +
                        '/' + RowTuple['RelativeModuleFinalResultsPath'] +
                        '/' + QualificationGroupSubfolder + '/' +
                        ResultHTMLFileName,
                        self.TestResultEnvironmentObject.GlobalOverviewPath)
                else:
                    CurrentBasePath = self.GlobalOverviewPath + '/' + RowTuple[
                        'FulltestSubfolder']
                    # change directory one level up since we are in QualificationGroup folder and FulltestSubfolder is relative to ModuleFinalResultsPath...
                    Link = '../' + RowTuple[
                        'FulltestSubfolder'] + '/' + ResultHTMLFileName

                #Link the module ID

                RowDict['ModuleID'] = HtmlParser.substituteMarkerArray(
                    CellLinkHTMLTemplate, {
                        '###URL###': HtmlParser.MaskHTML(Link),
                        '###LABEL###': HtmlParser.MaskHTML(
                            RowTuple['ModuleID'])
                    })

                # Parse the date
                try:
                    if type(RowTuple['TestDate']) == str:
                        time = int(
                            re.match(r'\d+', RowTuple['TestDate']).group())
                    else:
                        time = RowTuple['TestDate']
                    RowDict['TestDate'] = datetime.datetime.fromtimestamp(
                        time).strftime("%Y-%m-%d %H:%M")
                except TypeError as e:
                    print e, '\nerror', type(
                        RowTuple['TestDate']), RowTuple['TestDate']
                    RowDict['TestDate'] = datetime.datetime.fromtimestamp(
                        1).strftime("%Y-%m-%d %H:%M")
                    raise e

                try:
                    time = float(RowDict['KeyValueDictPairs/AnalysisDate'])
                    RowDict[
                        'KeyValueDictPairs/AnalysisDate'] = datetime.datetime.fromtimestamp(
                            time).strftime("%Y-%m-%d %H:%M")
                except:
                    pass

                if ShowTestCenter:
                    try:
                        RowDict[
                            'KeyValueDictPairs/TestCenter'] = "<div style='text-align:center'>" + RowDict[
                                'KeyValueDictPairs/TestCenter'] + "</div>"
                    except:
                        pass

            else:
                #TestType
                FinalModuleRowsDict[Identificator][
                    'TestType'] += ' & %s' % RowTuple['TestType']
                if (FinalModuleRowsDict[Identificator]['Grade'] <
                        RowTuple['Grade']):
                    FinalModuleRowsDict[Identificator]['Grade'] = RowTuple[
                        'Grade']
                MaxCompareList = [
                    'PixelDefects', 'ROCsMoreThanOnePercent', 'Noise',
                    'Trimming', 'PHCalibration'
                ]
                for item in MaxCompareList:
                    RowValue = RowTuple[item]
                    FinalValue = FinalModuleRowsDict[Identificator][item]
                    try:
                        RowValue = int(RowValue)
                    except:
                        pass
                    try:
                        FinalValue = int(FinalValue)
                    except:
                        pass
                    FinalModuleRowsDict[Identificator][item] = max(
                        FinalValue, RowValue)
                if RowTuple['Temperature'] and FinalModuleRowsDict[
                        Identificator].has_key('Temperature'):
                    if FinalModuleRowsDict[Identificator]['Temperature']:
                        FinalModuleRowsDict[Identificator][
                            'Temperature'] += " / %s" % RowTuple['Temperature']
                    else:
                        FinalModuleRowsDict[Identificator][
                            'Temperature'] = "%s" % RowTuple['Temperature']
                if RowTuple['initialCurrent'] and FinalModuleRowsDict[
                        Identificator].has_key('initialCurrent'):
                    if FinalModuleRowsDict[Identificator]['initialCurrent']:
                        FinalModuleRowsDict[Identificator][
                            'initialCurrent'] = "%s / %s" % (
                                str(FinalModuleRowsDict[Identificator]
                                    ['initialCurrent']),
                                RowTuple['initialCurrent'])
                    else:
                        FinalModuleRowsDict[Identificator][
                            'initialCurrent'] = "%s" % RowTuple[
                                'initialCurrent']
                if RowTuple['Comments'] and FinalModuleRowsDict[
                        Identificator].has_key('Comments'):
                    if FinalModuleRowsDict[Identificator]['Comments']:
                        FinalModuleRowsDict[Identificator][
                            'Comments'] += " / %s" % RowTuple['Comments']
                    else:
                        FinalModuleRowsDict[Identificator][
                            'Comments'] = "%s" % RowTuple['Comments']
                if RowTuple['nCycles'] and FinalModuleRowsDict[
                        Identificator].has_key('nCycles'):
                    FinalModuleRowsDict[Identificator]['nCycles'] = RowTuple[
                        'nCycles']
                    FinalModuleRowsDict[Identificator][
                        'CycleTempLow'] = RowTuple['CycleTempLow']
                    FinalModuleRowsDict[Identificator][
                        'CycleTempHigh'] = RowTuple['CycleTempHigh']

        for ModuleID in ModuleIDList:
            RowDict = FinalModuleRowsDict[ModuleID]
            Row = []
            for Key in TableColumnList:
                Row.append(RowDict[Key])

            TableData['BODY'].append(Row)

        return TableData
Пример #3
0
    def TableData(self,
                  ModuleID=None,
                  TestDate=None,
                  GlobalOverviewList=True,
                  QualificationType=None):
        HtmlParser = self.TestResultEnvironmentObject.HtmlParser

        if self.TestResultEnvironmentObject.Configuration['Database'][
                'UseGlobal']:
            Rows = {}
        else:
            SortMode = self.TestResultEnvironmentObject.Configuration[
                'QualificationOverviewSort'].strip().split(',')
            SortClause = ''
            if len(SortMode) > 0:
                for i in range(0, len(SortMode)):
                    parts = SortMode[i].strip().split(' ')
                    if len(parts) > 0:
                        if parts[0] in ['ModuleID', 'TestType', 'TestDate']:
                            SortClause = SortClause + parts[0]
                        if len(parts) > 1:
                            if parts[1].upper() in ['ASC', 'DESC']:
                                SortClause = SortClause + ' ' + parts[1]
                        SortClause = SortClause + ','
                SortClause = SortClause.strip(',')
            else:
                SortClause = 'ModuleID ASC,TestType ASC,TestDate ASC'

            AdditionalWhere = ''
            if ModuleID:
                AdditionalWhere += ' AND ModuleID=:ModuleID '
            if TestDate:
                AdditionalWhere += ' AND TestDate=:TestDate '
            if QualificationType:
                AdditionalWhere += ' AND QualificationType=:QualificationType '

            self.TestResultEnvironmentObject.LocalDBConnectionCursor.execute(
                'SELECT * FROM ModuleTestResults ' + 'WHERE 1=1 ' +
                AdditionalWhere + ' '
                'ORDER BY ' + SortClause, {
                    'ModuleID': ModuleID,
                    'TestDate': TestDate,
                    'QualificationType': QualificationType,
                })
            Rows = self.TestResultEnvironmentObject.LocalDBConnectionCursor.fetchall(
            )

        TableHTMLTemplate = HtmlParser.getSubpart(
            self.TestResultEnvironmentObject.OverviewHTMLTemplate,
            '###OVERVIEWTABLE###')
        TableBodyHTMLTemplate = HtmlParser.getSubpart(TableHTMLTemplate,
                                                      '###BODY###')
        CellLinkHTMLTemplate = HtmlParser.getSubpart(TableBodyHTMLTemplate,
                                                     '###LINK###')

        ShowTestCenter = self.TestResultEnvironmentObject.Configuration[
            'SystemConfiguration']['show_test_center']

        TableColumns = [
            {
                'Label': 'Module ID',
                'DBColumnName': 'ModuleID',
                'InGlobalOverviewList': True
            },
            {
                'Label': 'Test Date',
                'DBColumnName': 'TestDate',
                'InGlobalOverviewList': True
            },
            {
                'Label': 'Analysis',
                'DBColumnName': 'KeyValueDictPairs/AnalysisDate',
                'InGlobalOverviewList': True
            },
            {
                'Label': 'TestCenter',
                'DBColumnName': 'KeyValueDictPairs/TestCenter',
                'InGlobalOverviewList': ShowTestCenter,
                'InFullList': ShowTestCenter,
            },
            {
                'Label': 'Qualification Type',
                'DBColumnName': 'QualificationType',
                'InGlobalOverviewList': True,
                'InFullList': False
            },
            {
                'Label': 'Test Type',
                'DBColumnName': 'TestType',
                'InGlobalOverviewList': True
            },
            {
                'Label': 'Grade',
                'DBColumnName': 'Grade',
                'InGlobalOverviewList': True
            },
            {
                'Label': 'Pixel Defects',
                'DBColumnName': 'PixelDefects',
                'InGlobalOverviewList': True
            },
            {
                'Label': 'ROCs < 1%',
                'DBColumnName': 'ROCsLessThanOnePercent',
                'InGlobalOverviewList': True
            },
            {
                'Label': 'ROCs > 1%',
                'DBColumnName': 'ROCsMoreThanOnePercent',
                'InGlobalOverviewList': True
            },
            {
                'Label': 'ROCs > 4%',
                'DBColumnName': 'ROCsMoreThanFourPercent',
                'InGlobalOverviewList': True
            },
            {
                'Label': 'Noise',
                'DBColumnName': 'Noise',
                'InGlobalOverviewList': True
            },
            {
                'Label': 'Trimming',
                'DBColumnName': 'Trimming',
                'InGlobalOverviewList': True
            },
            {
                'Label': 'PHCalibration',
                'DBColumnName': 'PHCalibration',
                'InGlobalOverviewList': True
            },
            {
                'Label': 'I(150V)',
                'DBColumnName': 'CurrentAtVoltage150V'
            },
            {
                'Label': 'I_rec(150V)',
                'DBColumnName': 'RecalculatedVoltage'
            },
            {
                'Label': 'IV Slope',
                'DBColumnName': 'IVSlope'
            },
            {
                'Label': 'Temperature',
                'DBColumnName': 'Temperature'
            },
            {
                'Label': 'initial Current',
                'DBColumnName': 'initialCurrent',
                'InGlobalOverviewList': True,
            },
            {
                'Label': 'Comments',
                'DBColumnName': 'Comments',
                'InGlobalOverviewList': True,
            },
            {
                'Label': 'no of Cycles',
                'DBColumnName': 'nCycles',
                'InGlobalOverviewList': False,
                'InFullList': False
            },
            {
                'Label': 'CycleTempLow',
                'DBColumnName': 'CycleTempLow',
                'InGlobalOverviewList': False,
                'InFullList': False,
            },
            {
                'Label': 'CycleTempHigh',
                'DBColumnName': 'CycleTempHigh',
                'InGlobalOverviewList': False,
                'InFullList': False,
            },
        ]

        TableData = {
            'HEADER': [[]],
            'BODY': [],
            'FOOTER': [],
        }
        TableColumnList = []

        for ColumnDict in TableColumns:
            if ((not GlobalOverviewList and ColumnDict.has_key('InFullList')
                 and ColumnDict['InFullList'] == True)
                    or (not GlobalOverviewList
                        and not ColumnDict.has_key('InFullList'))
                    or (GlobalOverviewList
                        and ColumnDict.has_key('InGlobalOverviewList')
                        and ColumnDict['InGlobalOverviewList'] == True)):
                TableData['HEADER'][0].append(ColumnDict['Label'])
                TableColumnList.append(ColumnDict['DBColumnName'])

        FinalModuleRowsDict = {}
        ModuleIDList = []

        # if old results are shown, display new results at the top
        if not GlobalOverviewList and not self.TestResultEnvironmentObject.Configuration[
                'ShowOnlyLatestTestResults']:
            Rows.sort(key=lambda x: x['TestDate'], reverse=True)

        for RowTuple in Rows:
            Identificator = RowTuple['ModuleID']
            if not GlobalOverviewList:
                Identificator += '_%s' % RowTuple['TestType']
                if not self.TestResultEnvironmentObject.Configuration[
                        'ShowOnlyLatestTestResults']:
                    Identificator += '_%s' % RowTuple['TestDate']
                if RowTuple['TestType'] == 'TemperatureCycle':
                    continue
            else:
                Identificator += '_%s' % RowTuple['QualificationType']
#            Identificator+='_%s'%RowTuple['TestDate']
            if not FinalModuleRowsDict.has_key(Identificator):
                FinalModuleRowsDict[Identificator] = {}
                ModuleIDList.append(Identificator)
                #                print 'added'

                ResultHTMLFileName = 'TestResult.html'
                QualificationGroupSubfolder = 'QualificationGroup'

                RowDict = FinalModuleRowsDict[Identificator]
                for Key in TableColumnList:
                    try:
                        if Key.startswith('KeyValueDictPairs/'):
                            try:
                                KeyValueDictPairsFileName = self.TestResultEnvironmentObject.GlobalOverviewPath + '/' + RowTuple[
                                    'RelativeModuleFinalResultsPath'] + '/' + QualificationGroupSubfolder + '/KeyValueDictPairs.json'
                                with open(KeyValueDictPairsFileName
                                          ) as data_file:
                                    KeyValueDictPairs = json.load(data_file)
                                RowDict[Key] = KeyValueDictPairs[Key.split('/')
                                                                 [1]]['Value']
                            except:
                                RowDict[Key] = ''
                        else:
                            RowDict[Key] = RowTuple[Key]
                    except IndexError as e:
                        print 'searched Key:  ', Key
                        print 'existing Keys: ', RowTuple.keys()
                        raise e

                # bump bonding
                try:
                    KeyValueDictPairsFileName = self.TestResultEnvironmentObject.GlobalOverviewPath + '/' + \
                                                RowTuple[
                                                    'RelativeModuleFinalResultsPath'] + '/' + QualificationGroupSubfolder + '/ModuleOnShellQuickTest_p17_1/Grading/KeyValueDictPairs.json'
                    with open(KeyValueDictPairsFileName) as data_file:
                        KeyValueDictPairs = json.load(data_file)
                    RowDict['ElectricalGradeNoBB'] = KeyValueDictPairs[
                        'ElectricalGradeNoBB']['Value']

                except:
                    pass

                if GlobalOverviewList:
                    # this qualification might be split to different folders. (When updating the overview page of the
                    # qualification, all other subtest, e.g. test for diferent temperatures) are linked on this)
                    # make sure now in the list of modules, the latest such qualification pages is linked
                    allSubtests = [
                        RowTuple2 for RowTuple2 in Rows
                        if (RowTuple2['ModuleID'] == RowTuple['ModuleID']
                            and RowTuple2['QualificationType'] ==
                            RowTuple['QualificationType'])
                    ]
                    allSubtests.sort(key=lambda x: x[1], reverse=True)
                    QualificationGroupSubfolder = allSubtests[0][
                        'FulltestSubfolder'] + '/../'
                    Link = os.path.relpath(
                        self.TestResultEnvironmentObject.GlobalOverviewPath +
                        '/' +
                        allSubtests[0]['RelativeModuleFinalResultsPath'] +
                        '/' + QualificationGroupSubfolder + '/' +
                        ResultHTMLFileName,
                        self.TestResultEnvironmentObject.GlobalOverviewPath)
                else:
                    # since this overview page can also contains links to results from different folders, also take
                    # RelativeModuleFinalResultsPath into account
                    Link = '../../../../' + RowTuple[
                        'RelativeModuleFinalResultsPath'] + '/' + RowTuple[
                            'FulltestSubfolder'] + '/' + ResultHTMLFileName

                #Link the module ID

                RowDict['ModuleID'] = HtmlParser.substituteMarkerArray(
                    CellLinkHTMLTemplate, {
                        '###URL###': HtmlParser.MaskHTML(Link),
                        '###LABEL###': HtmlParser.MaskHTML(
                            RowTuple['ModuleID'])
                    })

                # if old results are shown, mark them as old
                if not GlobalOverviewList and not self.TestResultEnvironmentObject.Configuration[
                        'ShowOnlyLatestTestResults']:
                    allSubtests = [
                        RowTuple2 for RowTuple2 in Rows
                        if (RowTuple2['ModuleID'] == RowTuple['ModuleID']
                            and RowTuple2['QualificationType'] ==
                            RowTuple['QualificationType']
                            and RowTuple2['TestType'] == RowTuple['TestType'])
                    ]

                    allSubtests.sort(key=lambda x: x[1], reverse=True)
                    if len(allSubtests) > 0:
                        if RowTuple['TestDate'] != allSubtests[0]['TestDate']:
                            RowDict['ModuleID'] = 'old result: ' + RowDict[
                                'ModuleID']

                # Parse the date
                try:
                    if type(RowTuple['TestDate']) == str:
                        time = int(
                            re.match(r'\d+', RowTuple['TestDate']).group())
                    else:
                        time = RowTuple['TestDate']
                    RowDict['TestDate'] = datetime.datetime.fromtimestamp(
                        time).strftime("%Y-%m-%d %H:%M")
                except TypeError as e:
                    print e, '\nerror', type(
                        RowTuple['TestDate']), RowTuple['TestDate']
                    RowDict['TestDate'] = datetime.datetime.fromtimestamp(
                        1).strftime("%Y-%m-%d %H:%M")
                    raise e

                try:
                    time = float(RowDict['KeyValueDictPairs/AnalysisDate'])
                    RowDict[
                        'KeyValueDictPairs/AnalysisDate'] = datetime.datetime.fromtimestamp(
                            time).strftime("%Y-%m-%d %H:%M")
                except:
                    pass

                if ShowTestCenter:
                    try:
                        RowDict[
                            'KeyValueDictPairs/TestCenter'] = "<div style='text-align:center'>" + RowDict[
                                'KeyValueDictPairs/TestCenter'] + "</div>"
                    except:
                        pass

            else:
                #TestType
                testTypes = [
                    x.strip() for x in FinalModuleRowsDict[Identificator]
                    ['TestType'].split('&')
                ]
                testTypes.append(RowTuple['TestType'])
                FinalModuleRowsDict[Identificator]['TestType'] = ' & '.join(
                    list(set(testTypes)))

                if (FinalModuleRowsDict[Identificator]['Grade'] <
                        RowTuple['Grade']):
                    FinalModuleRowsDict[Identificator]['Grade'] = RowTuple[
                        'Grade']
                MaxCompareList = [
                    'PixelDefects', 'Noise', 'Trimming', 'PHCalibration'
                ]
                for item in MaxCompareList:
                    RowValue = RowTuple[item]
                    FinalValue = FinalModuleRowsDict[Identificator][item]
                    try:
                        RowValue = int(RowValue)
                    except:
                        pass
                    try:
                        FinalValue = int(FinalValue)
                    except:
                        pass
                    FinalModuleRowsDict[Identificator][item] = max(
                        FinalValue, RowValue)

                # ROCsMoreThanFourPercent

                if ((RowTuple['ROCsMoreThanFourPercent'] >
                     FinalModuleRowsDict[Identificator]
                     ['ROCsMoreThanFourPercent'])
                        or (RowTuple['ROCsMoreThanFourPercent']
                            == FinalModuleRowsDict[Identificator]
                            ['ROCsMoreThanFourPercent']
                            and RowTuple['ROCsMoreThanOnePercent'] >
                            FinalModuleRowsDict[Identificator]
                            ['ROCsMoreThanOnePercent'])):
                    FinalModuleRowsDict[Identificator][
                        'ROCsMoreThanFourPercent'] = RowTuple[
                            'ROCsMoreThanFourPercent']
                    FinalModuleRowsDict[Identificator][
                        'ROCsMoreThanOnePercent'] = RowTuple[
                            'ROCsMoreThanOnePercent']
                    FinalModuleRowsDict[Identificator][
                        'ROCsLessThanOnePercent'] = RowTuple[
                            'ROCsLessThanOnePercent']

                if RowTuple['Temperature'] and FinalModuleRowsDict[
                        Identificator].has_key('Temperature'):
                    if FinalModuleRowsDict[Identificator]['Temperature']:
                        temperaturesList = [
                            x.strip()
                            for x in FinalModuleRowsDict[Identificator]
                            ['Temperature'].split(' / ')
                        ]
                        temperaturesList.append(RowTuple['Temperature'])
                        FinalModuleRowsDict[Identificator][
                            'Temperature'] = " / ".join(
                                list(set(temperaturesList)))
                    else:
                        FinalModuleRowsDict[Identificator][
                            'Temperature'] = "%s" % RowTuple['Temperature']
                if RowTuple['initialCurrent'] and FinalModuleRowsDict[
                        Identificator].has_key('initialCurrent'):
                    if FinalModuleRowsDict[Identificator]['initialCurrent']:
                        currentsList = [
                            x.strip()
                            for x in str(FinalModuleRowsDict[Identificator]
                                         ['initialCurrent']).split(' / ')
                        ]
                        currentsList.append(str(RowTuple['initialCurrent']))
                        FinalModuleRowsDict[Identificator][
                            'initialCurrent'] = " / ".join(
                                list(set(currentsList)))
                    else:
                        FinalModuleRowsDict[Identificator][
                            'initialCurrent'] = "%s" % RowTuple[
                                'initialCurrent']
                if RowTuple['Comments'] and FinalModuleRowsDict[
                        Identificator].has_key('Comments'):
                    if FinalModuleRowsDict[Identificator]['Comments']:
                        commentsList = [
                            x.strip()
                            for x in FinalModuleRowsDict[Identificator]
                            ['Comments'].split(' / ')
                        ]
                        commentsList.append(RowTuple['Comments'])
                        FinalModuleRowsDict[Identificator][
                            'Comments'] = " / ".join(list(set(commentsList)))

                    else:
                        FinalModuleRowsDict[Identificator][
                            'Comments'] = "%s" % RowTuple['Comments']
                if RowTuple['nCycles'] and FinalModuleRowsDict[
                        Identificator].has_key('nCycles'):
                    FinalModuleRowsDict[Identificator]['nCycles'] = RowTuple[
                        'nCycles']
                    FinalModuleRowsDict[Identificator][
                        'CycleTempLow'] = RowTuple['CycleTempLow']
                    FinalModuleRowsDict[Identificator][
                        'CycleTempHigh'] = RowTuple['CycleTempHigh']

        mapModules = []
        try:
            mapFilePattern = self.TestResultEnvironmentObject.GlobalDataDirectory + '/mount*.txt'
            mapFileNames = glob.glob(mapFilePattern)
            mapName = ''
            if len(mapFileNames) == 1:
                #mapName = mapFileNames[0].split('/').replace('mount_','')[0:-4]
                mapLines = []
                with open(mapFileNames[0], 'r') as mapFile:
                    mapLines = mapFile.readlines()
                mapModuleIDs = [[y.strip() for y in x.split(';')]
                                for x in mapLines if len(x.strip()) > 1]

                LadderNumber = 1
                for mapLine in mapModuleIDs:
                    moduleLinksRow = ['%d' % LadderNumber]
                    for moduleID in mapLine:
                        matchingRows = []
                        for k, v in FinalModuleRowsDict.items():
                            if k.startswith(moduleID):
                                matchingRows.append(v)
                        try:
                            RowDict = matchingRows[0]
                            ModuleLink = RowDict['ModuleID']
                            ModuleTooltip = ''
                            ModuleStyle = ''
                            if 'Comments' in RowDict:
                                ModuleTooltip = RowDict['Comments']
                                if ModuleTooltip and len(
                                        ModuleTooltip.strip()) > 0:
                                    ModuleStyle = ModuleStyle + 'border-width: 0px 0px 0px 6px;border-style: solid;border-color: #fe9;padding: 0px 0px 0px 2px;'

                            if 'Grade' in RowDict:
                                if RowDict['Grade'] == 'A':
                                    ModuleStyle = ModuleStyle + 'background-color:#aaffaa;'
                                elif RowDict['Grade'] == 'B':
                                    ModuleStyle = ModuleStyle + 'background-color:#eeff99;'
                                elif 'ElectricalGradeNoBB' in RowDict and RowDict[
                                        'ElectricalGradeNoBB'] in ['A', 'B']:
                                    ModuleStyle = ModuleStyle + 'background-color:#ffcc44;'
                                elif RowDict['Grade'] == 'C':
                                    ModuleStyle = ModuleStyle + 'background-color:#ff8888;'
                                else:
                                    ModuleStyle = ModuleStyle + 'background-color:#ff0000;color:#ffffff;'

                            ModuleLink = "<div style='%s' title='%s'>" % (
                                ModuleStyle,
                                ModuleTooltip) + ModuleLink + "</div>"

                            moduleLinksRow.append(ModuleLink)

                        except:
                            moduleLinksRow.append(moduleID)
                    mapModules.append(moduleLinksRow)
                    LadderNumber += 1

        except:
            pass

        for ModuleID in ModuleIDList:
            RowDict = FinalModuleRowsDict[ModuleID]

            # if comment for all 3 fulltests is the same, show it only once
            if RowDict['Comments']:
                CommentItems = [
                    x.strip() for x in RowDict['Comments'].split('/')
                ]
                if len(CommentItems) == 3 and CommentItems[0] == CommentItems[
                        1] and CommentItems[1] == CommentItems[2]:
                    RowDict['Comments'] = CommentItems[0]
                elif len(CommentItems
                         ) == 2 and CommentItems[0] == CommentItems[1]:
                    RowDict['Comments'] = CommentItems[0]

            Row = []
            for Key in TableColumnList:
                Row.append(RowDict[Key])

            TableData['BODY'].append(Row)

        TableDataObject = {
            'List': TableData,
            'Map': {
                'BODY':
                mapModules,
                'HEADER':
                [['', '-4', '-3', '-2', '-1', '+1', '+2', '+3', '+4']]
                if len(mapModules) > 0 else [[]]
            }
        }
        return TableDataObject