[lc_ldap, attributs] less Attrs doivent pouvoir accéder à conn

This commit is contained in:
Antoine Durand-Gasselin 2010-10-16 17:38:52 +02:00
parent 72e7f49f6c
commit d69d651282
2 changed files with 10 additions and 14 deletions

View file

@ -51,7 +51,7 @@ def validate_mac(value):
"""Vérifie qu'une adresse mac est valide""" """Vérifie qu'une adresse mac est valide"""
return True return True
def attrify(val, attr, ldif, ctxt_check = True): def attrify(val, attr, ldif, conn, ctxt_check = True):
"""Transforme un n'importe quoi en Attr. """Transforme un n'importe quoi en Attr.
Doit effectuer les normalisations et sanity check si un str ou un Doit effectuer les normalisations et sanity check si un str ou un
@ -63,14 +63,15 @@ def attrify(val, attr, ldif, ctxt_check = True):
if isinstance(val, Attr): if isinstance(val, Attr):
return val return val
else: else:
return CRANS_ATTRIBUTES[attr](val, ldif, ctxt_check) return CRANS_ATTRIBUTES[attr](val, ldif, conn, ctxt_check)
class Attr(object): class Attr(object):
legend = "Human-readable description of attribute" legend = "Human-readable description of attribute"
singlevalue = None singlevalue = None
optional = None optional = None
conn = None
def __init__(self, val, ldif, ctxt_check): def __init__(self, val, ldif, conn, ctxt_check):
"""Crée un nouvel objet représentant un attribut. """Crée un nouvel objet représentant un attribut.
val: valeur de l'attribut val: valeur de l'attribut
@ -78,6 +79,7 @@ class Attr(object):
ctxt_check: effectue les validations ctxt_check: effectue les validations
""" """
self.value = None self.value = None
self.conn = conn
assert isinstance(val, unicode) assert isinstance(val, unicode)
self.parse_value(val) self.parse_value(val)
if ctxt_check: if ctxt_check:
@ -106,12 +108,6 @@ class Attr(object):
if not self.optional and len(values) == 0: if not self.optional and len(values) == 0:
raise ValueError('%s doit avoir au moins une valeur' % self.__class__) raise ValueError('%s doit avoir au moins une valeur' % self.__class__)
def _check_type(self, values):
"""Vérifie que les valeurs ont le bon type (nom est un mot, tel
est un nombre, etc...)"""
for val in values:
assert isinstance(val, unicode)
def _check_uniqueness(self): def _check_uniqueness(self):
"""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...)"""

View file

@ -62,7 +62,7 @@ def ldif_to_uldif(ldif):
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, check_ctxt = True): def ldif_to_cldif(ldif, conn, check_ctxt = True):
"""Transforme un dictionnaire renvoyé par python-ldap, en """Transforme un dictionnaire renvoyé par python-ldap, en
un dictionnaire dont les valeurs sont des instances de Attr 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 Lorsqu'on récupère le ldif de la base ldap, on n'a pas besoin
@ -70,7 +70,7 @@ def ldif_to_cldif(ldif, check_ctxt = True):
""" """
cldif = {} cldif = {}
for attr, vals in ldif.items(): for attr, vals in ldif.items():
cldif[attr] = [ attrify(val, attr, ldif, check_ctxt = check_ctxt) for val in vals] cldif[attr] = [ attrify(val, attr, ldif, conn, check_ctxt = check_ctxt) for val in vals]
return cldif return cldif
def cldif_to_ldif(cldif): def cldif_to_ldif(cldif):
@ -182,7 +182,7 @@ class lc_ldap(ldap.ldapobject.LDAPObject):
def _create_entity(self, dn, uldif): 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(uldif) cldif = ldif_to_cldif(uldif, self)
#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' ]:
@ -255,7 +255,7 @@ class CransLdapObject(object):
self.attrs = ldif_to_uldif(self.attrs) self.attrs = ldif_to_uldif(self.attrs)
if mode in ['w', 'rw']: if mode in ['w', 'rw']:
self.attrs = ldif_to_cldif(self.attrs, check_ctxt = False) self.attrs = ldif_to_cldif(self.attrs, conn, check_ctxt = False)
### Vérification que `λv. str(Attr(v))` est bien une projection ### Vérification que `λv. str(Attr(v))` est bien une projection
oldif = res[0][1] oldif = res[0][1]
@ -319,7 +319,7 @@ class CransLdapObject(object):
# On attrify # On attrify
cldif = self.attrs.copy() cldif = self.attrs.copy()
cldif[attr] = new_vals cldif[attr] = new_vals
new_vals = [ attrify(val, attr, cldif) for val in new_vals ] new_vals = [ attrify(val, attr, cldif, conn) for val in new_vals ]
# 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, []) ]