diff --git a/objets.py b/objets.py index 8b39bfb..277f26a 100644 --- a/objets.py +++ b/objets.py @@ -602,9 +602,13 @@ class CransLdapObject(object): cranslib.deprecated.usage("Des locks ne devrait être ajoutés que dans un context manager", level=2) self.conn.lockholder.addlock("dn", "%s_%s" % (self.dn.replace('=', '-').replace(',','_'), attr), self.lockId) locked.append(("dn", "%s_%s" % (self.dn.replace('=', '-').replace(',','_'), attr), self.lockId)) - # une fois le lock acquit, on vérifie que l'attribut n'a pas été édité entre temps - if self.conn.search(dn=self.dn, scope=0)[0].get(attr, []) != self.attrs.get(attr, []): - raise ldap_locks.LockError("L'attribut %s a été modifié dans la base ldap avant l'acquisition du lock" % attr) + try: + # une fois le lock acquit, on vérifie que l'attribut n'a pas été édité entre temps + if self.conn.search(dn=self.dn, scope=0)[0].get(attr, []) != self.attrs.get(attr, []): + raise ldap_locks.LockError("L'attribut %s a été modifié dans la base ldap avant l'acquisition du lock" % attr) + # L'objet n'existe pas dans la base ldap (resurection par exemple), donc pas de problème + except ldap.NO_SUCH_OBJECT: + pass except ldap_locks.LockError: # Si on ne parvient pas à prendre le lock pour l'une des valeurs # on libère les locks pris jusque là et on propage l'erreur