[lc_ldap] Utilise un dispatrcher plutôt que de bidouiller self.__class__
This commit is contained in:
parent
b9f9096077
commit
09224b650c
1 changed files with 40 additions and 19 deletions
53
lc_ldap.py
53
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 <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,
|
||||
'''
|
||||
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):
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue