root / pykota / trunk / bin / pkbcodes @ 2512

Revision 2512, 7.2 kB (checked in by jerome, 19 years ago)

Ensure that human made errors (like incorrect command line options)
don't produce a traceback anymore. No need to frighten users with
such complete tracebacks and email reporting each time they mistype
some command.
Makes pykosd check more carefully the values of its command line options.

  • 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, PyKotaCommandLineError, crashed, N_
32
33__doc__ = N_("""pkbcodes v%(__version__)s (c) %(__years__)s %(__author__)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""")
83       
84class PKBcodes(PyKotaTool) :       
85    """A class for a billing codes manager."""
86    def main(self, names, options) :
87        """Manage billing codes."""
88        if (not self.config.isAdmin) and (not options["list"]) :
89            raise PyKotaCommandLineError, "%s : %s" % (pwd.getpwuid(os.geteuid())[0], _("You're not allowed to use this command."))
90           
91        if (options["list"] or options["reset"]) and not names :
92            names = ["*"]
93           
94        if options["add"] :   
95            billingcodes = []
96            for bname in names :
97                billingcode = self.storage.getBillingCode(bname)
98                if billingcode.Exists :
99                    if options["skipexisting"] :
100                        self.printInfo(_("Billing code [%s] already exists, skipping.") % billingcode.BillingCode)
101                    else :   
102                        self.printInfo(_("Billing code [%s] already exists, will be modified.") % billingcode.BillingCode)
103                        billingcodes.append(billingcode)
104                else :
105                    billingcode = self.storage.addBillingCode(bname)
106                    if not billingcode.Exists :
107                        raise PyKotaToolError, _("Impossible to add billingcode %s") % bname
108                    else :     
109                        billingcodes.append(billingcode)
110        else :       
111            billingcodes = self.storage.getMatchingBillingCodes(",".join(names))
112            if not billingcodes :
113                raise PyKotaCommandLineError, _("There's no billingcode matching %s") % " ".join(names)
114                   
115        for billingcode in billingcodes :       
116            if options["delete"] :
117                billingcode.delete()
118            elif options["list"] :   
119                print "%s [%s] %s %s %s %.2f %s" % \
120                      (billingcode.BillingCode, billingcode.Description, \
121                       billingcode.PageCounter, \
122                       _("pages"), \
123                       _("and"), \
124                       billingcode.Balance, \
125                       _("credits"))
126            else :   
127                if options["reset"] :
128                    billingcode.reset()   
129                if options["description"] is not None :
130                    billingcode.setDescription(options["description"].strip())
131                     
132if __name__ == "__main__" : 
133    retcode = 0
134    try :
135        short_options = "hvaD:dlrs"
136        long_options = ["help", "version", "add", "description=", "delete", "list", "reset", "skipexisting"]
137       
138        # Initializes the command line tool
139        manager = PKBcodes(doc=__doc__)
140        manager.deferredInit()
141       
142        # parse and checks the command line
143        (options, args) = manager.parseCommandline(sys.argv[1:], short_options, long_options)
144       
145        # sets long options
146        options["help"] = options["h"] or options["help"]
147        options["version"] = options["v"] or options["version"]
148        options["add"] = options["a"] or options["add"]
149        options["description"] = options["D"] or options["description"]
150        options["delete"] = options["d"] or options["delete"] 
151        options["list"] = options["l"] or options["list"]
152        options["reset"] = options["r"] or options["reset"]
153        options["skipexisting"] = options["s"] or options["skipexisting"]
154       
155        if options["help"] :
156            manager.display_usage_and_quit()
157        elif options["version"] :
158            manager.display_version_and_quit()
159        elif (options["delete"] and (options["add"] or options["reset"] or options["description"])) \
160           or (options["skipexisting"] and not options["add"]) \
161           or (options["list"] and (options["add"] or options["delete"] or options["reset"] or options["description"])) :
162            raise PyKotaCommandLineError, _("incompatible options, see help.")
163        elif (not args) and (options["add"] or options["delete"]) :   
164            raise PyKotaCommandLineError, _("You have to pass billing codes on the command line")
165        else :
166            retcode = manager.main(args, options)
167    except KeyboardInterrupt :       
168        sys.stderr.write("\nInterrupted with Ctrl+C !\n")
169    except PyKotaCommandLineError, msg :   
170        sys.stderr.write("%s : %s\n" % (sys.argv[0], msg))
171    except SystemExit :       
172        pass
173    except :
174        try :
175            manager.crashed("pkbcodes failed")
176        except :   
177            crashed("pkbcodes failed")
178        retcode = -1
179
180    try :
181        manager.storage.close()
182    except (TypeError, NameError, AttributeError) :   
183        pass
184       
185    sys.exit(retcode)   
Note: See TracBrowser for help on using the browser.