[attributs, objets] Des locks pour les attributs sensibles aux modifs concurentes

Pour le moment juste pour l'attribut solde
This commit is contained in:
Valentin Samir 2014-11-08 17:10:22 +01:00
parent f4645a8a34
commit c3ac740ca5
2 changed files with 10 additions and 0 deletions

View file

@ -255,6 +255,7 @@ class Attr(object):
optional = True optional = True
conn = None conn = None
unique = False unique = False
concurent = True
unique_exclue = [] unique_exclue = []
#: Le nom de l'attribut dans le schéma LDAP #: Le nom de l'attribut dans le schéma LDAP
ldap_name = None ldap_name = None
@ -817,6 +818,7 @@ class droits(Attr):
class solde(Attr): class solde(Attr):
python_type = float python_type = float
singlevalue = True singlevalue = True
concurent = False
optional = True optional = True
legend = u"Solde d'impression" legend = u"Solde d'impression"
can_modify = [imprimeur, nounou, tresorier] can_modify = [imprimeur, nounou, tresorier]

View file

@ -590,6 +590,14 @@ class CransLdapObject(object):
cranslib.deprecated.usage("Des locks ne devrait être ajoutés que dans un context manager", level=2) 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) self.conn.lockholder.addlock(attr, str(attribut), self.lockId)
locked.append((attr, str(attribut), self.lockId)) locked.append((attr, str(attribut), self.lockId))
# On lock si l'attribut ne supporte pas les modifications concurente (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
if not attribut.concurent and self._modifs.get(attr, []) == self.attrs.get(attr, []) and attrs_before_verif != self.attrs.get(attr, []):
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("dn", "%s_%s" % (self.dn.replace('=', '-').replace(',','_'), attr), self.lockId)
locked.append(("dn", "%s_%s" % (self.dn.replace('=', '-').replace(',','_'), attr), self.lockId))
except ldap_locks.LockError: except ldap_locks.LockError:
# Si on ne parvient pas à prendre le lock pour l'une des valeurs # 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 # on libère les locks pris jusque là et on propage l'erreur