Cas d'un attribut binary

C'est un peu moche comme on s'est efforcé que dans lc_ldap tout soit un unicode et que
unicode n'a pas de sens pour un objet binaire. Avec le champ python_type = str sur les
attributs bianire, ça a tout de même l'air d'aller.
This commit is contained in:
Valentin Samir 2014-02-22 23:09:29 +01:00
parent 44936fde9d
commit 43f4ba650a
2 changed files with 27 additions and 3 deletions

View file

@ -67,7 +67,14 @@ def ldif_to_uldif(ldif):
""" """
uldif = {} uldif = {}
for attr, vals in ldif.items(): for attr, vals in ldif.items():
uldif[attr] = [ unicode(val, 'utf-8') for val in vals ] if attr.endswith(';binary'):
binary = True
attr=attr[:-7]
else:
binary = False
attr_class = attributs.AttributeFactory.get(attr, fallback=attributs.Attr)
binary = binary or attr_class.binary
uldif[attr] = [ unicode(val, 'utf-8') if not binary else val for val in vals ]
return uldif return uldif
class lc_ldap(ldap.ldapobject.LDAPObject, object): class lc_ldap(ldap.ldapobject.LDAPObject, object):

View file

@ -279,14 +279,21 @@ class CransLdapObject(object):
except ldap.NO_SUCH_OBJECT: except ldap.NO_SUCH_OBJECT:
pass pass
for attr in self.attrs.keys(): binary = set()
for attr in self.keys():
for attribut in self[attr]: for attribut in self[attr]:
attribut.check_uniqueness([]) attribut.check_uniqueness([])
if self[attr] and self[attr][0].binary:
binary.add(attr)
self.history_add(login, u"Inscription") self.history_add(login, u"Inscription")
ldif = self._modifs.to_ldif()
for attr in binary:
ldif['%s;binary' % attr]=ldif[attr]
del(ldif[attr])
# Création de la requête LDAP # Création de la requête LDAP
modlist = addModlist(self._modifs.to_ldif()) modlist = addModlist(ldif)
# Requête LDAP de création de l'objet # Requête LDAP de création de l'objet
try: try:
self.conn.add_s(self.dn, modlist) self.conn.add_s(self.dn, modlist)
@ -405,8 +412,18 @@ class CransLdapObject(object):
def get_modlist(self): def get_modlist(self):
"""Renvoie un dictionnaire des modifications apportées à l'objet""" """Renvoie un dictionnaire des modifications apportées à l'objet"""
# unicode -> utf-8 # unicode -> utf-8
binary = set()
for attr in self.keys():
if self[attr] and self[attr][0].binary:
binary.add(attr)
ldif = self._modifs.to_ldif() ldif = self._modifs.to_ldif()
orig_ldif = self.attrs.to_ldif() orig_ldif = self.attrs.to_ldif()
for attr in binary:
ldif['%s;binary' % attr]=ldif[attr]
orig_ldif['%s;binary' % attr]=orig_ldif[attr]
del(ldif[attr])
del(orig_ldif[attr])
return modifyModlist(orig_ldif, ldif) return modifyModlist(orig_ldif, ldif)