diff --git a/attributs.py b/attributs.py index 13f5ebc..4fce7f7 100644 --- a/attributs.py +++ b/attributs.py @@ -248,10 +248,12 @@ class Attr(object): optional = True conn = None unique = False + unique_exclue = [] #: Le nom de l'attribut dans le schéma LDAP ldap_name = None python_type = None binary = False + default = None """La liste des droits qui suffisent à avoir le droit de modifier la valeur""" can_modify = [nounou] @@ -334,7 +336,7 @@ class Attr(object): """Vérifie l'unicité dans la base de la valeur (``mailAlias``, ``chbre``, etc...)""" attr = self.__class__.__name__ - if unicode(self) in liste_exclue: + if unicode(self) in liste_exclue + self.unique_exclue: return if self.unique: res = self.conn.search(u'%s=%s' % (attr, str(self))) @@ -671,7 +673,8 @@ class etudes(Attr): class chbre(Attr): singlevalue = True optional = False - unique = False + unique = True + unique_exclue = [u'????', u'EXT'] legend = u"Chambre sur le campus" can_modify = [soi, cableur, nounou] category = 'perso' diff --git a/objets.py b/objets.py index 59d4bb7..2a773c8 100644 --- a/objets.py +++ b/objets.py @@ -533,7 +533,7 @@ class CransLdapObject(object): locked = [] try: for attribut in attrs_before_verif: - if attribut.unique and not attribut in self._modifs.get(attr, []): + 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) @@ -548,7 +548,7 @@ class CransLdapObject(object): # On retire les locks des attributs que l'on ne va plus utiliser for attribut in self._modifs.get(attr, []): - if attribut.unique and not attribut in attrs_before_verif: + if attribut.unique and not attribut in attrs_before_verif and not attribut in attribut.unique_exclue: self.conn.lockholder.removelock(attr, str(attribut), self.lockId) # On met à jour self._modifs avec les nouvelles valeurs