[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) fin = int(bl_fin)
return debut < now and fin > now 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): def ldif_to_uldif(ldif):
## XXX - Kill
'Prend en argument un dico ldif, et décode toutes les chaînes en utf-8'
uldif = {} uldif = {}
for attr, vals in ldif.items(): for attr, vals in ldif.items():
uldif[attr] = [ unicode(val, 'utf-8') for val in vals ] uldif[attr] = [ unicode(val, 'utf-8') for val in vals ]
return uldif 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 = {} cldif = {}
for attr, vals in ldif.items(): 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 return cldif
def cldif_to_ldif(cldif): def cldif_to_ldif(cldif):
@ -186,10 +179,10 @@ class lc_ldap(ldap.ldapobject.LDAPObject):
"""Crée une nouvelle facture""" """Crée une nouvelle facture"""
raise NotImplementedError() 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: '''Crée une nouvelle entité ldap en dn, avec attributs ldif:
uniquement en unicode''' uniquement en unicode'''
cldif = ldif_to_cldif(ldif) cldif = ldif_to_cldif(uldif)
#lock = CransLock(self) #lock = CransLock(self)
for item in ['aid', 'uid', 'chbre', 'mailAlias', 'canonicalAlias', for item in ['aid', 'uid', 'chbre', 'mailAlias', 'canonicalAlias',
'fid', 'cid', 'mid', 'macAddress', 'host', 'hostAlias' ]: 'fid', 'cid', 'mid', 'macAddress', 'host', 'hostAlias' ]:
@ -247,8 +240,8 @@ class CransLdapObject(object):
self.conn = conn self.conn = conn
if ldif: if ldif:
# Vous précisez un ldif, l'objet est 'ro'
self.dn = dn self.dn = dn
# /!\ attention, on a pas un uldif (rapidité...)
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:
@ -259,11 +252,23 @@ class CransLdapObject(object):
if not res: if not res:
raise ValueError ('objet inexistant: %s' % dn) raise ValueError ('objet inexistant: %s' % dn)
self.dn, self.attrs = res[0] self.dn, self.attrs = res[0]
if mode in ['w', 'rw']:
self.attrs = ldif_to_cldif(self.attrs)
else:
self.attrs = ldif_to_uldif(self.attrs) self.attrs = ldif_to_uldif(self.attrs)
self.__class__ = eval(self.attrs['objectClass'][0]) if mode in ['w', 'rw']:
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) # self._modifs = copy.deepcopy(self.attrs)
def save(self): def save(self):
@ -313,8 +318,6 @@ class CransLdapObject(object):
# On attrify # On attrify
new_vals = [ attrify(val, attr, self._modifs) for val in new_vals ] new_vals = [ attrify(val, attr, self._modifs) for val in new_vals ]
# XXX - Manque un sanity check
# Si ça passe, on effectue les modifications # Si ça passe, on effectue les modifications
old_vals = [ str(val) for val in self.attrs.get(attr, []) ] old_vals = [ str(val) for val in self.attrs.get(attr, []) ]
new_vals = [ str(val) for val in new_vals ] 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 """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 l'attribut attr n'a qu'une seule valeur, il n'est pas nécessaire
de préciser oldVal.""" de préciser oldVal."""
new_val = attrify(new_val, attr, self._modifs)
new_vals = self.attrs.get(attr, [])[:] new_vals = self.attrs.get(attr, [])[:]
if old_val: # and oldVal in attrs: if old_val: # and oldVal in attrs:
new_vals = [ val for val in new_vals if str(val) != str(old_val) ] new_vals = [ val for val in new_vals if str(val) != str(old_val) ]