diff --git a/attributs.py b/attributs.py index d688b1a..57ba83e 100644 --- a/attributs.py +++ b/attributs.py @@ -90,6 +90,22 @@ def attrify(val, attr, ldif, conn, ctxt_check = True): else: return CRANS_ATTRIBUTES.get(attr, Attr)(val, ldif, conn, ctxt_check) + +class AttrsDict(dict) : + def __init__(self, conn, ldif = {}, check_ctxt = True): + super(AttrsDict, self).__init__(ldif) + self._conn = conn + self._ldif = ldif + self._check_ctxt = check_ctxt + + def __getitem__(self, attr): + values = super(AttrsDict, self).__getitem__(attr) + if not isinstance(values, list): + values = [ values ] + values = [ attrify(unicode(val, 'utf-8'), attr, self._ldif, self._conn, self._check_ctxt) for val in values] + self[attr] = values + return values + class Attr(object): """Objet représentant un attribut. diff --git a/lc_ldap.py b/lc_ldap.py index 8e608ae..39ba6da 100644 --- a/lc_ldap.py +++ b/lc_ldap.py @@ -206,7 +206,7 @@ class lc_ldap(ldap.ldapobject.LDAPObject, object): elif (dn.startswith('aid=') or dn.startswith('cid=') or dn == base_dn) and not parent.has_key(dn): parent[dn] = new_cransldapobject(self, dn, ldif = attrs) allmachines = [] - for dn,mlist in machines.items(): # on associe propriétaires et machines + for dn,mlist in machines.iteritems(): # on associe propriétaires et machines parent[dn]._machines = mlist for m in mlist: m._proprio = parent[dn] @@ -452,8 +452,8 @@ class CransLdapObject(object): self.mode = mode - self.attrs = {} # Contient un dico uldif qui doit représenter ce qui - # est dans la base + self.attrs = attributs.AttrsDict(conn) # Contient un dico uldif qui doit représenter ce qui + # est dans la base. On attrify paresseusement au moment où on utilise un attribut self._modifs = None # C'est là qu'on met les modifications @@ -464,10 +464,10 @@ class CransLdapObject(object): orig = {} if ldif: - self.attrs = ldif if dn != base_dn: # new_cransldapobject ne donne pas de ldif formaté et utilise un ldif non formaté, donc on formate - self.attrs = ldif_to_uldif(self.attrs) - self.attrs = ldif_to_cldif(self.attrs, conn, check_ctxt = False) + self.attrs = attributs.AttrsDict(conn, ldif, check_ctxt = False) + else: + self.attrs = ldif self._modifs = ldif_to_uldif(ldif) self._modifs = ldif_to_cldif(self._modifs, conn, check_ctxt = False) orig = ldif @@ -476,15 +476,15 @@ class CransLdapObject(object): res = conn.search_s(dn, 0) if not res: raise ValueError ('objet inexistant: %s' % dn) - self.dn, self.attrs = res[0] + self.dn, res_attrs = res[0] + # L'objet sortant de la base ldap, on ne fait pas de vérifications sur + # l'état des données. + self.attrs = attributs.AttrsDict(conn, res_attrs, check_ctxt = False) + # Pour test en cas de mode w ou rw orig = res[0][1] - self.attrs = ldif_to_uldif(self.attrs) - # L'objet sortant de la base ldap, on ne fait pas de vérifications sur - # l'état des données. - self.attrs = ldif_to_cldif(self.attrs, conn, check_ctxt = False) self._modifs = ldif_to_cldif(ldif_to_uldif(res[0][1]), conn, check_ctxt = False) # Je m'interroge sur la pertinence de cette partie, je pense qu'elle n'est