[lc_ldap] Utilise un dispatrcher plutôt que de bidouiller self.__class__

This commit is contained in:
Nicolas Dandrimont 2010-10-17 12:46:35 +02:00
parent b9f9096077
commit 09224b650c

View file

@ -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 <attr>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):