[global] On jette ctxt_check, et les ldifs qui traînent partout, qu'on remplace.

* Les ldifs sont remplacés par un pointeur vers l'objet propriétaire des attributs
 * Le test de cardinalité est fait lors du setitem dans AttrsDict
 * Le test d'unicité dans le setitem d'un CransLdapObject.
   Le setitem vérifie également qu'on affecte pas des attributs non désirés à un objet
This commit is contained in:
Pierre-Elliott Bécue 2013-04-08 00:12:00 +02:00
parent 60ea18d180
commit 180c17baed
2 changed files with 172 additions and 170 deletions

View file

@ -104,7 +104,7 @@ def ldif_to_uldif(ldif):
uldif[attr] = [ unicode(val, 'utf-8') for val in vals ]
return uldif
def ldif_to_cldif(ldif, conn, check_ctxt = True):
def ldif_to_cldif(ldif, conn):
"""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
@ -112,7 +112,7 @@ def ldif_to_cldif(ldif, conn, check_ctxt = True):
"""
cldif = {}
for attr, vals in ldif.items():
cldif[attr] = [ attributs.attrify(val, attr, ldif, conn, check_ctxt) for val in vals]
cldif[attr] = [ attributs.attrify(val, attr, ldif, conn) for val in vals]
return cldif
def cldif_to_ldif(cldif):
@ -325,7 +325,7 @@ class lc_ldap(ldap.ldapobject.LDAPObject, object):
continue
else:
# On crée l'attribut associé, pour parser sa valeur.
my_id = attributs.attrify(unicode(i), attr, {}, self, False)
my_id = attributs.attrify(unicode(i), attr, self, False, None)
if my_id.value != i:
continue
else:
@ -456,20 +456,20 @@ class CransLdapObject(object):
raise TypeError("conn doit être une instance de lc_ldap")
self.conn = conn
self.attrs = attributs.AttrsDict(conn) # Contient un dico uldif qui doit représenter ce qui
self.attrs = attributs.AttrsDict(conn, Parent=self) # Contient un dico uldif qui doit représenter ce qui
# est dans la base. On attrify paresseusement au moment où on utilise un attribut
self._modifs = None # C'est là qu'on met les modifications
self._modifs_unchecked = []
self.dn = dn
orig = {}
if ldif:
if dn != base_dn: # new_cransldapobject ne donne pas de ldif formaté et utilise un ldif non formaté, donc on formate
self.attrs = attributs.AttrsDict(self.conn, ldif, check_ctxt = False)
self.attrs = attributs.AttrsDict(self.conn, ldif, Parent=self)
else:
self.attrs = ldif
self._modifs = attributs.AttrsDict(self.conn, ldif, check_ctxt = False)
self._modifs = attributs.AttrsDict(self.conn, ldif, Parent=self)
orig = ldif
elif dn != base_dn:
@ -480,12 +480,12 @@ class CransLdapObject(object):
# L'objet sortant de la base ldap, on ne fait pas de vérifications sur
# l'état des données.
self.attrs = attributs.AttrsDict(self.conn, res_attrs, check_ctxt = False)
self.attrs = attributs.AttrsDict(self.conn, res_attrs, Parent=self)
# Pour test en cas de mode w ou rw
orig = res[0][1]
self._modifs = attributs.AttrsDict(self.conn, res[0][1], check_ctxt = False)
self._modifs = attributs.AttrsDict(self.conn, res[0][1], Parent=self)
if mode in ['w', 'rw']:
if not self.may_be(modified, self.conn.droits + self.conn._check_parent(dn) + self.conn._check_self(dn)):
@ -550,7 +550,7 @@ class CransLdapObject(object):
raise EnvironmentError("Impossible de modifier l'objet, peut-être n'existe-t-il pas ?")
# Vérification des modifications
self.attrs = attributs.AttrsDict(self.conn, self.conn.search_s(self.dn, 0)[0][1], check_ctxt=False)
self.attrs = attributs.AttrsDict(self.conn, self.conn.search_s(self.dn, 0)[0][1], Parent=self)
differences = []
# On fait les différences entre les deux dicos
for attr in set(self.attrs.keys()).union(set(self._modifs.keys())):
@ -607,6 +607,8 @@ class CransLdapObject(object):
# Quand on est pas en mode d'écriture, ça plante.
if self.mode not in ['w', 'rw']:
raise ValueError("Objet en lecture seule")
if not self.has_key(attr):
raise ValueError("L'objet que vous modifiez n'a pas d'attribut %s" % (attr))
# Les valeurs sont nécessairement stockées en liste
if not isinstance(values, list):
values = [ values ]
@ -616,12 +618,9 @@ class CransLdapObject(object):
# (on peut pas utiliser self._modifs, car il ne faut
# faire le changement que si on peut)
# Sans le dict(), les deux pointent vers le même truc.
ldif = dict(self._modifs)
# On doit encoder, car _modifs est un ensemble de données brutes
# comme tout ldif
ldif[attr] = [ value.encode('utf-8') for value in values ]
attrs_before_verif = [ attributs.attrify(val, attr, ldif, self.conn) for val in values ]
attrs_before_verif = [ attributs.attrify(val, attr, self.conn, Parent=self) for val in values ]
for attribut in attrs_before_verif:
attribut.check_uniqueness([str(content) for content in self.attrs[attr]])
# On groupe les attributs précédents, et les nouveaux
mixed_attrs = attrs_before_verif + self.attrs[attr]
@ -950,7 +949,8 @@ class facture(CransLdapObject):
}
attribs = [attributs.fid, attributs.modePaiement, attributs.recuPaiement]
class service(CransLdapObject): pass
class lock(CransLdapObject): pass
class service(CransLdapObject):
pass
class lock(CransLdapObject):
pass