Changeset 1017
- Timestamp:
- 06/06/03 16:21:08 (21 years ago)
- Location:
- pykota/trunk
- Files:
-
- 7 modified
Legend:
- Unmodified
- Added
- Removed
-
pykota/trunk/bin/repykota
r1005 r1017 23 23 # 24 24 # $Log$ 25 # Revision 1.36 2003/06/06 14:21:08 jalet 26 # New LDAP schema. 27 # Small bug fixes. 28 # 25 29 # Revision 1.35 2003/05/28 13:56:24 jalet 26 30 # Unneeded code. … … 256 260 (balance, lifetimepaid) = balance 257 261 else : 258 (balance, lifetimepaid) = 0.0262 (balance, lifetimepaid) = (0.0, 0.0) 259 263 if datelimit is not None : 260 264 now = DateTime.now() … … 274 278 print "%-9.9s %s %7i %7s %7s %10s %-10.10s %8i %10s" % (name, reached, pagecounter, str(softlimit), str(hardlimit), strbalance, str(datelimit)[:10], lifepagecounter, strlifetimepaid) 275 279 return (lifepagecounter, lifetimepaid) 280 else : 281 return (0, 0) 276 282 277 283 -
pykota/trunk/CREDITS
r1015 r1017 44 44 - John Flynn - University of Belize : LDAP support 45 45 - Wayne Godoy - University of Belize : LDAP support 46 - Leif Johansson - LDAP support 46 47 47 48 ============================================================ -
pykota/trunk/initscripts/ldap/pykota-sample.ldif
r1015 r1017 4 4 # $Id$ 5 5 # 6 #6 7 7 dn: ou=People,dc=librelogiciel,dc=com 8 8 ou: People … … 13 13 objectClass: organizationalUnit 14 14 15 dn: ou=Printers,dc=librelogiciel,dc=com 15 dn: ou=PyKota,dc=librelogiciel,dc=com 16 ou: PyKota 17 objectClass: organizationalUnit 18 19 dn: ou=Printers,ou=PyKota,dc=librelogiciel,dc=com 16 20 ou: Printers 21 objectClass: organizationalUnit 22 23 dn: ou=UQuotas,ou=PyKota,dc=librelogiciel,dc=com 24 ou: UQuotas 25 objectClass: organizationalUnit 26 27 dn: ou=GQuotas,ou=PyKota,dc=librelogiciel,dc=com 28 ou: GQuotas 29 objectClass: organizationalUnit 30 31 dn: ou=Jobs,ou=PyKota,dc=librelogiciel,dc=com 32 ou: Jobs 33 objectClass: organizationalUnit 34 35 dn: ou=LastJobs,ou=PyKota,dc=librelogiciel,dc=com 36 ou: LastJobs 17 37 objectClass: organizationalUnit 18 38 … … 24 44 objectClass: top 25 45 objectClass: shadowAccount 26 objectClass: pykotaUser 46 objectClass: pykotaAccount 47 objectClass: pykotaAccountBalance 27 48 userPassword: {crypt}PvuIT4Mz8.lCM 28 49 shadowLastChange: 12093 … … 34 55 homeDirectory: /home/jerome 35 56 gecos: Jerome Alet,,, 57 pykotaUserName: jerome 36 58 pykotaLimitBy: quota 37 pykotaBalance: 038 pykotaLifeTimePaid: 059 pykotaBalance: 9.25 60 pykotaLifeTimePaid: 10 39 61 40 62 dn: cn=devel,ou=Groups,dc=librelogiciel,dc=com … … 46 68 gidNumber: 500 47 69 memberUid: jerome 70 pykotaGroupName: devel 48 71 pykotaLimitBy: quota 49 72 50 dn: pykotaPrinterName=apple,ou=Printers,dc=librelogiciel,dc=com 73 dn: cn=apple,ou=Printers,ou=PyKota,dc=librelogiciel,dc=com 74 objectClass: pykotaNamed 51 75 objectClass: pykotaPrinter 76 cn: apple 52 77 pykotaPrinterName: apple 53 78 pykotaPricePerPage: 0.1 54 79 pykotaPricePerJob: 0.25 55 80 56 dn: ou=userPQuotas,pykotaPrinterName=apple,ou=Printers,dc=librelogiciel,dc=com 57 ou: userPQuotas 58 objectClass: organizationalUnit 59 60 dn: ou=groupPQuotas,pykotaPrinterName=apple,ou=Printers,dc=librelogiciel,dc=com 61 ou: groupPQuotas 62 objectClass: organizationalUnit 63 64 dn: ou=Jobs,pykotaPrinterName=apple,ou=Printers,dc=librelogiciel,dc=com 65 ou: Jobs 66 objectClass: organizationalUnit 67 68 dn: uid=jerome,ou=userPQuotas,pykotaPrinterName=apple,ou=Printers,dc=librelogiciel,dc=com 81 dn: cn=uniqueidentifier01,ou=UQuotas,ou=PyKota,dc=librelogiciel,dc=com 82 objectClass: pykotaNamed 69 83 objectClass: pykotaUserPQuota 70 uid: jerome 71 pykotaPageCounter: 0 72 pykotaLifePageCounter: 0 84 cn: uniqueidentifier01 85 pykotaUserName: jerome 86 pykotaPrinterName: apple 87 pykotaPageCounter: 5 88 pykotaLifePageCounter: 5 73 89 pykotaSoftLimit: 100 74 90 pykotaHardLimit: 110 75 91 pykotaDateLimit: None 76 92 77 dn: cn=devel,ou=groupPQuotas,pykotaPrinterName=apple,ou=Printers,dc=librelogiciel,dc=com 93 dn: cn=uniqueidentifier02,ou=GQuotas,ou=PyKota,dc=librelogiciel,dc=com 94 objectClass: pykotaNamed 78 95 objectClass: pykotaGroupPQuota 79 cn: devel 96 cn: uniqueidentifier02 97 pykotaGroupName: devel 98 pykotaPrinterName: apple 80 99 pykotaSoftLimit: 400 81 100 pykotaHardLimit: 450 82 101 pykotaDateLimit: None 83 102 84 dn: pykotaJobHistoryId=1,ou=Jobs,pykotaPrinterName=apple,ou=Printers,dc=librelogiciel,dc=com 85 objectClass: pykotaPrinterJob 86 pykotaJobHistoryId: 1 103 dn: cn=uniqueidentifier03,ou=Jobs,ou=PyKota,dc=librelogiciel,dc=com 104 objectClass: pykotaNamed 105 objectClass: pykotaJob 106 cn: uniqueidentifier03 107 pykotaUserName: jerome 108 pykotaPrinterName: apple 87 109 pykotaJobId: 15 88 uid: jerome89 110 pykotaPrinterPageCounter: 1533 90 111 pykotaJobSize: 5 91 112 pykotaAction: ALLOW 92 pykotaJobDate: 2003-06-04 16:12 113 114 dn: cn=uniqueidentifier04,ou=LastJobs,ou=PyKota,dc=librelogiciel,dc=com 115 objectClass: pykotaNamed 116 objectClass: pykotaLastJob 117 cn: uniqueidentifier04 118 pykotaPrinterName: apple 119 pykotaLastJobUUID: uniqueidentifier03 -
pykota/trunk/initscripts/ldap/pykota.schema
r1015 r1017 16 16 # 17 17 # 18 # Contributors : Leif Johansson 19 # 18 20 # THIS IS WORK UNDER HEAVY DEVELOPPMENT ! 19 21 # … … 24 26 # 25 27 26 ## Pykota related LDAP attributes 28 # 29 # PyKota Attributes Types 30 # 27 31 32 # pykotaLimitBy 28 33 attributetype ( 1.3.6.1.4.1.16868.1.1.1 NAME 'pykotaLimitBy' 29 34 DESC 'How to limit the user/group : quota or balance' … … 31 36 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE ) 32 37 38 # pykotaBalance 33 39 attributetype ( 1.3.6.1.4.1.16868.1.1.2 NAME 'pykotaBalance' 34 40 DESC 'Current account balance for the user, float' … … 36 42 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE ) 37 43 44 # pykotaLifeTimePaid 38 45 attributetype ( 1.3.6.1.4.1.16868.1.1.3 NAME 'pykotaLifeTimePaid' 39 46 DESC 'Total money paid by the user to fill his account balance, float' … … 41 48 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE ) 42 49 50 # pykotaPricePerPage 43 51 attributetype ( 1.3.6.1.4.1.16868.1.1.4 NAME 'pykotaPricePerPage' 44 52 DESC 'Price per page for a printer, float' … … 46 54 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE ) 47 55 56 # pykotaPricePerJob 48 57 attributetype ( 1.3.6.1.4.1.16868.1.1.5 NAME 'pykotaPricePerJob' 49 58 DESC 'Price per job for a printer, float' … … 51 60 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE ) 52 61 53 attributetype ( 1.3.6.1.4.1.16868.1.1.6 NAME 'pykotaPrinterName' 54 DESC 'Printer name as defined in the printing environment, e.g. lp' 55 EQUALITY caseIgnoreIA5Match 56 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE ) 57 58 attributetype ( 1.3.6.1.4.1.16868.1.1.7 NAME 'pykotaSoftLimit' 62 # pykotaSoftLimit 63 attributetype ( 1.3.6.1.4.1.16868.1.1.6 NAME 'pykotaSoftLimit' 59 64 DESC 'Soft limit in maximal number of pages' 60 65 EQUALITY integerMatch 61 66 SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) 62 67 63 attributetype ( 1.3.6.1.4.1.16868.1.1.8 NAME 'pykotaHardLimit' 68 # pykotaHardLimit 69 attributetype ( 1.3.6.1.4.1.16868.1.1.7 NAME 'pykotaHardLimit' 64 70 DESC 'Hard limit in maximal number of pages' 65 71 EQUALITY integerMatch 66 72 SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) 67 73 68 attributetype ( 1.3.6.1.4.1.16868.1.1.9 NAME 'pykotaDateLimit' 74 # pykotaDateLimit 75 attributetype ( 1.3.6.1.4.1.16868.1.1.8 NAME 'pykotaDateLimit' 69 76 DESC 'Date at which the soft limit becomes a hard one' 70 77 EQUALITY caseIgnoreIA5Match 71 78 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE ) 72 79 73 attributetype ( 1.3.6.1.4.1.16868.1.1.10 NAME 'pykotaPageCounter' 80 # pykotaPageCounter 81 attributetype ( 1.3.6.1.4.1.16868.1.1.9 NAME 'pykotaPageCounter' 74 82 DESC 'Current page counter for the user on a particular printer' 75 83 EQUALITY integerMatch 76 84 SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) 77 85 78 attributetype ( 1.3.6.1.4.1.16868.1.1.11 NAME 'pykotaLifePageCounter' 86 # pykotaLifePageCounter 87 attributetype ( 1.3.6.1.4.1.16868.1.1.10 NAME 'pykotaLifePageCounter' 79 88 DESC 'Total page counter for the user on a particular printer' 80 89 EQUALITY integerMatch 81 90 SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) 82 91 83 attributetype ( 1.3.6.1.4.1.16868.1.1.12 NAME 'pykotaJobHistoryId' 84 DESC 'Id of an entry in a printer history of jobs' 85 EQUALITY integerMatch 86 SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) 92 # pykotaJobId 93 attributetype ( 1.3.6.1.4.1.16868.1.1.11 NAME 'pykotaJobId' 94 DESC 'Id of a job in a printer history of jobs' 95 EQUALITY caseExactIA5Match 96 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE ) 87 97 88 attributetype ( 1.3.6.1.4.1.16868.1.1.13 NAME 'pykotaJobId' 89 DESC 'Id of a job in a printer history of jobs' 90 EQUALITY integerMatch 91 SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) 92 93 attributetype ( 1.3.6.1.4.1.16868.1.1.14 NAME 'pykotaPrinterPageCounter' 98 # pykotaPrinterPageCounter 99 attributetype ( 1.3.6.1.4.1.16868.1.1.12 NAME 'pykotaPrinterPageCounter' 94 100 DESC 'Life time page counter of a printer when the job began' 95 101 EQUALITY integerMatch 96 102 SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) 97 103 98 attributetype ( 1.3.6.1.4.1.16868.1.1.15 NAME 'pykotaJobSize' 104 # pykotaJobSize 105 attributetype ( 1.3.6.1.4.1.16868.1.1.13 NAME 'pykotaJobSize' 99 106 DESC 'Current job size in number of pages in the history' 100 107 EQUALITY integerMatch 101 108 SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) 102 109 103 attributetype ( 1.3.6.1.4.1.16868.1.1.16 NAME 'pykotaAction' 110 # pykotaAction 111 attributetype ( 1.3.6.1.4.1.16868.1.1.14 NAME 'pykotaAction' 104 112 DESC 'Was the job allowed, or denied' 105 113 EQUALITY caseIgnoreIA5Match 106 114 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE ) 107 115 108 attributetype ( 1.3.6.1.4.1.16868.1.1.17 NAME 'pykotaJobDate' 109 DESC 'Date of when the job began' 116 # pykotaPrinterName 117 attributetype ( 1.3.6.1.4.1.16868.1.1.15 NAME 'pykotaPrinterName' 118 DESC 'PyKota printer name as received from the printing subsystem' 110 119 EQUALITY caseIgnoreIA5Match 111 120 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE ) 121 122 # pykotaUserName 123 attributetype ( 1.3.6.1.4.1.16868.1.1.16 NAME 'pykotaUserName' 124 DESC 'PyKota user name' 125 EQUALITY caseExactIA5Match 126 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE ) 127 128 # pykotaGroupName 129 attributetype ( 1.3.6.1.4.1.16868.1.1.17 NAME 'pykotaGroupName' 130 DESC 'PyKota group name' 131 EQUALITY caseExactIA5Match 132 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE ) 133 134 # pykotaLastJobUUID 135 attributetype ( 1.3.6.1.4.1.16868.1.1.18 NAME 'pykotaLastJobUUID' 136 DESC 'Last job uuid in the history' 137 EQUALITY caseExactIA5Match 138 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE ) 139 140 # 141 # PyKota Object Classes 142 # 112 143 113 114 ## New Pykota User object type 115 objectclass ( 1.3.6.1.4.1.16868.1.2.1 NAME 'pykotaUser' SUP top AUXILIARY 144 # pykotaUser 145 objectclass ( 1.3.6.1.4.1.16868.1.2.1 NAME 'pykotaAccount' SUP top AUXILIARY 116 146 DESC 'PyKota Auxiliary User Account' 117 MUST ( uid )118 MAY ( pykotaLimitBy $ pykotaBalance $ pykotaLifeTimePaid) )147 MUST ( uid $ pykotaUserName ) 148 MAY ( pykotaLimitBy ) ) 119 149 120 # # New Pykota Group object type150 # pykotaGroup 121 151 objectclass ( 1.3.6.1.4.1.16868.1.2.2 NAME 'pykotaGroup' SUP top AUXILIARY 122 152 DESC 'PyKota Auxiliary Group' 123 MUST ( cn )124 MAY ( pykotaLimitBy ) )153 MUST ( cn $ pykotaGroupName ) 154 MAY ( pykotaLimitBy $ memberUid ) ) 125 155 126 # # New Pykota Printer object type127 objectclass ( 1.3.6.1.4.1.16868.1.2.3 NAME 'pykotaPrinter' SUP top STRUCTURAL156 # pykotaPrinter 157 objectclass ( 1.3.6.1.4.1.16868.1.2.3 NAME 'pykotaPrinter' SUP top AUXILIARY 128 158 DESC 'PyKota Printer' 129 MUST ( pykotaPrinterName )159 MUST ( cn $ pykotaPrinterName ) 130 160 MAY ( pykotaPricePerPage $ pykotaPricePerJob ) ) 131 161 132 # # New PyKota User Print Quota on a Printer133 objectclass ( 1.3.6.1.4.1.16868.1.2.4 NAME 'pykotaUserPQuota' SUP top STRUCTURAL162 # pykotaUserPQuota 163 objectclass ( 1.3.6.1.4.1.16868.1.2.4 NAME 'pykotaUserPQuota' SUP top AUXILIARY 134 164 DESC 'PyKota User Quota on a Printer' 135 MUST ( uid)165 MUST ( cn $ pykotaUserName $ pykotaPrinterName ) 136 166 MAY ( pykotaPageCounter $ pykotaLifePageCounter $ pykotaSoftLimit $ pykotaHardLimit $ pykotaDateLimit ) ) 137 167 138 # # New PyKota Group Print Quota on a Printer139 objectclass ( 1.3.6.1.4.1.16868.1.2.5 NAME 'pykotaGroupPQuota' SUP top STRUCTURAL168 # pykotaGroupPQuota 169 objectclass ( 1.3.6.1.4.1.16868.1.2.5 NAME 'pykotaGroupPQuota' SUP top AUXILIARY 140 170 DESC 'PyKota Group Quota on a Printer' 141 MUST ( cn )171 MUST ( cn $ pykotaGroupName $ pykotaPrinterName ) 142 172 MAY ( pykotaSoftLimit $ pykotaHardLimit $ pykotaDateLimit ) ) 143 173 144 # # New PyKota Job entry in a Printer's history145 objectclass ( 1.3.6.1.4.1.16868.1.2.6 NAME 'pykota PrinterJob' SUP top STRUCTURAL174 # pykotaJob 175 objectclass ( 1.3.6.1.4.1.16868.1.2.6 NAME 'pykotaJob' SUP top AUXILIARY 146 176 DESC 'An entry in the job history for a printer' 147 MUST ( pykotaJobHistoryId $ uid$ pykotaJobId )148 MAY ( pykotaPrinterPageCounter $ pykotaJobSize $ pykotaAction $ pykotaJobDate) )177 MUST ( cn $ pykotaUserName $ pykotaPrinterName $ pykotaJobId ) 178 MAY ( pykotaPrinterPageCounter $ pykotaJobSize $ pykotaAction ) ) 149 179 180 # pykotaAccountBalance 181 objectclass ( 1.3.6.1.4.1.16868.1.2.7 NAME 'pykotaAccountBalance' SUP top AUXILIARY 182 DESC 'PyKota User account balance' 183 MUST ( pykotaUserName ) 184 MAY ( pykotaBalance $ pykotaLifeTimePaid ) ) 185 186 # pykotaLastJob 187 objectclass ( 1.3.6.1.4.1.16868.1.2.8 NAME 'pykotaLastJob' SUP top AUXILIARY 188 DESC 'Last job information for a printer' 189 MUST ( pykotaPrinterName $ pykotaLastJobUUID ) ) 190 191 # pykotaNamed - Use it if you have to 192 objectclass ( 1.3.6.1.4.1.16868.1.2.9 NAME 'pykotaNamed' SUP top STRUCTURAL 193 DESC 'PyKota Named Object' 194 MUST ( cn ) ) 195 196 -
pykota/trunk/NEWS
r1016 r1017 22 22 PyKota NEWS : 23 23 24 - 1.08alpha6 : 25 26 - Minor bug corrections 27 - More work on LDAP : new schema 28 24 29 - 1.08alpha5 : 25 30 26 More good work on LDAP storage.27 repykota now works reasonably well with the sample LDAP directory.31 - More good work on LDAP storage. 32 repykota now works reasonably well with the sample LDAP directory. 28 33 29 34 - 1.08alpha4 : -
pykota/trunk/pykota/storages/ldapstorage.py
r1016 r1017 21 21 # 22 22 # $Log$ 23 # Revision 1.2 2003/06/06 14:21:08 jalet 24 # New LDAP schema. 25 # Small bug fixes. 26 # 23 27 # Revision 1.1 2003/06/05 11:19:13 jalet 24 28 # More good work on LDAP storage. … … 64 68 self.closed = 1 65 69 66 def doSearch(self, key, fields, base="" ) :70 def doSearch(self, key, fields, base="", scope=ldap.SCOPE_SUBTREE) : 67 71 """Does an LDAP search query.""" 68 72 try : 69 73 # prepends something more restrictive at the beginning of the base dn 70 result = self.database.search_s(base or self.basedn, ldap.SCOPE_SUBTREE, key, fields)74 result = self.database.search_s(base or self.basedn, scope, key, fields) 71 75 except ldap.NO_SUCH_OBJECT : 72 76 return … … 79 83 if result : 80 84 return [(printerid, printer["pykotaPrinterName"][0]) for (printerid, printer) in result if fnmatch.fnmatchcase(printer["pykotaPrinterName"][0], printerpattern)] 81 else :82 return83 85 84 86 def getPrinterId(self, printername) : … … 87 89 if result : 88 90 return result[0][0] 89 else :90 return91 91 92 92 def getPrinterPrices(self, printerid) : … … 95 95 if result : 96 96 return (float(result[0][1]["pykotaPricePerPage"][0]), float(result[0][1]["pykotaPricePerJob"][0])) 97 else :98 return99 97 100 98 def setPrinterPrices(self, printerid, perpage, perjob) : … … 104 102 def getUserId(self, username) : 105 103 """Returns a userid given a username.""" 106 result = self.doSearch("(&(objectClass=pykota User)(uid=%s))" % username, ["uid"])104 result = self.doSearch("(&(objectClass=pykotaAccount)(pykotaUserName=%s))" % username, ["uid"]) 107 105 if result : 108 106 return result[0][0] 109 else :110 return111 107 112 108 def getGroupId(self, groupname) : 113 109 """Returns a groupid given a grupname.""" 114 result = self.doSearch("(&(objectClass=pykotaGroup)( cn=%s))" % groupname, ["cn"])110 result = self.doSearch("(&(objectClass=pykotaGroup)(pykotaGroupName=%s))" % groupname, ["cn"]) 115 111 if result is not None : 116 112 (groupid, dummy) = result[0] … … 123 119 def getPrinterUsers(self, printerid) : 124 120 """Returns the list of userids and usernames which uses a given printer.""" 125 result = self.doSearch("(&(objectClass=pykotaUserPQuota)(uid=*))", ["uid"], base=printerid) 126 if result : 127 return [(pquotauserid, fields["uid"][0]) for (pquotauserid, fields) in result] 128 else : 129 return 121 # first get the printer's name from the id 122 result = self.doSearch("objectClass=pykotaPrinter", ["pykotaPrinterName"], base=printerid, scope=ldap.SCOPE_BASE) 123 if result : 124 printername = result[0][1]["pykotaPrinterName"][0] 125 result = self.doSearch("(&(objectClass=pykotaUserPQuota)(pykotaPrinterName=%s))" % printername, ["pykotaUserName"]) 126 if result : 127 return [(pquotauserid, fields["pykotaUserName"][0]) for (pquotauserid, fields) in result] 130 128 131 129 def getPrinterGroups(self, printerid) : 132 130 """Returns the list of groups which uses a given printer.""" 133 result = self.doSearch("(&(objectClass=pykotaGroupPQuota)(cn=*))", ["cn"], base=printerid) 134 if result : 135 return [(pquotagroupid, fields["cn"][0]) for (pquotagroupid, fields) in result] 136 else : 137 return 131 # first get the printer's name from the id 132 result = self.doSearch("objectClass=pykotaPrinter", ["pykotaPrinterName"], base=printerid, scope=ldap.SCOPE_BASE) 133 if result : 134 printername = result[0][1]["pykotaPrinterName"][0] 135 result = self.doSearch("(&(objectClass=pykotaGroupPQuota)(pykotaPrinterName=%s))" % printername, ["pykotaGroupName"]) 136 if result : 137 return [(pquotagroupid, fields["pykotaGroupName"][0]) for (pquotagroupid, fields) in result] 138 138 139 139 def getGroupMembersNames(self, groupname) : 140 140 """Returns the list of user's names which are member of this group.""" 141 result = self.doSearch("(&(objectClass=pykotaGroup)( cn=%s))" % groupname, ["memberUid"])141 result = self.doSearch("(&(objectClass=pykotaGroup)(pykotaGroupName=%s))" % groupname, ["memberUid"]) 142 142 if result : 143 143 return result[0][1]["memberUid"] 144 else :145 return146 144 147 145 def getUserGroupsNames(self, userid) : … … 173 171 pass 174 172 175 def getUserBalance(self, userid) : 176 """Returns the current account balance for a given user.""" 177 shortuid = userid.split(",")[0] 178 result = self.doSearch("(&(objectClass=pykotaUser)(%s))" % shortuid, ["pykotaBalance", "pykotaLifeTimePaid"]) 179 if result : 180 fields = result[0][1] 181 return (float(fields["pykotaBalance"][0]), float(fields["pykotaLifeTimePaid"][0])) 182 else : 183 return 184 185 def getGroupBalance(self, groupid) : 173 def getUserBalance(self, userquotaid) : 174 """Returns the current account balance for a given user quota identifier.""" 175 # first get the user's name from the user quota id 176 result = self.doSearch("objectClass=pykotaUserPQuota", ["pykotaUserName"], base=userquotaid, scope=ldap.SCOPE_BASE) 177 if result : 178 username = result[0][1]["pykotaUserName"][0] 179 result = self.doSearch("(&(objectClass=pykotaAccountBalance)(pykotaUserName=%s))" % username, ["pykotaBalance", "pykotaLifeTimePaid"]) 180 if result : 181 fields = result[0][1] 182 return (float(fields["pykotaBalance"][0]), float(fields["pykotaLifeTimePaid"][0])) 183 184 def getUserBalanceFromUserId(self, userid) : 185 """Returns the current account balance for a given user id.""" 186 # first get the user's name from the user id 187 result = self.doSearch("objectClass=pykotaAccount", ["pykotaUserName"], base=userid, scope=ldap.SCOPE_BASE) 188 if result : 189 username = result[0][1]["pykotaUserName"][0] 190 result = self.doSearch("(&(objectClass=pykotaAccountBalance)(pykotaUserName=%s))" % username, ["pykotaBalance", "pykotaLifeTimePaid"]) 191 if result : 192 fields = result[0][1] 193 return (float(fields["pykotaBalance"][0]), float(fields["pykotaLifeTimePaid"][0])) 194 195 def getGroupBalance(self, groupquotaid) : 186 196 """Returns the current account balance for a given group, as the sum of each of its users' account balance.""" 187 groupname = groupid.split(",")[0].split("=")[1] 188 members = self.getGroupMembersNames(groupname) 189 balance = lifetimepaid = 0.0 190 for member in members : 191 userid = self.getUserId(member) 192 if userid : 193 userbal = self.getUserBalance(userid) 194 if userbal : 195 (bal, paid) = userbal 196 balance += bal 197 lifetimepaid += paid 198 return (balance, lifetimepaid) 197 # first get the group's name from the group quota id 198 result = self.doSearch("objectClass=pykotaGroupPQuota", ["pykotaGroupName"], base=groupquotaid, scope=ldap.SCOPE_BASE) 199 if result : 200 groupname = result[0][1]["pykotaGroupName"][0] 201 members = self.getGroupMembersNames(groupname) 202 balance = lifetimepaid = 0.0 203 for member in members : 204 userid = self.getUserId(member) 205 if userid : 206 userbal = self.getUserBalanceFromUserId(userid) 207 if userbal : 208 (bal, paid) = userbal 209 balance += bal 210 lifetimepaid += paid 211 return (balance, lifetimepaid) 199 212 200 213 def getUserLimitBy(self, userid) : 201 214 """Returns the way in which user printing is limited.""" 202 shortuid = userid.split(",")[0] 203 result = self.doSearch("(&(objectClass=pykotaUser)(%s))" % shortuid, ["pykotaLimitBy"]) 215 result = self.doSearch("objectClass=pykotaAccount", ["pykotaLimitBy"], base=userid, scope=ldap.SCOPE_BASE) 204 216 if result : 205 217 return result[0][1]["pykotaLimitBy"][0] 206 else : 207 return 208 209 def getGroupLimitBy(self, groupid) : 218 219 def getGroupLimitBy(self, groupquotaid) : 210 220 """Returns the way in which group printing is limited.""" 211 shortgid = groupid.split(",")[0] 212 result = self.doSearch("(&(objectClass=pykotaGroup)(%s))" % shortgid, ["pykotaLimitBy"]) 213 if result : 214 return result[0][1]["pykotaLimitBy"][0] 215 else : 216 return 221 # first get the group's name from the group quota id 222 result = self.doSearch("objectClass=pykotaGroupPQuota", ["pykotaGroupName"], base=groupquotaid, scope=ldap.SCOPE_BASE) 223 if result : 224 groupname = result[0][1]["pykotaGroupName"][0] 225 result = self.doSearch("(&(objectClass=pykotaGroup)(pykotaGroupName=%s))" % groupname, ["pykotaLimitBy"]) 226 if result : 227 return result[0][1]["pykotaLimitBy"][0] 217 228 218 229 def setUserBalance(self, userid, balance) : … … 248 259 pass 249 260 250 def getUserPQuota(self, userid, printerid) : 251 """Returns the Print Quota information for a given (userid, printerid).""" 252 result = self.doSearch("(&(objectClass=pykotaUserPQuota)(uid=*))", ["uid", "pykotaPageCounter", "pykotaLifePageCounter", "pykotaSoftLimit", "pykotaHardLimit", "pykotaDateLimit"], base=userid) 261 def getUserPQuota(self, userquotaid, printerid) : 262 """Returns the Print Quota information for a given (userquotaid, printerid).""" 263 # first get the user's name from the id 264 result = self.doSearch("objectClass=pykotaUserPQuota", ["pykotaUserName", "pykotaPageCounter", "pykotaLifePageCounter", "pykotaSoftLimit", "pykotaHardLimit", "pykotaDateLimit"], base=userquotaid, scope=ldap.SCOPE_BASE) 253 265 if result : 254 266 fields = result[0][1] … … 262 274 "datelimit" : datelimit 263 275 } 264 else : 265 return 266 267 def getGroupPQuota(self, groupid, printerid) : 268 """Returns the Print Quota information for a given (groupid, printerid).""" 269 result = self.doSearch("(&(objectClass=pykotaGroupPQuota)(cn=*))", ["pykotaSoftLimit", "pykotaHardLimit", "pykotaDateLimit"], base=groupid) 276 277 def getGroupPQuota(self, grouppquotaid, printerid) : 278 """Returns the Print Quota information for a given (grouppquotaid, printerid).""" 279 result = self.doSearch("objectClass=pykotaGroupPQuota", ["pykotaGroupName", "pykotaSoftLimit", "pykotaHardLimit", "pykotaDateLimit"], base=grouppquotaid, scope=ldap.SCOPE_BASE) 270 280 if result : 271 281 fields = result[0][1] 282 groupname = fields["pykotaGroupName"][0] 272 283 datelimit = fields["pykotaDateLimit"][0].strip() 273 284 if (not datelimit) or (datelimit.upper() == "NONE") : … … 278 289 "datelimit" : datelimit 279 290 } 280 groupname = groupid.split(",")[0].split("=")[1]281 291 members = self.getGroupMembersNames(groupname) 282 292 pagecounter = lifepagecounter = 0 … … 291 301 quota.update({"pagecounter": pagecounter, "lifepagecounter": lifepagecounter}) 292 302 return quota 293 else :294 return295 303 296 304 def setUserDateLimit(self, userid, printerid, datelimit) : … … 316 324 if result : 317 325 pass # TODO 318 else :319 return320 326 321 327 def addUserToGroup(self, userid, groupid) : -
pykota/trunk/pykota/version.py
r1016 r1017 21 21 # 22 22 23 __version__ = "1.08alpha 5_unofficial"23 __version__ = "1.08alpha6_unofficial" 24 24 25 25 __doc__ = """PyKota : a complete Printing Quota Solution for CUPS and LPRng."""