root / pykota / trunk / bin / edpykota @ 1796

Revision 1796, 30.5 kB (checked in by jalet, 20 years ago)

Renders help translatable

  • Property svn:eol-style set to native
  • 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 Print Quota Editor
5#
6# PyKota - Print Quotas for CUPS and LPRng
7#
8# (c) 2003-2004 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
22#
23# $Id$
24#
25# $Log$
26# Revision 1.79  2004/10/11 12:49:06  jalet
27# Renders help translatable
28#
29# Revision 1.78  2004/10/07 14:35:40  jalet
30# Now edpykota refuses to launch if the user is not a PyKota administrator.
31# dumpykota : now has the same error message than edpykota in this case.
32#
33# Revision 1.77  2004/09/28 17:45:31  jalet
34# Added the --hardreset command line option to edpykota
35#
36# Revision 1.76  2004/07/01 19:56:40  jalet
37# Better dispatching of error messages
38#
39# Revision 1.75  2004/06/18 13:34:47  jalet
40# Now all tracebacks include PyKota's version number
41#
42# Revision 1.74  2004/06/07 18:43:40  jalet
43# Fixed over-verbose exits when displaying help or version number
44#
45# Revision 1.73  2004/06/03 21:50:34  jalet
46# Improved error logging.
47# crashrecipient directive added.
48# Now exports the job's size in bytes too.
49#
50# Revision 1.72  2004/04/16 16:20:19  jalet
51# Note about not implemented limitby values
52#
53# Revision 1.71  2004/03/24 15:15:24  jalet
54# Began integration of Henrik Janhagen's work on quota-then-balance
55# and balance-then-quota
56#
57# Revision 1.70  2004/02/27 09:23:21  jalet
58# Minor code reorganisation
59#
60# Revision 1.69  2004/02/19 15:05:56  jalet
61# domain names changed to example.com in the doc, according to RFC2606
62#
63# Revision 1.68  2004/01/28 10:05:22  jalet
64# New user/group deletion code
65#
66# Revision 1.67  2004/01/15 11:19:07  jalet
67# Typos in messages wrt gettext.
68#
69# Revision 1.66  2004/01/12 21:54:36  jalet
70# User's email address can now be set at user's creation time.
71#
72# Revision 1.65  2004/01/08 16:24:49  jalet
73# edpykota now supports adding printers to printer groups.
74#
75# Revision 1.64  2004/01/08 14:10:32  jalet
76# Copyright year changed.
77#
78# Revision 1.63  2003/11/24 16:50:58  jalet
79# Old help message deletedd
80#
81# Revision 1.62  2003/11/12 23:28:38  jalet
82# More work on new backend. This commit may be unstable.
83#
84# Revision 1.61  2003/11/12 13:06:35  jalet
85# Bug fix wrt no user/group name command line argument to edpykota
86#
87# Revision 1.60  2003/10/09 21:25:24  jalet
88# Multiple printer names or wildcards can be passed on the command line
89# separated with commas.
90# Beta phase.
91#
92# Revision 1.59  2003/10/07 09:07:27  jalet
93# Character encoding added to please latest version of Python
94#
95# Revision 1.58  2003/10/03 12:27:01  jalet
96# Several optimizations, especially with LDAP backend
97#
98# Revision 1.57  2003/08/20 16:01:19  jalet
99# Comment added.
100#
101# Revision 1.56  2003/07/29 20:55:17  jalet
102# 1.14 is out !
103#
104# Revision 1.55  2003/07/28 09:11:12  jalet
105# PyKota now tries to add its attributes intelligently in existing LDAP
106# directories.
107#
108# Revision 1.54  2003/07/21 06:32:42  jalet
109# Prevents email messages to be sent at modification/creation time for
110# a user/group quota
111#
112# Revision 1.53  2003/07/09 06:03:41  jalet
113# Fixed typo when using edpykota --prototype
114#
115# Revision 1.52  2003/07/07 12:11:13  jalet
116# Small fix
117#
118# Revision 1.51  2003/07/07 11:55:50  jalet
119# Small fix
120#
121# Revision 1.50  2003/07/05 12:33:53  jalet
122# More on previous fix.
123#
124# Revision 1.49  2003/07/05 12:32:07  jalet
125# Ensure that the user don't pass more than two prices for a printer.
126#
127# Revision 1.48  2003/06/25 19:52:30  jalet
128# Should be ready for testing :-)
129#
130# Revision 1.47  2003/06/25 14:10:01  jalet
131# Hey, it may work (edpykota --reset excepted) !
132#
133# Revision 1.46  2003/06/16 11:59:09  jalet
134# More work on LDAP
135#
136# Revision 1.45  2003/06/11 19:32:00  jalet
137# Severe bug wrt account balance setting should be corrected.
138#
139# Revision 1.44  2003/04/29 22:03:38  jalet
140# Better error handling.
141#
142# Revision 1.43  2003/04/23 22:13:56  jalet
143# Preliminary support for LPRng added BUT STILL UNTESTED.
144#
145# Revision 1.42  2003/04/17 13:38:47  jalet
146# Docstring corrected for better manual page
147#
148# Revision 1.41  2003/04/16 12:35:49  jalet
149# Groups quota work now !
150#
151# Revision 1.40  2003/04/16 08:22:09  jalet
152# More strict error detection.
153# Minor code rewrite to avoid some repetitive tests.
154#
155# Revision 1.39  2003/04/16 08:01:53  jalet
156# edpykota --charge command line option works now.
157#
158# Revision 1.38  2003/04/15 22:02:43  jalet
159# More complete docstring
160#
161# Revision 1.37  2003/04/15 21:58:33  jalet
162# edpykota now accepts a --delete option.
163# Preparation to allow edpykota to accept much more command line options
164# (WARNING : docstring is OK, but code isn't !)
165#
166# Revision 1.36  2003/04/15 13:55:28  jalet
167# Options --limitby and --balance added to edpykota
168#
169# Revision 1.35  2003/04/15 13:06:39  jalet
170# Allow to add a printer without any user
171#
172# Revision 1.34  2003/04/11 16:51:11  jalet
173# Bug fix for edpykota --add with users who already had a quota on the printer.
174#
175# Revision 1.33  2003/04/10 21:47:20  jalet
176# Job history added. Upgrade script neutralized for now !
177#
178# Revision 1.32  2003/04/08 21:31:39  jalet
179# (anything or 0) = anything !!! Go back to school Jerome !
180#
181# Revision 1.31  2003/04/08 21:13:44  jalet
182# Prepare --groups option to work.
183#
184# Revision 1.30  2003/04/08 21:10:18  jalet
185# Checks --groups option presence instead of --users because --users is the default.
186#
187# Revision 1.29  2003/04/05 09:28:56  jalet
188# Unnecessary message was logged
189#
190# Revision 1.28  2003/03/29 13:45:26  jalet
191# GPL paragraphs were incorrectly (from memory) copied into the sources.
192# Two README files were added.
193# Upgrade script for PostgreSQL pre 1.01 schema was added.
194#
195# Revision 1.27  2003/03/10 00:23:04  jalet
196# Bad english
197#
198# Revision 1.26  2003/03/10 00:11:27  jalet
199# Cleaner example.
200#
201# Revision 1.25  2003/03/09 23:56:21  jalet
202# Option noquota added to do accounting only.
203#
204# Revision 1.24  2003/02/27 23:48:41  jalet
205# Correctly maps PyKota's log levels to syslog log levels
206#
207# Revision 1.23  2003/02/27 22:55:20  jalet
208# WARN log priority doesn't exist.
209#
210# Revision 1.22  2003/02/27 09:37:02  jalet
211# Wildcards seem to work now
212#
213# Revision 1.21  2003/02/27 09:04:46  jalet
214# user and group names can be passed as wildcards if the --add option
215# is not set. The default is to act on all users or groups.
216#
217# Revision 1.20  2003/02/10 12:07:30  jalet
218# Now repykota should output the recorded total page number for each printer too.
219#
220# Revision 1.19  2003/02/09 13:40:29  jalet
221# typo
222#
223# Revision 1.18  2003/02/09 12:56:53  jalet
224# Internationalization begins...
225#
226# Revision 1.17  2003/02/08 22:47:23  jalet
227# Option --reset can now be used without having to use soft and hard limits
228# on the command line.
229#
230# Revision 1.16  2003/02/08 22:39:46  jalet
231# --reset command line option added
232#
233# Revision 1.15  2003/02/08 22:20:01  jalet
234# Clarification on why we don't check with /etc/passwd to see if the user
235# name is valid or not.
236#
237# Revision 1.14  2003/02/08 22:18:15  jalet
238# Now checks user and group names for validity before adding them
239#
240# Revision 1.13  2003/02/08 22:09:02  jalet
241# Only printer was added the first time.
242#
243# Revision 1.12  2003/02/08 21:44:49  jalet
244# Python 2.1 string module doesn't define ascii_letters
245#
246# Revision 1.11  2003/02/08 09:42:44  jalet
247# Better handle wrong or bad command line arguments
248#
249# Revision 1.10  2003/02/08 09:39:20  jalet
250# typos
251#
252# Revision 1.9  2003/02/08 09:38:06  jalet
253# Badly placed test
254#
255# Revision 1.8  2003/02/07 22:53:57  jalet
256# Checks if printer name is valid before adding it
257#
258# Revision 1.7  2003/02/07 22:17:58  jalet
259# Incomplete test
260#
261# Revision 1.6  2003/02/07 22:13:13  jalet
262# Perhaps edpykota is now able to add printers !!! Oh, stupid me !
263#
264# Revision 1.5  2003/02/06 14:49:04  jalet
265# edpykota should be ok now
266#
267# Revision 1.4  2003/02/06 14:28:59  jalet
268# edpykota should be ok, minus some typos
269#
270# Revision 1.3  2003/02/06 10:47:21  jalet
271# Documentation string and command line options didn't match.
272#
273# Revision 1.2  2003/02/06 10:39:23  jalet
274# Preliminary edpykota work.
275#
276# Revision 1.1  2003/02/05 21:41:09  jalet
277# Skeletons added for all command line tools
278#
279#
280#
281
282import sys
283
284from pykota import version
285from pykota.tool import PyKotaTool, PyKotaToolError, crashed, N_
286from pykota.config import PyKotaConfigError
287from pykota.storage import PyKotaStorageError
288
289__doc__ = N_("""edpykota v%s (c) 2003-2004 C@LL - Conseil Internet & Logiciels Libres
290A Print Quota editor for PyKota.
291
292command line usage :
293
294  edpykota [options] user1 user2 ... userN
295 
296  edpykota [options] group1 group2 ... groupN
297
298options :
299
300  -v | --version       Prints edpykota's version number then exits.
301  -h | --help          Prints this message then exits.
302 
303  -a | --add           Adds users and/or printers if they don't
304                       exist on the Quota Storage Server.
305                       
306  -d | --delete        Deletes users/groups from the quota storage.
307                       Printers are never deleted.
308                       
309  -c | --charge p[,j]  Sets the price per page and per job to charge
310                       for a particular printer. Job price is optional.
311                       If both are to be set, separate them with a comma.
312                       Floating point values are allowed.
313 
314  -i | --ingroups g1[,g2...]  Puts the users into each of the groups
315                              listed, separated by commas. The groups
316                              must already exist in the Quota Storage.
317 
318  -u | --users         Edit users print quotas, this is the default.
319 
320  -P | --printer p     Edit quotas on printer p only. Actually p can
321                       use wildcards characters to select only
322                       some printers. The default value is *, meaning
323                       all printers.
324                       You can specify several names or wildcards,
325                       by separating them with commas.
326 
327  -G | --pgroups pg1[,pg2...] Adds the printer(s) to the printer groups
328                       pg1, pg2, etc... which must already exist.
329                       A printer group is just like a normal printer,
330                       only that it is usually unknown from the printing
331                       system. Create printer groups exactly the same
332                       way that you create printers, then add other
333                       printers to them with this option.
334                       Accounting is done on a printer and on all
335                       the printer groups it belongs to, quota checking
336                       is done on a printer and on all the printer groups
337                       it belongs to.
338 
339  -g | --groups        Edit users groups print quotas instead of users.
340                         
341  -p | --prototype u|g Uses user u or group g as a prototype to set
342                       print quotas
343                       
344  -n | --noquota       Doesn't set a quota but only does accounting.
345 
346  -r | --reset         Resets the actual page counter for the user
347                       or group to zero on the specified printers.
348                       The life time page counter is kept unchanged.
349                       
350  -R | --hardreset     Resets the actual and life time page counters
351                       for the user or group to zero on the specified
352                       printers.
353                       
354  -l | --limitby l     Choose if the user/group is limited in printing                     
355                       by its account balance or by its page quota.
356                       The default value is 'quota'. Allowed values
357                       are 'quota' 'balance' 'quota-then-balance' and
358                       'balance-then-quota'.
359                       WARNING : quota-then-balance and balance-then-quota
360                       are not yet implemented.
361                       
362  -b | --balance b     Sets the user's account balance to b.                     
363                       Account balance may be increase or decreased
364                       if b is prefixed with + or -.
365                       WARNING : when decreasing account balance,
366                       the total paid so far by the user is decreased
367                       too.
368                       Groups don't have a real balance, but the
369                       sum of their users' account balance.
370                       
371  -S | --softlimit sl  Sets the quota soft limit to sl pages.                       
372 
373  -H | --hardlimit hl  Sets the quota hard limit to hl pages.
374 
375  user1 through userN and group1 through groupN can use wildcards
376  if the --add option is not set.
377 
378examples :                             
379
380  $ edpykota --add -p jerome john paul george ringo/ringo@example.com
381 
382  This will add users john, paul, george and ringo to the quota
383  database, and set their print quotas to the same values than user
384  jerome. User jerome must already exist.
385  User ringo's email address will also be set to 'ringo@example.com'
386 
387  $ edpykota --printer lp -S 50 -H 60 jerome
388 
389  This will set jerome's print quota on the lp printer to a soft limit
390  of 50 pages, and a hard limit of 60 pages. If either user jerome or
391  printer lp doesn't exist on the Quota Storage Server then nothing is done.
392
393  $ edpykota --add --printer lp --ingroups coders,it -S 50 -H 60 jerome
394 
395  Same as above, but if either user jerome or printer lp doesn't exist
396  on the Quota Storage Server they are automatically added. Also
397  user jerome is put into the groups "coders" and "it" which must
398  already exist in the Quota Storage.
399           
400  $ edpykota -g -S 500 -H 550 financial support           
401 
402  This will set print quota soft limit to 500 pages and hard limit
403  to 550 pages for groups financial and support on all printers.
404 
405  $ edpykota --reset jerome "jo*"
406 
407  This will reset jerome's page counter to zero on all printers, as
408  well as every user whose name begins with 'jo'.
409  Their life time page counter on each printer will be kept unchanged.
410  You can also reset the life time page counters by using the
411  --hardreset | -R command line option.
412 
413  $ edpykota --printer hpcolor --noquota jerome
414 
415  This will tell PyKota to not limit jerome when printing on the
416  hpcolor printer. All his jobs will be allowed on this printer, but
417  accounting of the pages he prints will still be kept.
418  Print Quotas for jerome on other printers are unchanged.
419 
420  $ edpykota --limitby balance jerome
421 
422  This will tell PyKota to limit jerome by his account's balance
423  when printing.
424 
425  $ edpykota --balance +10.0 jerome
426 
427  This will increase jerome's account balance by 10.0 (in your
428  own currency). You can decrease the account balance with a
429  dash prefix, and set it to a fixed amount with no prefix.
430 
431  $ edpykota --delete jerome rachel
432 
433  This will completely delete jerome and rachel from the Quota Storage
434  database. All their quotas and jobs will be deleted too.
435 
436  $ edpykota --printer lp --charge 0.1
437 
438  This will set the page price for printer lp to 0.1. Job price
439  will not be changed.
440 
441  $ edpykota --printer hplj1,hplj2 --pgroups Laser,HP
442 
443  This will put printers hplj1 and hplj2 in printers groups Laser and HP.
444  When printing either on hplj1 or hplj2, print quota will also be
445  checked and accounted for on virtual printers Laser and HP.
446
447This program is free software; you can redistribute it and/or modify
448it under the terms of the GNU General Public License as published by
449the Free Software Foundation; either version 2 of the License, or
450(at your option) any later version.
451
452This program is distributed in the hope that it will be useful,
453but WITHOUT ANY WARRANTY; without even the implied warranty of
454MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
455GNU General Public License for more details.
456
457You should have received a copy of the GNU General Public License
458along with this program; if not, write to the Free Software
459Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
460
461Please e-mail bugs to: %s""") % (version.__version__, version.__author__)
462       
463class EdPyKota(PyKotaTool) :       
464    """A class for edpykota."""
465    def main(self, names, options) :
466        """Edit user or group quotas."""
467        if not self.config.isAdmin :
468            raise PyKotaToolError, _("You're not allowed to use this command.")
469       
470        suffix = (options["groups"] and "Group") or "User"       
471       
472        softlimit = hardlimit = None   
473        if not options["noquota"] :
474            if options["softlimit"] :
475                try :
476                    softlimit = int(options["softlimit"].strip())
477                except ValueError :   
478                    raise PyKotaToolError, _("Invalid softlimit value %s.") % options["softlimit"]
479            if options["hardlimit"] :
480                try :
481                    hardlimit = int(options["hardlimit"].strip())
482                except ValueError :   
483                    raise PyKotaToolError, _("Invalid hardlimit value %s.") % options["hardlimit"]
484            if (softlimit is not None) and (hardlimit is not None) and (hardlimit < softlimit) :       
485                # error, exchange them
486                self.printInfo(_("Hard limit %i is less than soft limit %i, values will be exchanged.") % (hardlimit, softlimit))
487                (softlimit, hardlimit) = (hardlimit, softlimit)
488           
489        balance = options["balance"]
490        if balance :
491            balance = balance.strip()
492            try :
493                balancevalue = float(balance)
494            except ValueError :   
495                raise PyKotaToolError, _("Invalid balance value %s") % options["balance"]
496           
497        if options["charge"] :
498            try :
499                charges = [float(part) for part in options["charge"].split(',', 1)]
500            except ValueError :   
501                raise PyKotaToolError, _("Invalid charge amount value %s") % options["charge"]
502            else :   
503                if len(charges) > 2 :
504                    charges = charges[:2]
505                if len(charges) != 2 :
506                    charges = [charges[0], None]
507                   
508        limitby = options["limitby"]
509        if limitby :
510            limitby = limitby.strip().lower()
511        if limitby and (limitby not in ('quota', 'balance', 'quota-then-balance', 'balance-then-quota')) :   
512            raise PyKotaToolError, _("Invalid limitby value %s") % options["limitby"]
513           
514        if options["ingroups"] :   
515            groupnames = [gname.strip() for gname in options["ingroups"].split(',')]
516        else :   
517            groupnames = []
518           
519        if options["prototype"] :   
520            protoentry = getattr(self.storage, "get%s" % suffix)(options["prototype"])
521           
522        printeradded = 0
523        printers = self.storage.getMatchingPrinters(options["printer"])
524        if not printers :
525            pname = options["printer"]
526            if options["add"] and pname :
527                if self.isValidName(pname) :
528                    printers = [ self.storage.addPrinter(pname) ]
529                    if printers[0].Exists :
530                        printeradded = 1
531                    else :   
532                        raise PyKotaToolError, _("Impossible to add printer %s") % pname
533                else :   
534                    raise PyKotaToolError, _("Invalid printer name %s") % pname
535            else :
536                raise PyKotaToolError, _("There's no printer matching %s") % pname
537        if not names :   
538            if options["add"] :
539                if not printeradded :
540                    raise PyKotaToolError, _("You have to pass user or group names on the command line")
541                else :   
542                    names = getattr(self.storage, "getAll%ssNames" % suffix)()
543            else :   
544                names = [ "*" ] # all users
545               
546        printersgroups = []       
547        if options["pgroups"] :       
548            printersgroups = self.storage.getMatchingPrinters(options["pgroups"])
549           
550        todelete = {}   
551        changed = {} # tracks changes made at the user/group level
552        for printer in printers :
553            for pgroup in printersgroups :
554                pgroup.addPrinterToGroup(printer)   
555               
556            if options["charge"] :
557                (perpage, perjob) = charges
558                printer.setPrices(perpage, perjob)   
559               
560            if options["prototype"] :
561                if protoentry.Exists :
562                    protoquota = getattr(self.storage, "get%sPQuota" % suffix)(protoentry, printer)
563                    if not protoquota.Exists :
564                        self.printInfo(_("Prototype %s not found in Quota Storage for printer %s.") % (protoentry.Name, printer.Name))
565                        continue    # skip this printer
566                    else :   
567                        (softlimit, hardlimit) = (protoquota.SoftLimit, protoquota.HardLimit)
568                else :       
569                    self.printInfo(_("Prototype object %s not found in Quota Storage.") % protoentry.Name)
570                   
571            if not options["noquota"] :   
572                if hardlimit is None :   
573                    hardlimit = softlimit
574                    if hardlimit is not None :
575                        self.printInfo(_("Undefined hard limit set to soft limit (%s) on printer %s.") % (str(hardlimit), printer.Name))
576                if softlimit is None :   
577                    softlimit = hardlimit
578                    if softlimit is not None :
579                        self.printInfo(_("Undefined soft limit set to hard limit (%s) on printer %s.") % (str(softlimit), printer.Name))
580                       
581            if options["add"] :   
582                allentries = []   
583                for name in names :
584                    email = ""
585                    if not options["groups"] :
586                        splitname = name.split('/', 1)     # username/email
587                        if len(splitname) == 1 :
588                            splitname.append("")
589                        (name, email) = splitname
590                        if email and (email.count('@') != 1) :
591                            self.printInfo(_("Invalid email address %s") % email)
592                            email = ""
593                    entry = getattr(self.storage, "get%s" % suffix)(name)
594                    if email and not options["groups"] :
595                        entry.Email = email
596                    entrypquota = getattr(self.storage, "get%sPQuota" % suffix)(entry, printer)
597                    allentries.append((entry, entrypquota))
598            else :   
599                allentries = getattr(self.storage, "getPrinter%ssAndQuotas" % suffix)(printer, names)
600               
601            for (entry, entrypquota) in allentries :
602                if not changed.has_key(entry.Name) :
603                    changed[entry.Name] = {}
604                    if not options["groups"] :
605                        changed[entry.Name]["ingroups"] = []
606                       
607                if not entry.Exists :       
608                    # not found
609                    if options["add"] :
610                        # In case we want to add something, it is crucial
611                        # that we DON'T check with the system accounts files
612                        # like /etc/passwd because users may be defined
613                        # only remotely
614                        if self.isValidName(entry.Name) :
615                            entry = getattr(self.storage, "add%s" % suffix)(entry)
616                        else :   
617                            if options["groups"] :
618                                self.printInfo(_("Invalid group name %s") % entry.Name)
619                            else :   
620                                self.printInfo(_("Invalid user name %s") % entry.Name)
621                elif options["delete"] :               
622                    todelete[entry.Name] = entry
623                               
624                if entry.Exists and (not entrypquota.Exists) :
625                    # not found
626                    if options["add"] :
627                        entrypquota = getattr(self.storage, "add%sPQuota" % suffix)(entry, printer)
628                       
629                if not entrypquota.Exists :     
630                    self.printInfo(_("Quota not found for object %s on printer %s.") % (entry.Name, printer.Name))
631                else :   
632                    if options["noquota"] or options["prototype"] or ((softlimit is not None) and (hardlimit is not None)) :
633                        entrypquota.setLimits(softlimit, hardlimit)
634                    if limitby :
635                        if changed[entry.Name].get("limitby") is None :
636                            entry.setLimitBy(limitby)
637                            changed[entry.Name]["limitby"] = limitby
638                   
639                    if not options["groups"] :
640                        if options["reset"] :
641                            entrypquota.reset()
642                        elif options["hardreset"] :   
643                            entrypquota.hardreset()
644                           
645                        if balance :
646                            if changed[entry.Name].get("balance") is None :
647                                if balance.startswith("+") or balance.startswith("-") :
648                                    newbalance = float(entry.AccountBalance or 0.0) + balancevalue
649                                    newlifetimepaid = float(entry.LifeTimePaid or 0.0) + balancevalue
650                                    entry.setAccountBalance(newbalance, newlifetimepaid)
651                                else :
652                                    diff = balancevalue - float(entry.AccountBalance or 0.0)
653                                    newlifetimepaid = float(entry.LifeTimePaid or 0.0) + diff
654                                    entry.setAccountBalance(balancevalue, newlifetimepaid)
655                                changed[entry.Name]["balance"] = balance
656                               
657                        for groupname in groupnames :       
658                            # not executed if option --ingroups is not used
659                            if groupname not in changed[entry.Name]["ingroups"] :
660                                group = self.storage.getGroup(groupname)
661                                if group.Exists :
662                                    self.storage.addUserToGroup(entry, group)
663                                    changed[entry.Name]["ingroups"].append(groupname)
664                                else :
665                                    self.printInfo(_("Group %s not found in the PyKota Storage.") % groupname)
666                                   
667                    # This line disabled to prevent sending of unwanted email                 
668                    # messages if quota is reached at creation/modification time.
669                    # The check will be done at print time anyway.
670                    # getattr(self, "warn%sPQuota" % suffix)(entrypquota)   
671                       
672        # Now delete what has to be deleted               
673        for (name, entry) in todelete.items() :               
674            entry.delete()
675                     
676if __name__ == "__main__" : 
677    retcode = 0
678    try :
679        defaults = { \
680                     "printer" : "*", \
681                   }
682        short_options = "vhdc:l:b:i:naugrp:P:S:H:G:R"
683        long_options = ["help", "version", "charge=", "delete", "limitby=", "balance=", "ingroups=", "noquota", "add", "users", "groups", "reset", "hardreset", "prototype=", "printer=", "softlimit=", "hardlimit=", "pgroups="]
684       
685        # Initializes the command line tool
686        editor = EdPyKota(doc=__doc__)
687       
688        # parse and checks the command line
689        (options, args) = editor.parseCommandline(sys.argv[1:], short_options, long_options)
690       
691        # sets long options
692        options["help"] = options["h"] or options["help"]
693        options["version"] = options["v"] or options["version"]
694        options["add"] = options["a"] or options["add"]
695        options["users"] = options["u"] or options["users"]
696        options["groups"] = options["g"] or options["groups"]
697        options["prototype"] = options["p"] or options["prototype"]
698        options["printer"] = options["P"] or options["printer"] or defaults["printer"]
699        options["softlimit"] = options["S"] or options["softlimit"]
700        options["hardlimit"] = options["H"] or options["hardlimit"] 
701        options["reset"] = options["r"] or options["reset"] 
702        options["noquota"] = options["n"] or options["noquota"]
703        options["limitby"] = options["l"] or options["limitby"]
704        options["balance"] = options["b"] or options["balance"] 
705        options["delete"] = options["d"] or options["delete"] 
706        options["ingroups"] = options["i"] or options["ingroups"]
707        options["charge"] = options["c"] or options["charge"]
708        options["pgroups"] = options["G"] or options["pgroups"]
709        options["hardreset"] = options["R"] or options["hardreset"] 
710       
711        if options["help"] :
712            editor.display_usage_and_quit()
713        elif options["version"] :
714            editor.display_version_and_quit()
715        elif options["users"] and options["groups"] :   
716            raise PyKotaToolError, _("incompatible options, see help.")
717        elif (options["add"] or options["prototype"]) and options["delete"] :   
718            raise PyKotaToolError, _("incompatible options, see help.")
719        elif (options["softlimit"] or options["hardlimit"]) and options["prototype"] :   
720            raise PyKotaToolError, _("incompatible options, see help.")
721        elif options["noquota"] and (options["prototype"] or options["hardlimit"] or options["softlimit"]) :
722            raise PyKotaToolError, _("incompatible options, see help.")
723        elif options["groups"] and (options["balance"] or options["ingroups"]) :
724            raise PyKotaToolError, _("incompatible options, see help.")
725        else :
726            retcode = editor.main(args, options)
727    except SystemExit :       
728        pass
729    except :
730        try :
731            editor.crashed("edpykota failed")
732        except :   
733            crashed("edpykota failed")
734        retcode = -1
735
736    try :
737        editor.storage.close()
738    except (TypeError, NameError, AttributeError) :   
739        pass
740       
741    sys.exit(retcode)   
Note: See TracBrowser for help on using the browser.