root / pykota / trunk / bin / pkbcodes @ 2337

Revision 2337, 7.5 kB (checked in by jerome, 19 years ago)

The pkbcodes command line tool should be ok now, but the database
handling code still lacks support for the BillingCode? class (which
doesn't even exist yet)
Severity : still a work in progress.

  • 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
52  -D | --description d Adds a textual description to billing codes.
53
54  -l | --list          List informations about the billing codes.
55
56  -s | --reset         Resets the billing codes' balance and page counters
57                       to 0.
58
59  -s | --skipexisting  In combination with the --add option above, tells
60                       pkbcodes to not modify existing billing codes.
61
62  code1 through codeN can contain wildcards if the --add option
63  is not set.
64
65examples :                             
66
67  $ pkbcodes --add -D "My project" myproj
68
69  Will create the myproj billing code with "My project"
70  as the description.
71
72  $ pkbcodes --delete "*"
73
74  This will completely delete all the billing codes, but without
75  removing any matching job from the history. USE WITH CARE ANYWAY !
76 
77  $ pkbcodes --list "my*"
78 
79  This will list all billing codes which name begins with "my".
80 
81This program is free software; you can redistribute it and/or modify
82it under the terms of the GNU General Public License as published by
83the Free Software Foundation; either version 2 of the License, or
84(at your option) any later version.
85
86This program is distributed in the hope that it will be useful,
87but WITHOUT ANY WARRANTY; without even the implied warranty of
88MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
89GNU General Public License for more details.
90
91You should have received a copy of the GNU General Public License
92along with this program; if not, write to the Free Software
93Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
94
95Please e-mail bugs to: %s""")
96       
97class PKBcodes(PyKotaTool) :       
98    """A class for a billing codes manager."""
99    def main(self, names, options) :
100        """Manage billing codes."""
101        if (not self.config.isAdmin) and (not options["list"]) :
102            raise PyKotaToolError, "%s : %s" % (pwd.getpwuid(os.geteuid())[0], _("You're not allowed to use this command."))
103           
104        if options["list"] and not names :
105            names = ["*"]
106           
107        if options["add"] :   
108            billingcodes = []
109            for bname in names :
110                billingcode = self.storage.getBillingCode(bname)
111                if billingcode.Exists :
112                    if options["skipexisting"] :
113                        self.printInfo(_("Billing code [%s] already exists, skipping.") % billingcode.Name)
114                    else :   
115                        self.printInfo(_("Billing code [%s] already exists, will be modified.") % billingcode.Name)
116                        billingcodes.append(billingcode)
117                else :
118                    billingcode = self.storage.addBillingCode(bname)
119                    if not billingcode.Exists :
120                        raise PyKotaToolError, _("Impossible to add billingcode %s") % bname
121                    else :     
122                        billingcodes.append(billingcode)
123        else :       
124            billingcodes = self.storage.getMatchingBillingCodes(",".join(names))
125            if not billingcodes :
126                raise PyKotaToolError, _("There's no billingcode matching %s") % " ".join(names)
127                   
128        for billingcode in billingcodes :       
129            if options["delete"] :
130                billingcode.delete()
131            elif options["list"] :   
132                print "%s [%s] %s %s %s %.2f %s" % \
133                      (billingcode.Name, billingcode.Description, \
134                       billingcode.PageCounter, \
135                       _("pages"), \
136                       _("and"), \
137                       billingcode.Balance, \
138                       _("credits"))
139            else :   
140                if options["reset"] :
141                    billingcode.reset()   
142                if options["description"] is not None :
143                    billingcode.setDescription(options["description"].strip())
144                     
145if __name__ == "__main__" : 
146    retcode = 0
147    try :
148        short_options = "hvaD:dlrs"
149        long_options = ["help", "version", "add", "description=", "delete", "list", "reset", "skipexisting"]
150       
151        # Initializes the command line tool
152        manager = PKBcodes(doc=__doc__)
153        manager.deferredInit()
154       
155        # parse and checks the command line
156        (options, args) = manager.parseCommandline(sys.argv[1:], short_options, long_options)
157       
158        # sets long options
159        options["help"] = options["h"] or options["help"]
160        options["version"] = options["v"] or options["version"]
161        options["add"] = options["a"] or options["add"]
162        options["description"] = options["D"] or options["description"]
163        options["delete"] = options["d"] or options["delete"] 
164        options["list"] = options["l"] or options["list"]
165        options["reset"] = options["r"] or options["reset"]
166        options["skipexisting"] = options["s"] or options["skipexisting"]
167       
168        if options["help"] :
169            manager.display_usage_and_quit()
170        elif options["version"] :
171            manager.display_version_and_quit()
172        elif (options["delete"] and (options["add"] or options["reset"] or options["description"])) \
173           or (options["skipexisting"] and not options["add"]) \
174           or (options["list"] and (options["add"] or options["delete"] or options["reset"] or options["description"])) :
175            raise PyKotaToolError, _("incompatible options, see help.")
176        elif (not args) and (options["add"] or options["delete"]) :   
177            raise PyKotaToolError, _("You have to pass billing codes on the command line")
178        else :
179            retcode = manager.main(args, options)
180    except KeyboardInterrupt :       
181        sys.stderr.write("\nInterrupted with Ctrl+C !\n")
182    except SystemExit :       
183        pass
184    except :
185        try :
186            manager.crashed("pkbcodes failed")
187        except :   
188            crashed("pkbcodes failed")
189        retcode = -1
190
191    try :
192        manager.storage.close()
193    except (TypeError, NameError, AttributeError) :   
194        pass
195       
196    sys.exit(retcode)   
Note: See TracBrowser for help on using the browser.