Changeset 1271 for pykota/trunk/pykota/accounters
- Timestamp:
- 01/12/04 00:22:42 (20 years ago)
- Files:
-
- 1 modified
Legend:
- Unmodified
- Added
- Removed
-
pykota/trunk/pykota/accounters/querying.py
r1257 r1271 22 22 # 23 23 # $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 # 24 28 # Revision 1.11 2004/01/08 14:10:32 jalet 25 29 # Copyright year changed. … … 69 73 AccounterBase.__init__(self, kotabackend, arguments) 70 74 self.requester = openRequester(kotabackend.config, kotabackend.printername) 75 self.isDelayed = 1 # With the pykota filter, accounting is delayed by one job 71 76 72 77 def getPrinterInternalPageCounter(self) : … … 89 94 return counter 90 95 91 def beginJob(self, printer, user) :96 def beginJob(self, userpquota) : 92 97 """Saves printer internal page counter at start of job.""" 93 98 # save page counter before job 94 99 self.LastPageCounter = self.counterbefore = self.getPrinterInternalPageCounter() 95 100 96 def endJob(self, printer, user) :101 def endJob(self, userpquota) : 97 102 """Saves printer internal page counter at end of job.""" 98 103 # save page counter after job … … 122 127 return jobsize 123 128 124 def doAccounting(self, printer, user) :129 def doAccounting(self, userpquota) : 125 130 """Does print accounting and returns if the job status is ALLOW or DENY.""" 126 131 # 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 130 133 131 # get last job information for this printer132 if not printer.LastJob.Exists :133 # The printer hasn't been used yet, from PyKota's point of view134 lastuser = user135 lastpagecounter = counterbeforejob136 else :137 # get last values from Quota Storage138 lastuser = printer.LastJob.User139 lastpagecounter = printer.LastJob.PrinterPageCounter140 141 # if printer is off then we assume the correct counter value is the last one142 if counterbeforejob is None :143 counterbeforejob = lastpagecounter144 145 # if the internal lifetime page counter for this printer is 0146 # then this may be a printer with a volatile counter (never147 # saved to NVRAM) which has just been switched off and then on148 # so we use the last page counter from the Quota Storage instead149 # explanation at : http://web.mit.edu/source/third/lprng/doc/LPRng-HOWTO-15.html150 if counterbeforejob == 0 :151 counterbeforejob = lastpagecounter152 153 # Computes the last job size as the difference between internal page154 # counter in the printer and last page counter taken from the Quota155 # Storage database for this particular printer156 try :157 jobsize = (counterbeforejob - lastpagecounter)158 except TypeError :159 # never used, and internal page counter not accessible160 jobsize = 0161 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, so165 # it may be lower than the last page counter saved in the166 # Quota Storage.167 # We unconditionnally set the last job's size to168 # 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.html171 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 printer175 lastuserquota = self.filter.storage.getUserPQuota(lastuser, printer)176 if lastuserquota.Exists :177 lastuserquota.increasePagesUsage(jobsize)178 179 # update the last job size in the history180 if printer.LastJob.Exists :181 printer.LastJob.setSize(jobsize)182 183 # warns the last user if he is over quota184 if lastuserquota.Exists :185 self.filter.warnUserPQuota(lastuserquota)186 187 134 # 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) 189 136 190 137 # 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) 192 139 return action 193 140