[lc_ldap] On oublie les uldifs (presque)
This commit is contained in:
parent
f37092b94f
commit
1bc6ef63b0
2 changed files with 27 additions and 25 deletions
50
lc_ldap.py
50
lc_ldap.py
|
@ -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) ]
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue