root / pykota / trunk / pykota / storages / sql.py @ 729

Revision 729, 8.1 kB (checked in by jalet, 21 years ago)

warnpykota doesn't need any user/group name argument, mimicing the
warnquota disk quota tool.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1# PyKota
2#
3# PyKota : Print Quotas for CUPS
4#
5# (c) 2003 Jerome Alet <alet@librelogiciel.com>
6# You're welcome to redistribute this software under the
7# terms of the GNU General Public Licence version 2.0
8# or, at your option, any higher version.
9#
10# You can read the complete GNU GPL in the file COPYING
11# which should come along with this software, or visit
12# the Free Software Foundation's WEB site http://www.fsf.org
13#
14# $Id$
15#
16# $Log$
17# Revision 1.12  2003/02/06 23:20:03  jalet
18# warnpykota doesn't need any user/group name argument, mimicing the
19# warnquota disk quota tool.
20#
21# Revision 1.11  2003/02/06 15:05:13  jalet
22# self was forgotten
23#
24# Revision 1.10  2003/02/06 15:03:11  jalet
25# added a method to set the limit date
26#
27# Revision 1.9  2003/02/06 14:52:35  jalet
28# Forgotten import
29#
30# Revision 1.8  2003/02/06 14:49:04  jalet
31# edpykota should be ok now
32#
33# Revision 1.7  2003/02/06 14:28:59  jalet
34# edpykota should be ok, minus some typos
35#
36# Revision 1.6  2003/02/06 09:19:02  jalet
37# More robust behavior (hopefully) when the user or printer is not managed
38# correctly by the Quota System : e.g. cupsFilter added in ppd file, but
39# printer and/or user not 'yet?' in storage.
40#
41# Revision 1.5  2003/02/05 23:26:22  jalet
42# Incorrect handling of grace delay
43#
44# Revision 1.4  2003/02/05 23:02:10  jalet
45# Typo
46#
47# Revision 1.3  2003/02/05 23:00:12  jalet
48# Forgotten import
49# Bad datetime conversion
50#
51# Revision 1.2  2003/02/05 22:28:38  jalet
52# More robust storage
53#
54# Revision 1.1  2003/02/05 21:28:17  jalet
55# Initial import into CVS
56#
57#
58#
59
60import fnmatch
61
62class SQLStorage :   
63    def getMatchingPrinters(self, printerpattern) :
64        """Returns the list of all printer names which match a certain pattern."""
65        printerslist = []
66        # We 'could' do a SELECT printername FROM printers WHERE printername LIKE ...
67        # but we don't because other storages semantics may be different, so every
68        # storage should use fnmatch to match patterns and be storage agnostic
69        result = self.doQuery("SELECT printername FROM printers;")
70        result = self.doParseResult(result)
71        if result is not None :
72            for printer in result :
73                if fnmatch.fnmatchcase(printer["printername"], printerpattern) :
74                    printerslist.append(printer["printername"])
75        return printerslist       
76           
77    def getPrinterUsers(self, printername) :       
78        """Returns the list of usernames which uses a given printer."""
79        result = self.doQuery("SELECT DISTINCT username FROM users WHERE id IN (SELECT userid FROM userpquota WHERE printerid IN (SELECT printerid FROM printers WHERE printername=%s));" % self.doQuote(printername))
80        result = result.doParseResult(result)
81        if result is None :
82            return []
83        else :   
84            return [record["username"] for record in result]
85       
86    def getPrinterGroups(self, printername) :       
87        """Returns the list of groups which uses a given printer."""
88        result = self.doQuery("SELECT DISTINCT groupname FROM groups WHERE id IN (SELECT groupid FROM grouppquota WHERE printerid IN (SELECT printerid FROM printers WHERE printername=%s));" % self.doQuote(printername))
89        result = result.doParseResult(result)
90        if result is None :
91            return []
92        else :   
93            return [record["groupname"] for record in result]
94       
95    def getUserId(self, username) :
96        """Returns a userid given a username."""
97        result = self.doQuery("SELECT id FROM users WHERE username=%s;" % self.doQuote(username))
98        try :
99            return self.doParseResult(result)[0]["id"]
100        except TypeError :      # Not found
101            return
102           
103    def getPrinterId(self, printername) :       
104        """Returns a printerid given a printername."""
105        result = self.doQuery("SELECT id FROM printers WHERE printername=%s;" % self.doQuote(printername))
106        try :
107            return self.doParseResult(result)[0]["id"]
108        except TypeError :      # Not found   
109            return
110           
111    def getPrinterPageCounter(self, printername) :
112        """Returns the last page counter value for a printer given its name."""
113        result = self.doQuery("SELECT pagecounter, lastusername FROM printers WHERE printername=%s;" % self.doQuote(printername))
114        try :
115            return self.doParseResult(result)[0]
116        except TypeError :      # Not found
117            return
118       
119    def updatePrinterPageCounter(self, printername, username, pagecount) :
120        """Updates the last page counter information for a printer given its name, last username and pagecount."""
121        return self.doQuery("UPDATE printers SET pagecounter=%s, lastusername=%s WHERE printername=%s;" % (self.doQuote(pagecount), self.doQuote(username), self.doQuote(printername)))
122       
123    def addUserPQuota(self, username, printername) :
124        (userid, printerid) = self.getUPIds(username, printername)
125        if printerid is None :   
126            self.doQuery("INSERT INTO printers (printername) VALUES (%s);" % self.doQuote(printername))
127        if userid is None :   
128            self.doQuery("INSERT INTO users (username) VALUES (%s);" % self.doQuote(username))
129        (userid, printerid) = self.getUPIds(username, printername)
130        if (userid is not None) and (printerid is not None) :
131            return self.doQuery("INSERT INTO userpquota (userid, printerid) VALUES (%s, %s);" % (self.doQuote(userid), self.doQuote(printerid)))
132       
133    def getUPIds(self, username, printername) :   
134        """Returns a tuple (userid, printerid) given a username and a printername."""
135        return (self.getUserId(username), self.getPrinterId(printername))
136       
137    def getUserPQuota(self, username, printername) :
138        """Returns the Print Quota information for a given (username, printername)."""
139        (userid, printerid) = self.getUPIds(username, printername)
140        if (userid is not None) and (printerid is not None) :
141            result = self.doQuery("SELECT pagecounter, softlimit, hardlimit, datelimit FROM userpquota WHERE userid=%s AND printerid=%s;" % (self.doQuote(userid), self.doQuote(printerid)))
142            try :
143                return self.doParseResult(result)[0]
144            except TypeError :      # Not found   
145                pass
146       
147    def setUserPQuota(self, username, printername, softlimit, hardlimit) :
148        """Sets soft and hard limits for a user quota on a specific printer given (username, printername)."""
149        (userid, printerid) = self.getUPIds(username, printername)
150        if (userid is not None) and (printerid is not None) :
151            self.doQuery("UPDATE userpquota SET softlimit=%s, hardlimit=%s, datelimit=NULL WHERE userid=%s AND printerid=%s;" % (self.doQuote(softlimit), self.doQuote(hardlimit), self.doQuote(userid), self.doQuote(printerid)))
152       
153    def setDateLimit(self, username, printername, datelimit) :
154        """Sets the limit date for a soft limit to become an hard one given (username, printername)."""
155        (userid, printerid) = self.getUPIds(username, printername)
156        if (userid is not None) and (printerid is not None) :
157            self.doQuery("UPDATE userpquota SET datelimit=%s::DATETIME WHERE userid=%s AND printerid=%s;" % (self.doQuote("%04i-%02i-%02i %02i:%02i:%02i" % (datelimit.year, datelimit.month, datelimit.day, datelimit.hour, datelimit.minute, datelimit.second)), self.doQuote(userid), self.doQuote(printerid)))
158       
159    def updateUserPQuota(self, username, printername, pagecount) :
160        """Updates the used user Quota information given (username, printername) and a job size in pages."""
161        (userid, printerid) = self.getUPIds(username, printername)
162        if (userid is not None) and (printerid is not None) :
163            self.doQuery("UPDATE userpquota SET pagecounter=pagecounter+(%s) WHERE userid=%s AND printerid=%s;" % (self.doQuote(pagecount), self.doQuote(userid), self.doQuote(printerid)))
164       
165    def buyUserPQuota(self, username, printername, pagebought) :
166        """Buys pages for a given (username, printername)."""
167        self.updateUserPQuota(username, printername, -pagebought)
168       
Note: See TracBrowser for help on using the browser.