[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:
parent
60ea18d180
commit
180c17baed
2 changed files with 172 additions and 170 deletions
38
lc_ldap.py
38
lc_ldap.py
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue