diff --git a/objets.py b/objets.py index 62fb3d4..961f257 100644 --- a/objets.py +++ b/objets.py @@ -639,15 +639,7 @@ class CransLdapObject(object): # qui est assez sensible. self._check_setitem(attr, attrs_before_verif) - # Vérification que (attr, value) est localement unique et - # si attr doit être globalement unique, l'unicité globale - # Dans ce cas, on ne tiens pas compte de old_attrs cas ils - # vont être effacé si le setitem réussi old_attrs = self[attr] - for attribut in attrs_before_verif: - if attrs_before_verif.count(attribut) > 1: - raise ValueError("%s en double\n(%s)" % (attribut.legend if attribut.legend else attr, attribut)) - attribut.check_uniqueness(old_attrs) # On groupe les attributs précédents, et les nouveaux mixed_attrs = attrs_before_verif + old_attrs @@ -664,11 +656,22 @@ class CransLdapObject(object): locked = [] try: for attribut in attrs_before_verif: + # Vérification que (attr, value) est localement unique + if attrs_before_verif.count(attribut) > 1: + raise ValueError("%s en double\n(%s)" % (attribut.legend if attribut.legend else attr, attribut)) + + # On lock les nouvelles valeurs globalement unique if attribut.unique and not attribut in self._modifs.get(attr, []) and not attribut in attribut.unique_exclue: if not self.in_context: cranslib.deprecated.usage("Des locks ne devrait être ajoutés que dans un context manager", level=2) self.conn.lockholder.addlock(attr, str(attribut), self.lockId) locked.append((attr, str(attribut), self.lockId)) + + # si attr doit être globalement unique, vérification de l'unicité globale + # Dans ce cas, on ne tiens pas compte de old_attrs cas ils + # vont être effacé si le setitem réussi + attribut.check_uniqueness(old_attrs) + # On lock si l'attribut ne supporte pas les modifications concurrente (comme pour le solde) si : # * on effectue réellement un modification sur l'attribut # * on a pas déjà effectuer un modification qui nous a déjà fait acquérir le lock @@ -684,7 +687,7 @@ class CransLdapObject(object): # 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: + except (ldap_locks.LockError, ValueError, attributs.UniquenessError): # 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 # les anciens locks et self._modifs reste bien inchangés