Changeset 3413 for pykota/trunk/pykota/storage.py
- Timestamp:
- 09/27/08 22:02:37 (16 years ago)
- Files:
-
- 1 modified
Legend:
- Unmodified
- Added
- Removed
-
pykota/trunk/pykota/storage.py
r3411 r3413 8 8 # the Free Software Foundation, either version 3 of the License, or 9 9 # (at your option) any later version. 10 # 10 # 11 11 # This program is distributed in the hope that it will be useful, 12 12 # but WITHOUT ANY WARRANTY; without even the implied warranty of 13 13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 14 # GNU General Public License for more details. 15 # 15 # 16 16 # You should have received a copy of the GNU General Public License 17 17 # along with this program. If not, see <http://www.gnu.org/licenses/>. … … 38 38 self.isDirty = False 39 39 self.Exists = False 40 40 41 41 def setDescription(self, description=None) : 42 42 """Sets the object's description.""" 43 43 if description is not None : 44 44 self.Description = str(description) 45 self.isDirty = True 46 47 def save(self) : 45 self.isDirty = True 46 47 def save(self) : 48 48 """Saves the object to the database.""" 49 49 if self.isDirty : 50 50 getattr(self.parent, "save%s" % self.__class__.__name__[7:])(self) 51 51 self.isDirty = False 52 53 54 class StorageUser(StorageObject) : 52 53 54 class StorageUser(StorageObject) : 55 55 """User class.""" 56 56 def __init__(self, parent, name) : … … 64 64 self.Payments = [] # TODO : maybe handle this smartly for SQL, for now just don't retrieve them 65 65 self.PaymentsBacklog = [] 66 67 def consumeAccountBalance(self, amount) : 66 67 def consumeAccountBalance(self, amount) : 68 68 """Consumes an amount of money from the user's account balance.""" 69 69 self.parent.decreaseUserAccountBalance(self, amount) 70 70 self.AccountBalance = float(self.AccountBalance or 0.0) - amount 71 71 72 72 def setAccountBalance(self, balance, lifetimepaid, comment="") : 73 73 """Sets the user's account balance in case he pays more money.""" … … 78 78 self.PaymentsBacklog.append((diff, comment)) 79 79 self.isDirty = True 80 81 def save(self) : 80 81 def save(self) : 82 82 """Saves an user and flush its payments backlog.""" 83 83 for (value, comment) in self.PaymentsBacklog : 84 84 self.parent.writeNewPayment(self, value, comment) 85 self.PaymentsBacklog = [] 86 StorageObject.save(self) 87 88 def setLimitBy(self, limitby) : 85 self.PaymentsBacklog = [] 86 StorageObject.save(self) 87 88 def setLimitBy(self, limitby) : 89 89 """Sets the user's limiting factor.""" 90 90 try : 91 91 limitby = limitby.lower() 92 except AttributeError : 92 except AttributeError : 93 93 limitby = "quota" 94 94 if limitby in ["quota", "balance", \ … … 96 96 self.LimitBy = limitby 97 97 self.isDirty = True 98 99 def setOverChargeFactor(self, factor) : 98 99 def setOverChargeFactor(self, factor) : 100 100 """Sets the user's overcharging coefficient.""" 101 101 self.OverCharge = factor 102 102 self.isDirty = True 103 104 def setEmail(self, email) : 103 104 def setEmail(self, email) : 105 105 """Sets the user's email address.""" 106 106 self.Email = email 107 107 self.isDirty = True 108 109 def delete(self) : 108 109 def delete(self) : 110 110 """Deletes an user from the database.""" 111 111 self.parent.deleteUser(self) … … 116 116 self.parent.flushEntry("USERPQUOTAS", "%s@%s" % (v.User.Name, v.Printer.Name)) 117 117 self.Exists = False 118 self.isDirty = False 119 118 self.isDirty = False 119 120 120 def refund(self, amount, reason) : 121 121 """Refunds a number of credits to an user.""" 122 122 self.consumeAccountBalance(-amount) 123 123 self.parent.writeNewPayment(self, -amount, reason) 124 125 126 class StorageGroup(StorageObject) : 124 125 126 class StorageGroup(StorageObject) : 127 127 """User class.""" 128 128 def __init__(self, parent, name) : … … 132 132 self.AccountBalance = None 133 133 self.LifeTimePaid = None 134 135 def setLimitBy(self, limitby) : 134 135 def setLimitBy(self, limitby) : 136 136 """Sets the user's limiting factor.""" 137 137 try : 138 138 limitby = limitby.lower() 139 except AttributeError : 139 except AttributeError : 140 140 limitby = "quota" 141 141 if limitby in ["quota", "balance", "noquota"] : 142 142 self.LimitBy = limitby 143 143 self.isDirty = True 144 144 145 145 def addUserToGroup(self, user) : 146 146 """Adds an user to an users group.""" 147 147 self.parent.addUserToGroup(user, self) 148 148 149 149 def delUserFromGroup(self, user) : 150 150 """Removes an user from an users group.""" 151 151 self.parent.delUserFromGroup(user, self) 152 153 def delete(self) : 152 153 def delete(self) : 154 154 """Deletes a group from the database.""" 155 155 self.parent.deleteGroup(self) … … 160 160 self.parent.flushEntry("GROUPPQUOTAS", "%s@%s" % (v.Group.Name, v.Printer.Name)) 161 161 self.Exists = False 162 self.isDirty = False 163 164 162 self.isDirty = False 163 164 165 165 class StoragePrinter(StorageObject) : 166 166 """Printer class.""" … … 172 172 self.MaxJobSize = None 173 173 self.PassThrough = None 174 175 def __getattr__(self, name) : 174 175 def __getattr__(self, name) : 176 176 """Delays data retrieval until it's really needed.""" 177 if name == "LastJob" : 177 if name == "LastJob" : 178 178 self.LastJob = self.parent.getPrinterLastJob(self) 179 179 self.parent.tool.logdebug("Lazy retrieval of last job for printer %s" % self.Name) 180 180 return self.LastJob 181 elif name == "Coefficients" : 181 elif name == "Coefficients" : 182 182 self.Coefficients = self.parent.tool.config.getPrinterCoefficients(self.Name) 183 183 self.parent.tool.logdebug("Lazy retrieval of coefficients for printer %s : %s" % (self.Name, self.Coefficients)) … … 185 185 else : 186 186 raise AttributeError, name 187 187 188 188 def addJobToHistory(self, jobid, user, pagecounter, action, jobsize=None, jobprice=None, filename=None, title=None, copies=None, options=None, clienthost=None, jobsizebytes=None, jobmd5sum=None, jobpages=None, jobbilling=None, precomputedsize=None, precomputedprice=None) : 189 189 """Adds a job to the printer's history.""" 190 190 self.parent.writeJobNew(self, user, jobid, pagecounter, action, jobsize, jobprice, filename, title, copies, options, clienthost, jobsizebytes, jobmd5sum, jobpages, jobbilling, precomputedsize, precomputedprice) 191 191 # TODO : update LastJob object ? Probably not needed. 192 193 def addPrinterToGroup(self, printer) : 192 193 def addPrinterToGroup(self, printer) : 194 194 """Adds a printer to a printer group.""" 195 195 if (printer not in self.parent.getParentPrinters(self)) and (printer.ident != self.ident) : 196 196 self.parent.writePrinterToGroup(self, printer) 197 197 # TODO : reset cached value for printer parents, or add new parent to cached value 198 199 def delPrinterFromGroup(self, printer) : 198 199 def delPrinterFromGroup(self, printer) : 200 200 """Deletes a printer from a printer group.""" 201 201 self.parent.removePrinterFromGroup(self, printer) 202 202 # TODO : reset cached value for printer parents, or add new parent to cached value 203 204 def setPrices(self, priceperpage = None, priceperjob = None) : 203 204 def setPrices(self, priceperpage = None, priceperjob = None) : 205 205 """Sets the printer's prices.""" 206 206 if priceperpage is None : 207 207 priceperpage = self.PricePerPage or 0.0 208 else : 208 else : 209 209 self.PricePerPage = float(priceperpage) 210 if priceperjob is None : 210 if priceperjob is None : 211 211 priceperjob = self.PricePerJob or 0.0 212 else : 212 else : 213 213 self.PricePerJob = float(priceperjob) 214 self.isDirty = True 215 214 self.isDirty = True 215 216 216 def setPassThrough(self, passthrough) : 217 217 """Sets the printer's passthrough mode.""" 218 218 self.PassThrough = passthrough 219 219 self.isDirty = True 220 220 221 221 def setMaxJobSize(self, maxjobsize) : 222 222 """Sets the printer's maximal job size.""" 223 223 self.MaxJobSize = maxjobsize 224 224 self.isDirty = True 225 226 def delete(self) : 225 226 def delete(self) : 227 227 """Deletes a printer from the database.""" 228 228 self.parent.deletePrinter(self) … … 236 236 self.parent.flushEntry("GROUPPQUOTAS", "%s@%s" % (v.Group.Name, v.Printer.Name)) 237 237 self.Exists = False 238 self.isDirty = False 239 240 238 self.isDirty = False 239 240 241 241 class StorageUserPQuota(StorageObject) : 242 242 """User Print Quota class.""" … … 252 252 self.WarnCount = None 253 253 self.MaxJobSize = None 254 255 def __getattr__(self, name) : 254 255 def __getattr__(self, name) : 256 256 """Delays data retrieval until it's really needed.""" 257 if name == "ParentPrintersUserPQuota" : 257 if name == "ParentPrintersUserPQuota" : 258 258 self.ParentPrintersUserPQuota = (self.User.Exists and self.Printer.Exists and self.parent.getParentPrintersUserPQuota(self)) or [] 259 259 return self.ParentPrintersUserPQuota 260 260 else : 261 261 raise AttributeError, name 262 263 def setDateLimit(self, datelimit) : 262 263 def setDateLimit(self, datelimit) : 264 264 """Sets the date limit for this quota.""" 265 265 datelimit = DateTime.ISO.ParseDateTime(str(datelimit)[:19]) … … 267 267 self.parent.writeUserPQuotaDateLimit(self, date) 268 268 self.DateLimit = date 269 270 def setLimits(self, softlimit, hardlimit) : 269 270 def setLimits(self, softlimit, hardlimit) : 271 271 """Sets the soft and hard limit for this quota.""" 272 272 self.SoftLimit = softlimit … … 275 275 self.WarnCount = 0 276 276 self.isDirty = True 277 277 278 278 def setUsage(self, used) : 279 279 """Sets the PageCounter and LifePageCounter to used, or if used is + or - prefixed, changes the values of {Life,}PageCounter by that amount.""" … … 292 292 self.parent.increaseUserPQuotaWarnCount(self) 293 293 self.WarnCount = (self.WarnCount or 0) + 1 294 294 295 295 def resetDenyBannerCounter(self) : 296 296 """Resets the deny banner counter for this user quota.""" 297 297 self.parent.writeUserPQuotaWarnCount(self, 0) 298 298 self.WarnCount = 0 299 300 def reset(self) : 299 300 def reset(self) : 301 301 """Resets page counter to 0.""" 302 302 self.PageCounter = 0 303 303 self.DateLimit = None 304 304 self.isDirty = True 305 306 def hardreset(self) : 305 306 def hardreset(self) : 307 307 """Resets actual and life time page counters to 0.""" 308 308 self.PageCounter = self.LifePageCounter = 0 309 309 self.DateLimit = None 310 310 self.isDirty = True 311 312 def computeJobPrice(self, jobsize, inkusage=[]) : 311 312 def computeJobPrice(self, jobsize, inkusage=[]) : 313 313 """Computes the job price as the sum of all parent printers' prices + current printer's ones.""" 314 totalprice = 0.0 314 totalprice = 0.0 315 315 if jobsize : 316 316 if self.User.OverCharge != 0.0 : # optimization, but TODO : beware of rounding errors … … 320 320 if not inkusage : 321 321 totalprice += (jobsize * pageprice) 322 else : 322 else : 323 323 for pageindex in range(jobsize) : 324 324 try : 325 325 usage = inkusage[pageindex] 326 except IndexError : 326 except IndexError : 327 327 self.parent.tool.logdebug("No ink usage information. Using base cost of %f credits for page %i." % (pageprice, pageindex+1)) 328 328 totalprice += pageprice 329 else : 329 else : 330 330 coefficients = upq.Printer.Coefficients 331 331 for (ink, value) in usage.items() : … … 336 336 totalprice += inkprice 337 337 if self.User.OverCharge != 1.0 : # TODO : beware of rounding errors 338 overcharged = totalprice * self.User.OverCharge 338 overcharged = totalprice * self.User.OverCharge 339 339 self.parent.tool.logdebug("Overcharging %s by a factor of %s ===> User %s will be charged for %s credits." % (totalprice, self.User.OverCharge, self.User.Name, overcharged)) 340 340 return overcharged 341 else : 341 else : 342 342 return totalprice 343 343 344 344 def increasePagesUsage(self, jobsize, inkusage=[]) : 345 345 """Increase the value of used pages and money.""" … … 353 353 upq.LifePageCounter = int(upq.LifePageCounter or 0) + jobsize 354 354 return jobprice 355 356 def delete(self) : 355 356 def delete(self) : 357 357 """Deletes an user print quota entry from the database.""" 358 358 self.parent.deleteUserPQuota(self) … … 361 361 self.Exists = False 362 362 self.isDirty = False 363 364 def refund(self, nbpages) : 363 364 def refund(self, nbpages) : 365 365 """Refunds a number of pages to an user on a particular printer.""" 366 366 self.parent.increaseUserPQuotaPagesCounters(self, -nbpages) 367 367 self.PageCounter = int(self.PageCounter or 0) - nbpages 368 368 self.LifePageCounter = int(self.LifePageCounter or 0) - nbpages 369 370 369 370 371 371 class StorageGroupPQuota(StorageObject) : 372 372 """Group Print Quota class.""" … … 381 381 self.DateLimit = None 382 382 self.MaxJobSize = None 383 384 def __getattr__(self, name) : 383 384 def __getattr__(self, name) : 385 385 """Delays data retrieval until it's really needed.""" 386 if name == "ParentPrintersGroupPQuota" : 386 if name == "ParentPrintersGroupPQuota" : 387 387 self.ParentPrintersGroupPQuota = (self.Group.Exists and self.Printer.Exists and self.parent.getParentPrintersGroupPQuota(self)) or [] 388 388 return self.ParentPrintersGroupPQuota 389 389 else : 390 390 raise AttributeError, name 391 392 def reset(self) : 391 392 def reset(self) : 393 393 """Resets page counter to 0.""" 394 394 for user in self.parent.getGroupMembers(self.Group) : … … 399 399 self.DateLimit = None 400 400 self.isDirty = True 401 402 def hardreset(self) : 401 402 def hardreset(self) : 403 403 """Resets actual and life time page counters to 0.""" 404 404 for user in self.parent.getGroupMembers(self.Group) : … … 409 409 self.DateLimit = None 410 410 self.isDirty = True 411 412 def setDateLimit(self, datelimit) : 411 412 def setDateLimit(self, datelimit) : 413 413 """Sets the date limit for this quota.""" 414 414 datelimit = DateTime.ISO.ParseDateTime(str(datelimit)[:19]) … … 421 421 self.parent.writeGroupPQuotaDateLimit(self, date) 422 422 self.DateLimit = date 423 424 def setLimits(self, softlimit, hardlimit) : 423 424 def setLimits(self, softlimit, hardlimit) : 425 425 """Sets the soft and hard limit for this quota.""" 426 426 self.SoftLimit = softlimit … … 428 428 self.DateLimit = None 429 429 self.isDirty = True 430 431 def delete(self) : 430 431 def delete(self) : 432 432 """Deletes a group print quota entry from the database.""" 433 433 self.parent.deleteGroupPQuota(self) … … 436 436 self.Exists = False 437 437 self.isDirty = False 438 439 438 439 440 440 class StorageJob(StorageObject) : 441 441 """Printer's Job class.""" … … 461 461 self.PrecomputedJobSize = None 462 462 self.PrecomputedJobPrice = None 463 464 def __getattr__(self, name) : 463 464 def __getattr__(self, name) : 465 465 """Delays data retrieval until it's really needed.""" 466 if name == "User" : 466 if name == "User" : 467 467 self.User = self.parent.getUser(self.UserName) 468 468 return self.User 469 elif name == "Printer" : 469 elif name == "Printer" : 470 470 self.Printer = self.parent.getPrinter(self.PrinterName) 471 471 return self.Printer 472 472 else : 473 473 raise AttributeError, name 474 475 def refund(self, reason) : 474 475 def refund(self, reason) : 476 476 """Refund a particular print job.""" 477 477 if (not self.JobSize) or (self.JobAction in ("DENY", "CANCEL", "REFUND")) : 478 478 return 479 479 480 480 basereason = _("Refunded %i pages and %.3f credits by %s (%s) on %s") \ 481 481 % (self.JobSize, … … 484 484 os.getlogin(), 485 485 str(DateTime.now())[:19]) 486 if reason : 486 if reason : 487 487 reason = "%s : %s" % (basereason, reason) 488 else : 488 else : 489 489 reason = basereason 490 self.parent.tool.logdebug("Refunding job %s..." % self.ident) 490 self.parent.tool.logdebug("Refunding job %s..." % self.ident) 491 491 self.parent.beginTransaction() 492 492 try : … … 494 494 bcode = self.parent.getBillingCode(self.JobBillingCode) 495 495 bcode.refund(self.JobSize, self.JobPrice) 496 496 497 497 if self.User.Exists : 498 498 self.User.refund(self.JobPrice, reason) 499 if self.Printer.Exists : 500 upq = self.parent.getUserPQuota(self.User, self.Printer) 499 if self.Printer.Exists : 500 upq = self.parent.getUserPQuota(self.User, self.Printer) 501 501 if upq.Exists : 502 502 upq.refund(self.JobSize) 503 503 self.parent.refundJob(self.ident) 504 except : 504 except : 505 505 self.parent.rollbackTransaction() 506 506 self.parent.tool.logdebug("Error while refunding job %s." % self.ident) 507 507 raise 508 else : 508 else : 509 509 self.parent.commitTransaction() 510 510 self.parent.tool.logdebug("Job %s refunded." % self.ident) 511 512 511 512 513 513 class StorageLastJob(StorageJob) : 514 514 """Printer's Last Job class.""" … … 517 517 self.PrinterName = printer.Name # not needed 518 518 self.Printer = printer 519 520 519 520 521 521 class StorageBillingCode(StorageObject) : 522 522 """Billing code class.""" … … 526 526 self.PageCounter = None 527 527 self.Balance = None 528 529 def delete(self) : 528 529 def delete(self) : 530 530 """Deletes the billing code from the database.""" 531 531 self.parent.deleteBillingCode(self) … … 533 533 self.isDirty = False 534 534 self.Exists = False 535 536 def reset(self, balance=0.0, pagecounter=0) : 535 536 def reset(self, balance=0.0, pagecounter=0) : 537 537 """Resets the pagecounter and balance for this billing code.""" 538 538 self.Balance = balance 539 539 self.PageCounter = pagecounter 540 540 self.isDirty = True 541 541 542 542 def consume(self, pages, price) : 543 543 """Consumes some pages and credits for this billing code.""" … … 546 546 self.PageCounter += pages 547 547 self.Balance -= price 548 548 549 549 def refund(self, pages, price) : 550 550 """Refunds a particular billing code.""" 551 551 self.consume(-pages, -price) 552 553 552 553 554 554 class BaseStorage : 555 555 def __init__(self, pykotatool) : … … 572 572 "LASTJOBS" : {}, \ 573 573 "BILLINGCODES" : {} } 574 575 def close(self) : 574 575 def close(self) : 576 576 """Must be overriden in children classes.""" 577 577 raise RuntimeError, "BaseStorage.close() must be overriden !" 578 579 def __del__(self) : 578 579 def __del__(self) : 580 580 """Ensures that the database connection is closed.""" 581 581 self.close() 582 583 def querydebug(self, qmsg) : 582 583 def querydebug(self, qmsg) : 584 584 """Logs a database query, where all queries are already UTF-8 encoded.""" 585 585 self.tool.logdebug(qmsg.decode("UTF-8", "replace")) 586 586 587 587 def getFromCache(self, cachetype, key) : 588 588 """Tries to extract something from the cache.""" … … 591 591 if entry is not None : 592 592 self.tool.logdebug("Cache hit (%s->%s)" % (cachetype, key)) 593 else : 593 else : 594 594 self.tool.logdebug("Cache miss (%s->%s)" % (cachetype, key)) 595 return entry 596 597 def cacheEntry(self, cachetype, key, value) : 595 return entry 596 597 def cacheEntry(self, cachetype, key, value) : 598 598 """Puts an entry in the cache.""" 599 599 if self.usecache and getattr(value, "Exists", 0) : 600 600 self.caches[cachetype][key] = value 601 601 self.tool.logdebug("Cache store (%s->%s)" % (cachetype, key)) 602 603 def flushEntry(self, cachetype, key) : 602 603 def flushEntry(self, cachetype, key) : 604 604 """Removes an entry from the cache.""" 605 605 if self.usecache : 606 606 try : 607 607 del self.caches[cachetype][key] 608 except KeyError : 608 except KeyError : 609 609 pass 610 else : 610 else : 611 611 self.tool.logdebug("Cache flush (%s->%s)" % (cachetype, key)) 612 613 def getUser(self, username) : 612 613 def getUser(self, username) : 614 614 """Returns the user from cache.""" 615 615 user = self.getFromCache("USERS", username) … … 617 617 user = self.getUserFromBackend(username) 618 618 self.cacheEntry("USERS", username, user) 619 return user 620 621 def getGroup(self, groupname) : 619 return user 620 621 def getGroup(self, groupname) : 622 622 """Returns the group from cache.""" 623 623 group = self.getFromCache("GROUPS", groupname) … … 625 625 group = self.getGroupFromBackend(groupname) 626 626 self.cacheEntry("GROUPS", groupname, group) 627 return group 628 629 def getPrinter(self, printername) : 627 return group 628 629 def getPrinter(self, printername) : 630 630 """Returns the printer from cache.""" 631 631 printer = self.getFromCache("PRINTERS", printername) … … 633 633 printer = self.getPrinterFromBackend(printername) 634 634 self.cacheEntry("PRINTERS", printername, printer) 635 return printer 636 637 def getUserPQuota(self, user, printer) : 635 return printer 636 637 def getUserPQuota(self, user, printer) : 638 638 """Returns the user quota information from cache.""" 639 639 useratprinter = "%s@%s" % (user.Name, printer.Name) … … 642 642 upquota = self.getUserPQuotaFromBackend(user, printer) 643 643 self.cacheEntry("USERPQUOTAS", useratprinter, upquota) 644 return upquota 645 646 def getGroupPQuota(self, group, printer) : 644 return upquota 645 646 def getGroupPQuota(self, group, printer) : 647 647 """Returns the group quota information from cache.""" 648 648 groupatprinter = "%s@%s" % (group.Name, printer.Name) … … 651 651 gpquota = self.getGroupPQuotaFromBackend(group, printer) 652 652 self.cacheEntry("GROUPPQUOTAS", groupatprinter, gpquota) 653 return gpquota 654 655 def getPrinterLastJob(self, printer) : 653 return gpquota 654 655 def getPrinterLastJob(self, printer) : 656 656 """Extracts last job information for a given printer from cache.""" 657 657 lastjob = self.getFromCache("LASTJOBS", printer.Name) … … 659 659 lastjob = self.getPrinterLastJobFromBackend(printer) 660 660 self.cacheEntry("LASTJOBS", printer.Name, lastjob) 661 return lastjob 662 663 def getBillingCode(self, label) : 661 return lastjob 662 663 def getBillingCode(self, label) : 664 664 """Returns the user from cache.""" 665 665 code = self.getFromCache("BILLINGCODES", label) … … 668 668 self.cacheEntry("BILLINGCODES", label, code) 669 669 return code 670 671 def getParentPrinters(self, printer) : 670 671 def getParentPrinters(self, printer) : 672 672 """Extracts parent printers information for a given printer from cache.""" 673 673 if self.usecache : … … 678 678 else : 679 679 self.tool.logdebug("Cache hit (%s->Parents)" % printer.Name) 680 else : 680 else : 681 681 printer.Parents = self.getParentPrintersFromBackend(printer) 682 for parent in printer.Parents[:] : 682 for parent in printer.Parents[:] : 683 683 printer.Parents.extend(self.getParentPrinters(parent)) 684 uniquedic = {} 684 uniquedic = {} 685 685 for parent in printer.Parents : 686 686 uniquedic[parent.Name] = parent 687 printer.Parents = uniquedic.values() 687 printer.Parents = uniquedic.values() 688 688 return printer.Parents 689 690 def getGroupMembers(self, group) : 689 690 def getGroupMembers(self, group) : 691 691 """Returns the group's members list from in-group cache.""" 692 692 if self.usecache : … … 697 697 else : 698 698 self.tool.logdebug("Cache hit (%s->Members)" % group.Name) 699 else : 699 else : 700 700 group.Members = self.getGroupMembersFromBackend(group) 701 return group.Members 702 703 def getUserGroups(self, user) : 701 return group.Members 702 703 def getUserGroups(self, user) : 704 704 """Returns the user's groups list from in-user cache.""" 705 705 if self.usecache : … … 710 710 else : 711 711 self.tool.logdebug("Cache hit (%s->Groups)" % user.Name) 712 else : 712 else : 713 713 user.Groups = self.getUserGroupsFromBackend(user) 714 return user.Groups 715 716 def getParentPrintersUserPQuota(self, userpquota) : 714 return user.Groups 715 716 def getParentPrintersUserPQuota(self, userpquota) : 717 717 """Returns all user print quota on the printer and all its parents recursively.""" 718 718 upquotas = [ ] … … 721 721 if upq.Exists : 722 722 upquotas.append(upq) 723 return upquotas 724 725 def getParentPrintersGroupPQuota(self, grouppquota) : 723 return upquotas 724 725 def getParentPrintersGroupPQuota(self, grouppquota) : 726 726 """Returns all group print quota on the printer and all its parents recursively.""" 727 727 gpquotas = [ ] … … 730 730 if gpq.Exists : 731 731 gpquotas.append(gpq) 732 return gpquotas 733 734 def cleanDates(self, startdate, enddate) : 732 return gpquotas 733 734 def cleanDates(self, startdate, enddate) : 735 735 """Clean the dates to create a correct filter.""" 736 if startdate : 736 if startdate : 737 737 startdate = startdate.strip().lower() 738 if enddate : 738 if enddate : 739 739 enddate = enddate.strip().lower() 740 if (not startdate) and (not enddate) : 740 if (not startdate) and (not enddate) : 741 741 return (None, None) 742 743 now = DateTime.now() 742 743 now = DateTime.now() 744 744 nameddates = ('yesterday', 'today', 'now', 'tomorrow') 745 datedict = { "start" : startdate, "end" : enddate } 745 datedict = { "start" : startdate, "end" : enddate } 746 746 for limit in datedict.keys() : 747 747 dateval = datedict[limit] … … 751 751 try : 752 752 offset = int(dateval[len(name):]) 753 except : 753 except : 754 754 offset = 0 755 dateval = dateval[:len(name)] 755 dateval = dateval[:len(name)] 756 756 if limit == "start" : 757 757 if dateval == "yesterday" : … … 773 773 dateval = (now + 1 + offset).Format("%Y%m%d235959") 774 774 break 775 775 776 776 if not dateval.isdigit() : 777 777 dateval = None 778 else : 778 else : 779 779 lgdateval = len(dateval) 780 780 if lgdateval == 4 : 781 if limit == "start" : 781 if limit == "start" : 782 782 dateval = "%s0101 00:00:00" % dateval 783 else : 783 else : 784 784 dateval = "%s1231 23:59:59" % dateval 785 785 elif lgdateval == 6 : 786 if limit == "start" : 786 if limit == "start" : 787 787 dateval = "%s01 00:00:00" % dateval 788 else : 788 else : 789 789 mxdate = DateTime.ISO.ParseDateTime("%s01 00:00:00" % dateval) 790 790 dateval = "%s%02i 23:59:59" % (dateval, mxdate.days_in_month) 791 791 elif lgdateval == 8 : 792 if limit == "start" : 792 if limit == "start" : 793 793 dateval = "%s 00:00:00" % dateval 794 else : 794 else : 795 795 dateval = "%s 23:59:59" % dateval 796 796 elif lgdateval == 10 : 797 if limit == "start" : 797 if limit == "start" : 798 798 dateval = "%s %s:00:00" % (dateval[:8], dateval[8:]) 799 else : 799 else : 800 800 dateval = "%s %s:59:59" % (dateval[:8], dateval[8:]) 801 801 elif lgdateval == 12 : 802 if limit == "start" : 802 if limit == "start" : 803 803 dateval = "%s %s:%s:00" % (dateval[:8], dateval[8:10], dateval[10:]) 804 else : 804 else : 805 805 dateval = "%s %s:%s:59" % (dateval[:8], dateval[8:10], dateval[10:]) 806 elif lgdateval == 14 : 806 elif lgdateval == 14 : 807 807 dateval = "%s %s:%s:%s" % (dateval[:8], dateval[8:10], dateval[10:12], dateval[12:]) 808 else : 808 else : 809 809 dateval = None 810 try : 810 try : 811 811 DateTime.ISO.ParseDateTime(dateval[:19]) 812 except : 812 except : 813 813 dateval = None 814 datedict[limit] = dateval 814 datedict[limit] = dateval 815 815 (start, end) = (datedict["start"], datedict["end"]) 816 816 if start and end and (start > end) : 817 817 (start, end) = (end, start) 818 try : 818 try : 819 819 if len(start) == 17 : 820 820 start = "%s-%s-%s %s" % (start[0:4], start[4:6], start[6:8], start[9:]) 821 except TypeError : 821 except TypeError : 822 822 pass 823 824 try : 823 824 try : 825 825 if len(end) == 17 : 826 826 end = "%s-%s-%s %s" % (end[0:4], end[4:6], end[6:8], end[9:]) 827 except TypeError : 827 except TypeError : 828 828 pass 829 830 return (start, end) 831 829 830 return (start, end) 831 832 832 def openConnection(pykotatool) : 833 833 """Returns a connection handle to the appropriate database.""" … … 835 835 backend = backendinfo["storagebackend"] 836 836 try : 837 storagebackend = imp.load_source("storagebackend", 837 storagebackend = imp.load_source("storagebackend", 838 838 os.path.join(os.path.dirname(__file__), 839 839 "storages", … … 841 841 except ImportError : 842 842 raise PyKotaStorageError, _("Unsupported quota storage backend %s") % backend 843 else : 843 else : 844 844 host = backendinfo["storageserver"] 845 845 database = backendinfo["storagename"]