[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
|
@ -115,7 +115,7 @@ class Attr(object):
|
||||||
"""Vérifie l'unicité dans la base de la valeur (mailAlias, chbre,
|
"""Vérifie l'unicité dans la base de la valeur (mailAlias, chbre,
|
||||||
etc...)"""
|
etc...)"""
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def _check_values(self, values):
|
def _check_values(self, values):
|
||||||
"""Vérifie que les valeurs sont valides (typiquement chbre)"""
|
"""Vérifie que les valeurs sont valides (typiquement chbre)"""
|
||||||
pass
|
pass
|
||||||
|
|
50
lc_ldap.py
50
lc_ldap.py
|
@ -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]
|
||||||
|
|
||||||
|
self.attrs = ldif_to_uldif(self.attrs)
|
||||||
if mode in ['w', 'rw']:
|
if mode in ['w', 'rw']:
|
||||||
self.attrs = ldif_to_cldif(self.attrs)
|
self.attrs = ldif_to_cldif(self.attrs, check_ctxt = False)
|
||||||
else:
|
|
||||||
self.attrs = ldif_to_uldif(self.attrs)
|
### Vérification que `λv. str(Attr(v))` est bien une projection
|
||||||
self.__class__ = eval(self.attrs['objectClass'][0])
|
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) ]
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue