[lc_ldap] On oublie les uldifs (presque)

This commit is contained in:
Antoine Durand-Gasselin 2010-10-16 16:27:14 +02:00
parent f37092b94f
commit 1bc6ef63b0
2 changed files with 27 additions and 25 deletions

View file

@ -56,28 +56,21 @@ def is_actif(sanction):
fin = int(bl_fin)
return debut < now and fin > now
def uldif_to_ldif(uldif):
## XXX - Kill
"""Prend en argument un dico ldif, et vérifie que toutes les
valeurs sont bien des unicodes, les converti alors en chaînes
utf-8, renvoie un ldif"""
ldif = {}
for attr, vals in uldif.items():
ldif[attr] = [ unicode.encode(val, 'utf-8') for val in vals ]
return ldif
def ldif_to_uldif(ldif):
## XXX - Kill
'Prend en argument un dico ldif, et décode toutes les chaînes en utf-8'
uldif = {}
for attr, vals in ldif.items():
uldif[attr] = [ unicode(val, 'utf-8') for val in vals ]
return uldif
def ldif_to_cldif(ldif):
def ldif_to_cldif(ldif, check_ctxt = True):
"""Transforme un dictionnaire renvoyé par python-ldap, en
un dictionnaire dont les valeurs sont des instances de Attr
Lorsqu'on récupère le ldif de la base ldap, on n'a pas besoin
de faire de tests...
"""
cldif = {}
for attr, vals in ldif.items():
cldif[attr] = [ attrify(val, attr, ldif) for val in vals]
cldif[attr] = [ attrify(val, attr, ldif, check_ctxt = check_ctxt) for val in vals]
return cldif
def cldif_to_ldif(cldif):
@ -186,10 +179,10 @@ class lc_ldap(ldap.ldapobject.LDAPObject):
"""Crée une nouvelle facture"""
raise NotImplementedError()
def _create_entity(self, dn, ldif):
def _create_entity(self, dn, uldif):
'''Crée une nouvelle entité ldap en dn, avec attributs ldif:
uniquement en unicode'''
cldif = ldif_to_cldif(ldif)
cldif = ldif_to_cldif(uldif)
#lock = CransLock(self)
for item in ['aid', 'uid', 'chbre', 'mailAlias', 'canonicalAlias',
'fid', 'cid', 'mid', 'macAddress', 'host', 'hostAlias' ]:
@ -247,8 +240,8 @@ class CransLdapObject(object):
self.conn = conn
if ldif:
# Vous précisez un ldif, l'objet est 'ro'
self.dn = dn
# /!\ attention, on a pas un uldif (rapidité...)
self.attrs = ldif
self.__class__ = eval(self.attrs['objectClass'][0])
elif dn == base_dn:
@ -259,11 +252,23 @@ class CransLdapObject(object):
if not res:
raise ValueError ('objet inexistant: %s' % dn)
self.dn, self.attrs = res[0]
self.attrs = ldif_to_uldif(self.attrs)
if mode in ['w', 'rw']:
self.attrs = ldif_to_cldif(self.attrs)
else:
self.attrs = ldif_to_uldif(self.attrs)
self.__class__ = eval(self.attrs['objectClass'][0])
self.attrs = ldif_to_cldif(self.attrs, check_ctxt = False)
### Vérification que `λv. str(Attr(v))` est bien une projection
oldif = res[0][1]
nldif = cldif_to_ldif(self.attrs)
for attr, vals in oldif:
if nldif[attr] != vals:
for v in nldif[attr]:
vals.remove(v) if 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)
self.__class__ = eval(str(self.attrs['objectClass'][0])
# self._modifs = copy.deepcopy(self.attrs)
def save(self):
@ -313,8 +318,6 @@ class CransLdapObject(object):
# On attrify
new_vals = [ attrify(val, attr, self._modifs) for val in new_vals ]
# XXX - Manque un sanity check
# Si ça passe, on effectue les modifications
old_vals = [ str(val) for val in self.attrs.get(attr, []) ]
new_vals = [ str(val) for val in new_vals ]
@ -325,7 +328,6 @@ class CransLdapObject(object):
"""Modifie l'attribut attr ayant la valeur oldVal en newVal. Si
l'attribut attr n'a qu'une seule valeur, il n'est pas nécessaire
de préciser oldVal."""
new_val = attrify(new_val, attr, self._modifs)
new_vals = self.attrs.get(attr, [])[:]
if old_val: # and oldVal in attrs:
new_vals = [ val for val in new_vals if str(val) != str(old_val) ]