Show
Ignore:
Timestamp:
01/12/04 00:22:42 (20 years ago)
Author:
jalet
Message:

Major code refactoring, it's way cleaner, and now allows automated addition
of printers on first print.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • pykota/trunk/pykota/accounters/querying.py

    r1257 r1271  
    2222# 
    2323# $Log$ 
     24# Revision 1.12  2004/01/11 23:22:42  jalet 
     25# Major code refactoring, it's way cleaner, and now allows automated addition 
     26# of printers on first print. 
     27# 
    2428# Revision 1.11  2004/01/08 14:10:32  jalet 
    2529# Copyright year changed. 
     
    6973        AccounterBase.__init__(self, kotabackend, arguments) 
    7074        self.requester = openRequester(kotabackend.config, kotabackend.printername) 
     75        self.isDelayed = 1 # With the pykota filter, accounting is delayed by one job 
    7176         
    7277    def getPrinterInternalPageCounter(self) :     
     
    8994        return counter     
    9095         
    91     def beginJob(self, printer, user) :     
     96    def beginJob(self, userpquota) :     
    9297        """Saves printer internal page counter at start of job.""" 
    9398        # save page counter before job 
    9499        self.LastPageCounter = self.counterbefore = self.getPrinterInternalPageCounter() 
    95100         
    96     def endJob(self, printer, user) :     
     101    def endJob(self, userpquota) :     
    97102        """Saves printer internal page counter at end of job.""" 
    98103        # save page counter after job 
     
    122127        return jobsize 
    123128         
    124     def doAccounting(self, printer, user) : 
     129    def doAccounting(self, userpquota) : 
    125130        """Does print accounting and returns if the job status is ALLOW or DENY.""" 
    126131        # Get the page counter directly from the printer itself 
    127         # Tries MAXTRIES times, sleeping two seconds each time, in case the printer is sleeping. 
    128         # This was seen with my Apple LaserWriter 16/600 PS which doesn't answer before having warmed up. 
    129         counterbeforejob = self.getPrinterInternalPageCounter() 
     132        counterbeforejob = self.getPrinterInternalPageCounter() or 0 
    130133         
    131         # get last job information for this printer 
    132         if not printer.LastJob.Exists : 
    133             # The printer hasn't been used yet, from PyKota's point of view 
    134             lastuser = user 
    135             lastpagecounter = counterbeforejob 
    136         else :     
    137             # get last values from Quota Storage 
    138             lastuser = printer.LastJob.User 
    139             lastpagecounter = printer.LastJob.PrinterPageCounter 
    140              
    141         # if printer is off then we assume the correct counter value is the last one 
    142         if counterbeforejob is None : 
    143             counterbeforejob = lastpagecounter 
    144              
    145         # if the internal lifetime page counter for this printer is 0     
    146         # then this may be a printer with a volatile counter (never 
    147         # saved to NVRAM) which has just been switched off and then on 
    148         # so we use the last page counter from the Quota Storage instead 
    149         # explanation at : http://web.mit.edu/source/third/lprng/doc/LPRng-HOWTO-15.html 
    150         if counterbeforejob == 0 : 
    151             counterbeforejob = lastpagecounter 
    152              
    153         # Computes the last job size as the difference between internal page 
    154         # counter in the printer and last page counter taken from the Quota 
    155         # Storage database for this particular printer 
    156         try : 
    157             jobsize = (counterbeforejob - lastpagecounter)     
    158         except TypeError :     
    159             # never used, and internal page counter not accessible 
    160             jobsize = 0 
    161              
    162         if jobsize < 0 : 
    163             # Probably an HP printer which was switched off and back on,  
    164             # its primary counter is only saved in a 10 increment, so 
    165             # it may be lower than the last page counter saved in the 
    166             # Quota Storage.  
    167             # We unconditionnally set the last job's size to  
    168             # abs(int((10 - abs(lastcounter(snmp) - lastcounter(storage)) / 2)) 
    169             # For more accurate accounting, don't switch off your HP printers ! 
    170             # explanation at : http://web.mit.edu/source/third/lprng/doc/LPRng-HOWTO-15.html 
    171             self.filter.logger.log_message(_("Error in page count value %i for user %s on printer %s") % (jobsize, lastuser.Name, self.filter.printername), "error") 
    172             jobsize = abs(int((10 - abs(jobsize)) / 2))     # Workaround for HP printers' feature ! 
    173              
    174         # update the quota for the previous user on this printer  
    175         lastuserquota = self.filter.storage.getUserPQuota(lastuser, printer) 
    176         if lastuserquota.Exists : 
    177             lastuserquota.increasePagesUsage(jobsize) 
    178          
    179         # update the last job size in the history 
    180         if printer.LastJob.Exists : 
    181             printer.LastJob.setSize(jobsize) 
    182          
    183         # warns the last user if he is over quota 
    184         if lastuserquota.Exists : 
    185             self.filter.warnUserPQuota(lastuserquota) 
    186              
    187134        # Is the current user allowed to print at all ? 
    188         action = self.filter.warnUserPQuota(self.filter.storage.getUserPQuota(user, printer)) 
     135        action = self.filter.warnUserPQuota(userpquota) 
    189136         
    190137        # adds the current job to history     
    191         printer.addJobToHistory(self.filter.jobid, user, counterbeforejob, action, filename=self.filter.preserveinputfile, title=self.filter.title, copies=self.filter.copies, options=self.filter.options) 
     138        userpquota.Printer.addJobToHistory(self.filter.jobid, userpquota.User, counterbeforejob, action, filename=self.filter.preserveinputfile, title=self.filter.title, copies=self.filter.copies, options=self.filter.options) 
    192139        return action 
    193140