コード例 #1
0
ファイル: SemesterSummary.py プロジェクト: mmccarty/nell
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
               ]