class SemesterSummary(Report): """ This class is responsible for producing a report on the overall summary of a given semester. """ def __init__(self, filename, semester = None): super(SemesterSummary, self).__init__(filename) # save off original table style self.tableStyleNoSpan = self.tableStyle # redefine the table sytle to include a span self.tableStyle = TableStyle([ ('SPAN', (0, 0), (-1,0)), ('TOPPADDING', (0, 0), (-1, -1), 0), ('BOTTOMPADDING', (0, 0), (-1, -1), 0), ('LINEABOVE', (0, 1), (-1, 1), 1, colors.black), ('BOX', (0, 0), (-1, -1), 1, colors.black), ]) self.semester = semester # In order to calculate the pressures for the right semester # we need to tell this class that we are a few days before # this semester starts: s = DSSSemester.objects.get(semester = semester) today = (s.start() - timedelta(days = 10)) self.lst = LstPressures(today = today) self.title = 'Semester Summary' def report(self, semester = None): if semester is not None: self.semester = semester # crunch the numbers we need for this report self.lst.getPressures() self.lst.getOriginalRequestedPressures() self.title = self.title if self.semester is None else \ self.title + " for Semester %s" % self.semester t0 = self.getIntroTable() t1 = self.getStartingHoursTable() t2 = self.getAvailableAllAstronomyTable() t3 = self.getAvailableNewAstronomyTableGradeA() t4 = self.getAvailableNewAstronomyTable() t5 = self.getTotalRequestedTable() b = self.getBreak() tables = [t0, b, t1, b, t2, b] for g in self.lst.grades: tables.append(self.getBacklogTableForGrade(g)) tables.append(b) tables.extend([t3, b, t4, b, t5]) # write the document to disk (or something) self.doc.build(tables , onFirstPage = self.makeHeaderFooter , onLaterPages = self.makeHeaderFooter) def getIntroTable(self): data = [[self.pg('Time Analysis for Semester %s' % self.semester, bold = True) ] , [self.pg('%s - %s' % (self.lst.timeRange))] , [self.pg('As of %s' % self.lst.published)] ] t = Table(data, colWidths = [300]) t.setStyle(self.tableStyle) return t def getStartingHoursTable(self): hrsInSemester = (self.lst.weather.availability.total() , self.lst.weather.availability.total(gc = True)) hrsMaint = (self.lst.maintenancePs.total() , self.lst.maintenancePs.total(gc = True)) hrsShutdown = (self.lst.shutdownPs.total() , self.lst.shutdownPs.total(gc = True)) hrsTests = (self.lst.testingPs.total() , self.lst.testingPs.total(gc = True)) data = [self.hrsPg('Hours in Semester', hrsInSemester, bold = True) , self.hrsPg('Maintenance Hours', hrsMaint) , self.hrsPg('Test, Comm, Calib Hours', hrsTests) , self.hrsPg('Shutdown Hours', hrsShutdown) ] t = Table(data, colWidths = [100, 100, 100]) t.setStyle(self.tableStyleNoSpan) return t def getAvailableAllAstronomyTable(self): txt = 'Available for ALL Astronomy during %s' % self.semester return self.getAvailableTable(txt #, self.ta.astronomyAvailableHrs) , self.lst.postMaintAvailabilityPs) def getBacklogTableForGrade(self, grade): g = grade t = True hrsFixed = (self.lst.carryoverGradePs['fixed'][g].total() , self.lst.carryoverGradePs['fixed'][g].total(gc = t)) hrsTotal = (self.lst.carryoverGradePs['total'][g].total() , self.lst.carryoverGradePs['total'][g].total(gc = t)) data = [[self.pg('Group %s time' % grade, bold = True)] , self.hrsPg('Hours Total', hrsTotal) , self.hrsPg('Fixed Hours', hrsFixed) ] r = 'rest' for w in self.lst.weatherTypes: w = w.lower() hrs = (self.lst.carryoverGradePs[r][g].total(type = w) , self.lst.carryoverGradePs[r][g].total(type = w , gc = t)) label = 'Hours for %s' % self.lst.weatherMap[w] data.append(self.hrsPg(label, hrs)) t = Table(data, colWidths = [100, 100, 100]) t.setStyle(self.tableStyle) return t def getAvailableHrs(self, available): "Reorganize our data." hrsTotal = (available.total(), available.total(gc = True)) hrs = [] for w in self.lst.weatherTypes: w = w.lower() hrs.append((available.total(type = w) , available.total(type = w, gc = True))) return (hrsTotal, hrs[0], hrs[1], hrs[2]) def getAvailableTable(self, text, available): "Worker function for creating a table of available hours." hrsTotal, hrsLowFreq, hrsHiFreq1, hrsHiFreq2 = \ self.getAvailableHrs(available) data = [[self.pg(text, bold = True) ] , self.hrsPg('Hours Total', hrsTotal) , self.hrsPg('Hours for Low Freq', hrsLowFreq) , self.hrsPg('Hours for Hi Freq 1', hrsHiFreq1) , self.hrsPg('Hours for Hi Freq 2', hrsHiFreq2) ] t = Table(data, colWidths = [100, 100, 100]) t.setStyle(self.tableStyle) return t def getAvailableNewAstronomyTableGradeA(self): txt = 'Available for NEW Astronomy during %s (Grade A Carry Over Only)' % self.semester return self.getAvailableTable(txt , self.lst.remainingFromGradeACarryoverPs) def getAvailableNewAstronomyTable(self): txt = 'Available for NEW Astronomy during %s (All Grades Carry Over)' % self.semester return self.getAvailableTable(txt , self.lst.remainingPs) def getTotalRequestedTable(self): txt = 'Originally Requested Astronomy for semester %s' % self.semester return self.getAvailableTable(txt , self.lst.originalRequestedPs) def hrsPg(self, text, hrs, bold = False): "This is common enough when reporting on hours" if bold: text = "<b>%s</b>" % text return [self.pg(text) # label , self.pg("%5.2f" % hrs[0]) # total hrs , self.pg("GC[%5.2f]" % hrs[1]) # hrs in Gal. Center ]