class LstPressureReport(Report): """ This class is responsible for producing a report on the LST pressures for all the given sessions. It is basically a tabular representation of what the plots show. """ def __init__(self, filename): super(LstPressureReport, self).__init__(filename, orientation="landscape", topMargin=50) # make first style sheet font a little smaller self.styleSheet.fontSize = 6 # a second style sheet for headers self.styleSheet2 = getSampleStyleSheet()["Normal"] self.styleSheet2.fontSize = 8 # redefine table style to include an inner grid self.tableStyle = TableStyle( [ ("TOPPADDING", (0, 0), (-1, -1), 0), ("BOTTOMPADDING", (0, 0), (-1, -1), 0), ("LINEABOVE", (0, 1), (-1, 1), 1, colors.black), ("INNERGRID", (0, 0), (-1, -1), 1, colors.black), ("BOX", (0, 0), (-1, -1), 1, colors.black), ] ) self.lst = LstPressures() self.title = "LST Pressures" self.titleOffset = 0 self.fltFrmt = "%5.2f" def report( self, sessions=None, debug=False, carryOverUseNextSemester=True, adjustWeatherBins=True, hideSponsors=True ): if sessions is not None: self.title += " for %s" % ",".join([s.name for s in sessions]) self.titleOffset = 100 + len(self.title) # crunch the numbers self.lst.carryOverUseNextSemester = carryOverUseNextSemester self.lst.adjustWeatherBins = adjustWeatherBins self.lst.hideSponsors = hideSponsors self.lst.getPressures(sessions) # now mak'm pretty h1 = self.tableHeader("Totals:") t1 = self.createTotalsTable() h2 = self.tableHeader("Availability:") t2 = self.createAvailableTable() h3 = self.tableHeader("Carryover:") t3 = self.createCarryoverTable() h4 = self.tableHeader("Remaining:") t4 = self.createRemainingTable() h5 = self.tableHeader("Requested:") t5 = self.createRequestedTable() h6 = self.tableHeader("Allocated:") t6 = self.createAllocatedTable() b = self.getBreak() # Paragraph('<br/>', self.styleSheet) elements = [h1, t1, h2, t2, h3, t3, h4, t4, h5, t5, h6, t6] # , b # , b # , b # , b # sponsors aren't really part of the 'debug section', yet we don't want # them there if they aren't needed: they start page two! if not hideSponsors: for s in self.lst.sponsors: hs = self.tableHeader("%s:" % s) ts = self.createSponsorTable(s) elements.extend([hs, ts, b]) if debug: debugElements = self.createDebugElements() elements.extend(debugElements) # write the document to disk (or something) self.doc.build(elements, onFirstPage=self.makeHeaderFooter, onLaterPages=self.makeHeaderFooter) def createTotalsTable(self): "Simply one header row, and the row of total data" rows = [self.createLstRow(), self.createRow("Total", self.lst.totalPs, self.fltFrmt)] t = Table(rows, colWidths=[30] * self.lst.hrs) t.setStyle(self.tableStyle) return t def createRequestedTable(self): return self.createPressureTable(self.lst.requestedTotalPs, self.lst.requestedPs) def createCarryoverTable(self): return self.createPressureTable(self.lst.carryoverTotalPs, self.lst.carryoverPs) def createRemainingTable(self): return self.createPressureTable(self.lst.remainingTotalPs, self.lst.remainingPs) def createSponsorTable(self, sponsor): return self.createPressureTable(self.lst.sponsoredTotalPs[sponsor], self.lst.sponsoredPs[sponsor]) def createAllocatedTable(self): # different from the other tables rows = [self.createLstRow(), self.createRow("Total", self.lst.newAstronomyTotalPs, self.fltFrmt)] for w in self.lst.weatherTypes: for g in self.lst.grades: # make sure our row lable fits if w == "Excellent": label = "Ex_%s" % g else: label = "%s_%s" % (w, g) rows.append(self.createRow(label, self.lst.gradePs[g].getType(w), self.fltFrmt)) t = Table(rows, colWidths=[30] * self.lst.hrs) t.setStyle(self.tableStyle) return t def createPressureTable(self, totals, types): "Common pattern: display total, then break it down by weather type." rows = [self.createLstRow()] dataRows = [self.createRow("Total", totals, self.fltFrmt)] for w in self.lst.weatherTypes: row = self.createRow(self.cropWeatherLabel(w), types.getType(w), self.fltFrmt) dataRows.append(row) rows.extend(dataRows) t = Table(rows, colWidths=[30] * self.lst.hrs) t.setStyle(self.tableStyle) return t def createLstRow(self): "Every table begins with the LSTs 0-23" return self.createRow("LST", range(self.lst.hrs), "%d") def createAvailableTable(self): return self.createPressureTable(self.lst.weather.availabilityTotal, self.lst.weather.availability) def createRemainingTable(self): return self.createPressureTable(self.lst.remainingTotalPs, self.lst.remainingPs) def cropWeatherLabel(self, w): if w == "Excellent": return "Ex" else: return w def createRow(self, label, data, frmt): rows = [self.pg(label, bold=True)] dataRows = [self.pg(frmt % d) for d in data] rows.extend(dataRows) return rows def tableHeader(self, text): return Paragraph("<b>%s</b>" % text, self.styleSheet2) def getDataRow(self, title, data): row = [self.pg(title)] rowData = [self.pg("%5.2f" % d) for d in data] row.extend(rowData) return row def createDebugElements(self): els = [self.pg("Debug Info:", bold=True)] # how did we calculate pressures? method = "Next Semester Time" if self.lst.carryOverUseNextSemester else "Remaining Time" msg = "Calculated Carryover using " + method els.append(self.getBreak()) els.append(self.pg(msg)) msg = "Adjusted Weather Bins? " + str(self.lst.adjustWeatherBins) els.append(self.getBreak()) els.append(self.pg(msg)) # warnings ? valid, msgs = self.lst.checkPressures() if not valid: els.append(self.getBreak()) els.append(self.pg("Accounting ERRORS:", bold=True)) for msg in msgs: els.append(self.pg(msg)) # details on changes els.append(self.getBreak()) els.append(self.pg("Original Grade A Pressure before Adjustments", bold=True)) els.append(self.createOriginalGradePsTable()) els.append(self.getBreak()) els.append(self.pg("Adjustments made to Grade A Pressures", bold=True)) els.append(self.createChangesTable()) # breakdown of pre-assigned time els.append(self.getBreak()) els.append(self.pg("Maintenance Pressure", bold=True)) els.append(self.createPressureTable(self.lst.maintenancePs.allTypes(), self.lst.maintenancePs)) els.append(self.getBreak()) els.append(self.pg("Shutdown Pressure", bold=True)) els.append(self.createPressureTable(self.lst.shutdownPs.allTypes(), self.lst.shutdownPs)) els.append(self.getBreak()) els.append(self.pg("Testing Pressure", bold=True)) els.append(self.createPressureTable(self.lst.testingPs.allTypes(), self.lst.testingPs)) els.append(self.getBreak()) # non traditional sessions if len(self.lst.badSessions) > 0: ss = self.createSessionElements("Session's without pressures (bad):", self.lst.badSessions) els.extend(ss) if len(self.lst.futureSessions) > 0: ss = self.createSessionElements("Session's for future semesters:", self.lst.futureSessions) els.extend(ss) if len(self.lst.semesterSessions) > 0: ss = self.createSessionElements("Session's using semester time:", self.lst.semesterSessions) els.extend(ss) # session details els.append(self.getBreak()) els.append(self.pg("Session Details:", bold=True)) data = [self.createLstRow()] for name in sorted(self.lst.pressuresBySession.keys()): cat, subcat, ps, total = self.lst.pressuresBySession[name] if subcat == "": label = "%s: (%s, %5.2f)" % (name, cat, total) else: label = "%s: (%s, %s, %5.2f)" % (name, cat, subcat, total) data.append(self.getDataRow(label, ps)) widths = [120] widths.extend([25] * (self.lst.hrs - 1)) t = Table(data, colWidths=widths) t.setStyle(self.tableStyle) els.append(t) return els def createSessionElements(self, header, sessions): "Print out a list of sessions" els = [self.getBreak()] els.append(self.pg(header, bold=True)) for s in sessions: els.append(self.pg(s.__str__())) return els def createOriginalGradePsTable(self): # different from the other tables rows = [self.createLstRow()] for w in self.lst.weatherTypes: if w == "Excellent": label = "Ex_A" else: label = "%s_A" % w row = self.createRow(label, self.lst.originalGradePs["A"].getType(w), self.fltFrmt) rows.append(row) t = Table(rows, colWidths=[30] * self.lst.hrs) t.setStyle(self.tableStyle) return t def createChangesTable(self): # different from the other tables rows = [self.createLstRow()] for w in self.lst.weatherTypes: if w == "Excellent": label = "Ex_A" else: label = "%s_A" % w row = self.createRow(label, self.lst.changes.getType(w), self.fltFrmt) rows.append(row) t = Table(rows, colWidths=[30] * self.lst.hrs) t.setStyle(self.tableStyle) return t