Show
Ignore:
Timestamp:
06/06/03 16:21:08 (21 years ago)
Author:
jalet
Message:

New LDAP schema.
Small bug fixes.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • pykota/trunk/pykota/storages/ldapstorage.py

    r1016 r1017  
    2121# 
    2222# $Log$ 
     23# Revision 1.2  2003/06/06 14:21:08  jalet 
     24# New LDAP schema. 
     25# Small bug fixes. 
     26# 
    2327# Revision 1.1  2003/06/05 11:19:13  jalet 
    2428# More good work on LDAP storage. 
     
    6468            self.closed = 1 
    6569         
    66     def doSearch(self, key, fields, base="") : 
     70    def doSearch(self, key, fields, base="", scope=ldap.SCOPE_SUBTREE) : 
    6771        """Does an LDAP search query.""" 
    6872        try : 
    6973            # 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) 
    7175        except ldap.NO_SUCH_OBJECT :     
    7276            return 
     
    7983        if result : 
    8084            return [(printerid, printer["pykotaPrinterName"][0]) for (printerid, printer) in result if fnmatch.fnmatchcase(printer["pykotaPrinterName"][0], printerpattern)] 
    81         else :     
    82             return 
    8385             
    8486    def getPrinterId(self, printername) :         
     
    8789        if result : 
    8890            return result[0][0] 
    89         else :     
    90             return 
    9191             
    9292    def getPrinterPrices(self, printerid) :         
     
    9595        if result : 
    9696            return (float(result[0][1]["pykotaPricePerPage"][0]), float(result[0][1]["pykotaPricePerJob"][0])) 
    97         else : 
    98             return  
    9997             
    10098    def setPrinterPrices(self, printerid, perpage, perjob) : 
     
    104102    def getUserId(self, username) : 
    105103        """Returns a userid given a username.""" 
    106         result = self.doSearch("(&(objectClass=pykotaUser)(uid=%s))" % username, ["uid"]) 
     104        result = self.doSearch("(&(objectClass=pykotaAccount)(pykotaUserName=%s))" % username, ["uid"]) 
    107105        if result : 
    108106            return result[0][0] 
    109         else :     
    110             return 
    111107             
    112108    def getGroupId(self, groupname) : 
    113109        """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"]) 
    115111        if result is not None : 
    116112            (groupid, dummy) = result[0] 
     
    123119    def getPrinterUsers(self, printerid) :         
    124120        """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] 
    130128         
    131129    def getPrinterGroups(self, printerid) :         
    132130        """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] 
    138138         
    139139    def getGroupMembersNames(self, groupname) :         
    140140        """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"]) 
    142142        if result : 
    143143            return result[0][1]["memberUid"] 
    144         else : 
    145             return 
    146144         
    147145    def getUserGroupsNames(self, userid) :         
     
    173171        pass 
    174172         
    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) :     
    186196        """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)             
    199212         
    200213    def getUserLimitBy(self, userid) :     
    201214        """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) 
    204216        if result : 
    205217            return result[0][1]["pykotaLimitBy"][0] 
    206         else :     
    207             return 
    208          
    209     def getGroupLimitBy(self, groupid) :     
     218         
     219    def getGroupLimitBy(self, groupquotaid) :     
    210220        """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] 
    217228         
    218229    def setUserBalance(self, userid, balance) :     
     
    248259        pass 
    249260         
    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) 
    253265        if result : 
    254266            fields = result[0][1] 
     
    262274                     "datelimit" : datelimit 
    263275                   } 
    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) 
    270280        if result : 
    271281            fields = result[0][1] 
     282            groupname = fields["pykotaGroupName"][0] 
    272283            datelimit = fields["pykotaDateLimit"][0].strip() 
    273284            if (not datelimit) or (datelimit.upper() == "NONE") :  
     
    278289                      "datelimit" : datelimit 
    279290                    } 
    280             groupname = groupid.split(",")[0].split("=")[1] 
    281291            members = self.getGroupMembersNames(groupname) 
    282292            pagecounter = lifepagecounter = 0 
     
    291301            quota.update({"pagecounter": pagecounter, "lifepagecounter": lifepagecounter})                 
    292302            return quota 
    293         else : 
    294             return 
    295303         
    296304    def setUserDateLimit(self, userid, printerid, datelimit) : 
     
    316324        if result : 
    317325            pass # TODO 
    318         else : 
    319             return  
    320326         
    321327    def addUserToGroup(self, userid, groupid) :