root / pykota / trunk / pykota / accounter.py @ 1285

Revision 1285, 5.5 kB (checked in by jalet, 20 years ago)

New formula to compute a job's price

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1# PyKota
2# -*- coding: ISO-8859-15 -*-
3#
4# PyKota : Print Quotas for CUPS and LPRng
5#
6# (c) 2003-2004 Jerome Alet <alet@librelogiciel.com>
7# This program is free software; you can redistribute it and/or modify
8# it under the terms of the GNU General Public License as published by
9# the Free Software Foundation; either version 2 of the License, or
10# (at your option) any later version.
11#
12# This program is distributed in the hope that it will be useful,
13# but WITHOUT ANY WARRANTY; without even the implied warranty of
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15# GNU General Public License for more details.
16#
17# You should have received a copy of the GNU General Public License
18# along with this program; if not, write to the Free Software
19# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
20#
21# $Id$
22#
23# $Log$
24# Revision 1.13  2004/01/12 22:43:40  jalet
25# New formula to compute a job's price
26#
27# Revision 1.12  2004/01/11 23:43:31  jalet
28# Bug wrt number of copies with CUPS should be fixed.
29#
30# Revision 1.11  2004/01/11 23:22:42  jalet
31# Major code refactoring, it's way cleaner, and now allows automated addition
32# of printers on first print.
33#
34# Revision 1.10  2004/01/08 14:10:32  jalet
35# Copyright year changed.
36#
37# Revision 1.9  2003/12/27 16:49:25  uid67467
38# Should be ok now.
39#
40# Revision 1.7  2003/11/25 23:46:40  jalet
41# Don't try to verify if module name is valid, Python does this better than us.
42#
43# Revision 1.6  2003/11/12 23:28:55  jalet
44# More work on new backend. This commit may be unstable.
45#
46# Revision 1.5  2003/10/07 09:07:28  jalet
47# Character encoding added to please latest version of Python
48#
49# Revision 1.4  2003/07/14 14:14:59  jalet
50# Old template
51#
52# Revision 1.3  2003/04/30 19:53:58  jalet
53# 1.05
54#
55# Revision 1.2  2003/04/30 13:36:40  jalet
56# Stupid accounting method was added.
57#
58# Revision 1.1  2003/04/29 18:37:54  jalet
59# Pluggable accounting methods (actually doesn't support external scripts)
60#
61#
62#
63
64import sys
65
66class PyKotaAccounterError(Exception):
67    """An exception for Accounter related stuff."""
68    def __init__(self, message = ""):
69        self.message = message
70        Exception.__init__(self, message)
71    def __repr__(self):
72        return self.message
73    __str__ = __repr__
74   
75class AccounterBase :   
76    """A class to account print usage by querying printers."""
77    def __init__(self, kotafilter, arguments) :
78        """Sets instance vars depending on the current printer."""
79        self.filter = kotafilter
80        self.arguments = arguments
81        self.isDelayed = 0      # Accounting is immediate by default
82       
83    def getLastPageCounter(self) :   
84        """Returns last internal page counter value (possibly faked)."""
85        try :
86            return self.LastPageCounter
87        except :   
88            return 0
89           
90    def beginJob(self, userpquota) :   
91        """Saves the computed job size."""
92        # computes job's size
93        self.JobSize = self.computeJobSize()
94        if ((self.filter.printingsystem == "CUPS") \
95            and (self.filter.preserveinputfile is not None)) \
96            or (self.filter.printingsystem != "CUPS") :
97                self.JobSize *= self.filter.copies
98       
99        # get last job information for this printer
100        if not userpquota.Printer.LastJob.Exists :
101            # The printer hasn't been used yet, from PyKota's point of view
102            self.LastPageCounter = 0
103        else :   
104            # get last job size and page counter from Quota Storage
105            # Last lifetime page counter before actual job is
106            # last page counter + last job size
107            self.LastPageCounter = int(userpquota.Printer.LastJob.PrinterPageCounter or 0) + int(userpquota.Printer.LastJob.JobSize or 0)
108       
109    def endJob(self, userpquota) :   
110        """Do nothing."""
111        pass
112       
113    def getJobSize(self) :   
114        """Returns the actual job size."""
115        try :
116            return self.JobSize
117        except AttributeError :   
118            return 0
119       
120    def doAccounting(self, userpquota) :
121        """Does accounting for current job."""
122        self.beginJob(userpquota)
123           
124        # Is the current user allowed to print at all ?
125        action = self.filter.warnUserPQuota(userpquota)
126       
127        # update the quota for the current user on this printer, if allowed to print
128        if action == "DENY" :
129            jobsize = 0
130        else :   
131            # get the job size
132            jobsize = self.getJobSize()
133            userpquota.increasePagesUsage(jobsize)
134       
135        # adds the current job to history   
136        jobprice = userpquota.computeJobPrice(jobsize)
137        userpquota.Printer.addJobToHistory(self.filter.jobid, userpquota.User, self.getLastPageCounter(), action, jobsize, jobprice, self.filter.preserveinputfile, self.filter.title, self.filter.copies, self.filter.options)
138        self.endJob(userpquota)
139        return action
140       
141    def computeJobSize(self) :   
142        """Must be overriden in children classes."""
143        raise RuntimeError, "AccounterBase.computeJobSize() must be overriden !"
144       
145       
146def openAccounter(kotafilter) :
147    """Returns a connection handle to the appropriate accounter."""
148    (backend, args) = kotafilter.config.getAccounterBackend(kotafilter.printername)
149    try :
150        exec "from pykota.accounters import %s as accounterbackend" % backend.lower()
151    except ImportError :
152        raise PyKotaAccounterError, _("Unsupported accounter backend %s") % backend
153    else :   
154        return accounterbackend.Accounter(kotafilter, args)
Note: See TracBrowser for help on using the browser.