root / pykota / trunk / bin / pkbcodes @ 2342

Revision 2342, 7.7 kB (checked in by jerome, 19 years ago)

The pkbcodes command line tool now works fine with the PostgreSQL
backend. The dumpykota command can now dump billing codes too.
Still no code for LDAP though.
NB : a database upgrade is necessary AGAIN !
Severity : no need to play with this until there's LDAP support.

  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
Line 
1#! /usr/bin/env python
2# -*- coding: ISO-8859-15 -*-
3
4# PyKota Billing Codes manager
5#
6# PyKota - Print Quotas for CUPS and LPRng
7#
8# (c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
9# This program is free software; you can redistribute it and/or modify
10# it under the terms of the GNU General Public License as published by
11# the Free Software Foundation; either version 2 of the License, or
12# (at your option) any later version.
13#
14# This program is distributed in the hope that it will be useful,
15# but WITHOUT ANY WARRANTY; without even the implied warranty of
16# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17# GNU General Public License for more details.
18#
19# You should have received a copy of the GNU General Public License
20# along with this program; if not, write to the Free Software
21# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
22#
23# $Id$
24#
25#
26
27import os
28import sys
29import pwd
30
31from pykota.tool import PyKotaTool, PyKotaToolError, crashed, N_
32
33__doc__ = N_("""pkbcodes v%s (c) %s %s
34
35A billing codes Manager for PyKota.
36
37command line usage :
38
39  pkbcodes [options] code1 code2 code3 ... codeN
40
41options :
42
43  -v | --version       Prints pkbcodes version number then exits.
44  -h | --help          Prints this message then exits.
45 
46  -a | --add           Adds billing codes if they don't exist in PyKota's
47                       database. If they exist, they are modified
48                       unless -s|--skipexisting is also used.
49
50  -d | --delete        Deletes billing codes from PyKota's database.
51                       NB : the history entries with this billing code
52                       are not deleted, voluntarily.
53
54  -D | --description d Adds a textual description to billing codes.
55
56  -l | --list          List informations about the billing codes.
57
58  -s | --reset         Resets the billing codes' balance and page counters
59                       to 0.
60
61  -s | --skipexisting  In combination with the --add option above, tells
62                       pkbcodes to not modify existing billing codes.
63
64  code1 through codeN can contain wildcards if the --add option
65  is not set.
66
67examples :                             
68
69  $ pkbcodes --add -D "My project" myproj
70
71  Will create the myproj billing code with "My project"
72  as the description.
73
74  $ pkbcodes --delete "*"
75
76  This will completely delete all the billing codes, but without
77  removing any matching job from the history. USE WITH CARE ANYWAY !
78 
79  $ pkbcodes --list "my*"
80 
81  This will list all billing codes which name begins with "my".
82 
83This program is free software; you can redistribute it and/or modify
84it under the terms of the GNU General Public License as published by
85the Free Software Foundation; either version 2 of the License, or
86(at your option) any later version.
87
88This program is distributed in the hope that it will be useful,
89but WITHOUT ANY WARRANTY; without even the implied warranty of
90MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
91GNU General Public License for more details.
92
93You should have received a copy of the GNU General Public License
94along with this program; if not, write to the Free Software
95Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
96
97Please e-mail bugs to: %s""")
98       
99class PKBcodes(PyKotaTool) :       
100    """A class for a billing codes manager."""
101    def main(self, names, options) :
102        """Manage billing codes."""
103        if (not self.config.isAdmin) and (not options["list"]) :
104            raise PyKotaToolError, "%s : %s" % (pwd.getpwuid(os.geteuid())[0], _("You're not allowed to use this command."))
105           
106        if (options["list"] or options["reset"]) and not names :
107            names = ["*"]
108           
109        if options["add"] :   
110            billingcodes = []
111            for bname in names :
112                billingcode = self.storage.getBillingCode(bname)
113                if billingcode.Exists :
114                    if options["skipexisting"] :
115                        self.printInfo(_("Billing code [%s] already exists, skipping.") % billingcode.BillingCode)
116                    else :   
117                        self.printInfo(_("Billing code [%s] already exists, will be modified.") % billingcode.BillingCode)
118                        billingcodes.append(billingcode)
119                else :
120                    billingcode = self.storage.addBillingCode(bname)
121                    if not billingcode.Exists :
122                        raise PyKotaToolError, _("Impossible to add billingcode %s") % bname
123                    else :     
124                        billingcodes.append(billingcode)
125        else :       
126            billingcodes = self.storage.getMatchingBillingCodes(",".join(names))
127            if not billingcodes :
128                raise PyKotaToolError, _("There's no billingcode matching %s") % " ".join(names)
129                   
130        for billingcode in billingcodes :       
131            if options["delete"] :
132                billingcode.delete()
133            elif options["list"] :   
134                print "%s [%s] %s %s %s %.2f %s" % \
135                      (billingcode.BillingCode, billingcode.Description, \
136                       billingcode.PageCounter, \
137                       _("pages"), \
138                       _("and"), \
139                       billingcode.Balance, \
140                       _("credits"))
141            else :   
142                if options["reset"] :
143                    billingcode.reset()   
144                if options["description"] is not None :
145                    billingcode.setDescription(options["description"].strip())
146                     
147if __name__ == "__main__" : 
148    retcode = 0
149    try :
150        short_options = "hvaD:dlrs"
151        long_options = ["help", "version", "add", "description=", "delete", "list", "reset", "skipexisting"]
152       
153        # Initializes the command line tool
154        manager = PKBcodes(doc=__doc__)
155        manager.deferredInit()
156       
157        # parse and checks the command line
158        (options, args) = manager.parseCommandline(sys.argv[1:], short_options, long_options)
159       
160        # sets long options
161        options["help"] = options["h"] or options["help"]
162        options["version"] = options["v"] or options["version"]
163        options["add"] = options["a"] or options["add"]
164        options["description"] = options["D"] or options["description"]
165        options["delete"] = options["d"] or options["delete"] 
166        options["list"] = options["l"] or options["list"]
167        options["reset"] = options["r"] or options["reset"]
168        options["skipexisting"] = options["s"] or options["skipexisting"]
169       
170        if options["help"] :
171            manager.display_usage_and_quit()
172        elif options["version"] :
173            manager.display_version_and_quit()
174        elif (options["delete"] and (options["add"] or options["reset"] or options["description"])) \
175           or (options["skipexisting"] and not options["add"]) \
176           or (options["list"] and (options["add"] or options["delete"] or options["reset"] or options["description"])) :
177            raise PyKotaToolError, _("incompatible options, see help.")
178        elif (not args) and (options["add"] or options["delete"]) :   
179            raise PyKotaToolError, _("You have to pass billing codes on the command line")
180        else :
181            retcode = manager.main(args, options)
182    except KeyboardInterrupt :       
183        sys.stderr.write("\nInterrupted with Ctrl+C !\n")
184    except SystemExit :       
185        pass
186    except :
187        try :
188            manager.crashed("pkbcodes failed")
189        except :   
190            crashed("pkbcodes failed")
191        retcode = -1
192
193    try :
194        manager.storage.close()
195    except (TypeError, NameError, AttributeError) :   
196        pass
197       
198    sys.exit(retcode)   
Note: See TracBrowser for help on using the browser.