[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
59
lc_ldap.py
59
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):
|
def search(self, filterstr, mode='ro', dn= base_dn, scope= 2, sizelimit=400):
|
||||||
res = self.search_ext_s(dn, scope, filterstr, sizelimit=sizelimit)
|
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):
|
def allMachines(self):
|
||||||
"""Renvoie la liste de toutes les machines,
|
"""Renvoie la liste de toutes les machines,
|
||||||
|
@ -127,9 +127,9 @@ class lc_ldap(ldap.ldapobject.LDAPObject):
|
||||||
res[dn] = attrs
|
res[dn] = attrs
|
||||||
for dn, attrs in res.items():
|
for dn, attrs in res.items():
|
||||||
if dn.startswith('mid='):
|
if dn.startswith('mid='):
|
||||||
m = CransLdapObject(self, dn, ldif = attrs)
|
m = new_cransldapobject(self, dn, ldif = attrs)
|
||||||
parent_dn = dn.split(',', 1)[1]
|
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)
|
machines.append(m)
|
||||||
return machines
|
return machines
|
||||||
|
|
||||||
|
@ -196,7 +196,7 @@ class lc_ldap(ldap.ldapobject.LDAPObject):
|
||||||
# print dn, modlist
|
# print dn, modlist
|
||||||
#
|
#
|
||||||
self.add_s(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)):
|
def _find_id(self, attr, plage = xrange(1, 32000)):
|
||||||
'''Trouve un <attr>id libre dans plage'''
|
'''Trouve un <attr>id libre dans plage'''
|
||||||
|
@ -231,20 +231,44 @@ class lc_ldap(ldap.ldapobject.LDAPObject):
|
||||||
# ? def reconnect(self, conn=None):
|
# ? 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):
|
class CransLdapObject(object):
|
||||||
mode = 'ro'
|
"""Classe de base des objets CransLdap"""
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
def __init__(self, conn, dn, mode='ro', ldif = None):
|
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
|
Créée une instance d'un objet Crans (machine, adhérent,
|
||||||
recherche dans la base ldap.
|
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):
|
if not isinstance(conn, lc_ldap):
|
||||||
raise TypeError(u"conn doit être une instance de lc_ldap")
|
raise TypeError(u"conn doit être une instance de lc_ldap")
|
||||||
self.conn = conn
|
self.conn = conn
|
||||||
|
@ -254,9 +278,7 @@ class CransLdapObject(object):
|
||||||
self.dn = dn
|
self.dn = dn
|
||||||
self.attrs = ldif
|
self.attrs = ldif
|
||||||
self.__class__ = eval(self.attrs['objectClass'][0])
|
self.__class__ = eval(self.attrs['objectClass'][0])
|
||||||
elif dn == base_dn:
|
elif dn != base_dn:
|
||||||
self.__class__ = AssociationCrans
|
|
||||||
else:
|
|
||||||
self.mode = mode
|
self.mode = mode
|
||||||
res = conn.search_s(dn, 0)
|
res = conn.search_s(dn, 0)
|
||||||
if not res:
|
if not res:
|
||||||
|
@ -279,7 +301,6 @@ class CransLdapObject(object):
|
||||||
nvals = [nldif[attr][v.index(v)] for v in vals ]
|
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)
|
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)
|
# self._modifs = copy.deepcopy(self.attrs)
|
||||||
|
|
||||||
def save(self):
|
def save(self):
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue