diff --git a/lc_ldap.py b/lc_ldap.py index 169fdc4..30f5bfc 100644 --- a/lc_ldap.py +++ b/lc_ldap.py @@ -116,7 +116,7 @@ class lc_ldap(ldap.ldapobject.LDAPObject): def search(self, filterstr, mode='ro', dn= base_dn, scope= 2, sizelimit=400): res = self.search_ext_s(dn, scope, filterstr, sizelimit=sizelimit) - return [ CransLdapObject(self, r[0], mode=mode) for r in res ] + return [ new_cransldapobject(self, r[0], mode=mode) for r in res ] def allMachines(self): """Renvoie la liste de toutes les machines, @@ -127,9 +127,9 @@ class lc_ldap(ldap.ldapobject.LDAPObject): res[dn] = attrs for dn, attrs in res.items(): if dn.startswith('mid='): - m = CransLdapObject(self, dn, ldif = attrs) + m = new_cransldapobject(self, dn, ldif = attrs) parent_dn = dn.split(',', 1)[1] - m._proprio = CransLdapObject(self, parent_dn, res[parent_dn]) + m._proprio = new_cransldapobject(self, parent_dn, res[parent_dn]) machines.append(m) return machines @@ -196,7 +196,7 @@ class lc_ldap(ldap.ldapobject.LDAPObject): # print dn, modlist # self.add_s(dn, modlist) - return CransLdapObject(self, dn, mode='w') + return new_cransldapobject(self, dn, mode='w') def _find_id(self, attr, plage = xrange(1, 32000)): '''Trouve un id libre dans plage''' @@ -231,20 +231,44 @@ class lc_ldap(ldap.ldapobject.LDAPObject): # ? def reconnect(self, conn=None): +def new_cransldapobject(conn, dn, mode='ro', ldif = None): + """Crée un objet CransLdap en utilisant la classe correspondant à + l'objectClass du ldif""" + + classe = None + + if ldif: + classe = globals()[ldif['objectClass'][0]] + elif dn == base_dn: + classe = AssociationCrans + else: + res = conn.search_s(dn, 0) + if not res: + raise ValueError ('objet inexistant: %s' % dn) + _, attrs = res[0] + classe = globals()[attrs['objectClass'][0]] + + return classe(conn, dn, mode='ro', ldif = None) + + + class CransLdapObject(object): - mode = 'ro' - - attrs = None # Contient un dico uldif qui doit représenter ce qui - # est dans la base - - _modifs = None # C'est là qu'on met les modifications - + """Classe de base des objets CransLdap""" def __init__(self, conn, dn, mode='ro', ldif = None): - '''Créé une instance d'un objet Crans (machine, adhérent, - etc...) à ce dn, si ldif est précisé, n'effectue pas de - recherche dans la base ldap. - ''' + ''' + Créée une instance d'un objet Crans (machine, adhérent, + etc...) à ce dn, si ldif est précisé, n'effectue pas de + recherche dans la base ldap. + ''' + + self.mode = 'ro' + + self.attrs = None # Contient un dico uldif qui doit représenter ce qui + # est dans la base + + self._modifs = None # C'est là qu'on met les modifications + if not isinstance(conn, lc_ldap): raise TypeError(u"conn doit être une instance de lc_ldap") self.conn = conn @@ -254,9 +278,7 @@ class CransLdapObject(object): self.dn = dn self.attrs = ldif self.__class__ = eval(self.attrs['objectClass'][0]) - elif dn == base_dn: - self.__class__ = AssociationCrans - else: + elif dn != base_dn: self.mode = mode res = conn.search_s(dn, 0) if not res: @@ -279,7 +301,6 @@ class CransLdapObject(object): nvals = [nldif[attr][v.index(v)] for v in vals ] raise EnvironmentError("λv. str(Attr(v)) n'est peut-être pas une projection:", attr, nvals, vals) - self.__class__ = eval(str(self.attrs['objectClass'][0])) # self._modifs = copy.deepcopy(self.attrs) def save(self):