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

Revision 1687, 5.7 kB (checked in by jalet, 20 years ago)

Introduction of the new 'onaccountererror' configuration directive.
Small fix for software accounter's return code which can't be None anymore.
Make software and hardware accounting code look similar : will be factorized
later.

  • 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.19  2004/08/31 23:29:53  jalet
25# Introduction of the new 'onaccountererror' configuration directive.
26# Small fix for software accounter's return code which can't be None anymore.
27# Make software and hardware accounting code look similar : will be factorized
28# later.
29#
30# Revision 1.18  2004/07/22 22:41:48  jalet
31# Hardware accounting for LPRng should be OK now. UNTESTED.
32#
33# Revision 1.17  2004/07/16 12:22:47  jalet
34# LPRng support early version
35#
36# Revision 1.16  2004/05/25 09:15:15  jalet
37# accounter.py : old code deleted
38# the rest : now exports PYKOTAPRECOMPUTEDJOBSIZE and PYKOTAPRECOMPUTEDJOBPRICE
39#
40# Revision 1.15  2004/05/24 22:45:49  jalet
41# New 'enforcement' directive added
42# Polling loop improvements
43#
44# Revision 1.14  2004/05/18 14:49:19  jalet
45# Big code changes to completely remove the need for "requester" directives,
46# jsut use "hardware(... your previous requester directive's content ...)"
47#
48# Revision 1.13  2004/01/12 22:43:40  jalet
49# New formula to compute a job's price
50#
51# Revision 1.12  2004/01/11 23:43:31  jalet
52# Bug wrt number of copies with CUPS should be fixed.
53#
54# Revision 1.11  2004/01/11 23:22:42  jalet
55# Major code refactoring, it's way cleaner, and now allows automated addition
56# of printers on first print.
57#
58# Revision 1.10  2004/01/08 14:10:32  jalet
59# Copyright year changed.
60#
61# Revision 1.9  2003/12/27 16:49:25  uid67467
62# Should be ok now.
63#
64# Revision 1.7  2003/11/25 23:46:40  jalet
65# Don't try to verify if module name is valid, Python does this better than us.
66#
67# Revision 1.6  2003/11/12 23:28:55  jalet
68# More work on new backend. This commit may be unstable.
69#
70# Revision 1.5  2003/10/07 09:07:28  jalet
71# Character encoding added to please latest version of Python
72#
73# Revision 1.4  2003/07/14 14:14:59  jalet
74# Old template
75#
76# Revision 1.3  2003/04/30 19:53:58  jalet
77# 1.05
78#
79# Revision 1.2  2003/04/30 13:36:40  jalet
80# Stupid accounting method was added.
81#
82# Revision 1.1  2003/04/29 18:37:54  jalet
83# Pluggable accounting methods (actually doesn't support external scripts)
84#
85#
86#
87
88import sys
89
90class PyKotaAccounterError(Exception):
91    """An exception for Accounter related stuff."""
92    def __init__(self, message = ""):
93        self.message = message
94        Exception.__init__(self, message)
95    def __repr__(self):
96        return self.message
97    __str__ = __repr__
98   
99class AccounterBase :   
100    """A class to account print usage by querying printers."""
101    def __init__(self, kotafilter, arguments) :
102        """Sets instance vars depending on the current printer."""
103        self.filter = kotafilter
104        self.arguments = arguments
105        self.onerror = self.filter.config.getPrinterOnAccounterError(self.filter.printername)
106        self.isSoftware = 1 # by default software accounting
107       
108    def getLastPageCounter(self) :   
109        """Returns last internal page counter value (possibly faked)."""
110        try :
111            return self.LastPageCounter or 0
112        except :   
113            return 0
114           
115    def beginJob(self, printer) :   
116        """Saves the computed job size."""
117        # computes job's size
118        self.JobSize = self.computeJobSize()
119        if ((self.filter.printingsystem == "CUPS") \
120            and (self.filter.preserveinputfile is not None)) \
121            or (self.filter.printingsystem != "CUPS") :
122                self.JobSize *= self.filter.copies
123       
124        # get last job information for this printer
125        if not printer.LastJob.Exists :
126            # The printer hasn't been used yet, from PyKota's point of view
127            self.LastPageCounter = 0
128        else :   
129            # get last job size and page counter from Quota Storage
130            # Last lifetime page counter before actual job is
131            # last page counter + last job size
132            self.LastPageCounter = int(printer.LastJob.PrinterPageCounter or 0) + int(printer.LastJob.JobSize or 0)
133       
134    def fakeBeginJob(self) :   
135        """Do nothing."""
136        pass
137       
138    def endJob(self, printer) :   
139        """Do nothing."""
140        pass
141       
142    def getJobSize(self) :   
143        """Returns the actual job size."""
144        try :
145            return self.JobSize
146        except AttributeError :   
147            return 0
148       
149    def computeJobSize(self) :   
150        """Must be overriden in children classes."""
151        raise RuntimeError, "AccounterBase.computeJobSize() must be overriden !"
152       
153def openAccounter(kotafilter) :
154    """Returns a connection handle to the appropriate accounter."""
155    (backend, args) = kotafilter.config.getAccounterBackend(kotafilter.printername)
156    try :
157        exec "from pykota.accounters import %s as accounterbackend" % backend.lower()
158    except ImportError :
159        raise PyKotaAccounterError, _("Unsupported accounter backend %s") % backend
160    else :   
161        return accounterbackend.Accounter(kotafilter, args)
Note: See TracBrowser for help on using the browser.