Ajout de methodes pour tester l'égalité d'objets ou d'attributs,

possibilité de fournir une valeur du bon type python à un attribut
test booléen sur s'attribut propagée à sa valeur.

Le teste d'égalité sur un attribut peut se faire avec la sérialisation de
l'attribut ou le type python qui le représente.
Le teste d'égalité sur les cransLdapObjet se fait sur le dn et ses attributs.
De plus, on peut aussi le testé avec un chaine de caractère :
 "host=freebox.crans.org" == MachineCrans(...) renvoie True ssi
MachineCrans(...) a l'attribut host, qu'il est globalement unique et vaut
freebox.crans.org

vala vala
This commit is contained in:
Valentin Samir 2014-02-13 22:34:00 +01:00
parent e9d092698a
commit ca170c19f4
2 changed files with 79 additions and 28 deletions

View file

@ -162,6 +162,41 @@ class CransLdapObject(object):
nvals = [nldif[attr][vals.index(v)] for v in vals ]
raise EnvironmentError("λv. str(Attr(v)) n'est peut-être pas une projection (ie non idempotente):", attr, nvals, vals)
def __eq__(self, obj):
if isinstance(obj, self.__class__):
if self.mode in ['w', 'rw']:
return self.dn == obj.dn and self._modifs == obj._modifs and self.attrs == obj.attrs
else:
return self.dn == obj.dn and self.attrs == obj.attrs
elif (isinstance(obj, str) or isinstance(obj, unicode)) and '=' in obj:
attr, val = obj.split('=', 1)
return attr in self.attrs.keys() and val in self[attr]
else:
return False
def __iter__(self):
if self.mode in [ 'w', 'rw' ]:
return self._modifs.__iter__()
else:
return self.attrs.__iter__()
def keys(self):
if self.mode in [ 'w', 'rw' ]:
return self._modifs.keys()
else:
return self.attrs.keys()
def values(self):
if self.mode in [ 'w', 'rw' ]:
return self._modifs.values()
else:
return self.attrs.values()
def items(self):
if self.mode in [ 'w', 'rw' ]:
return self._modifs.items()
else:
return self.attrs.items()
def display(self):
print printing.sprint(self)
@ -543,7 +578,7 @@ class proprio(CransLdapObject):
super(proprio, self).__init__(conn, dn, mode, ldif)
self._machines = None
self._factures = None
if u'cransAccount' in [ unicode(o) for o in self['objectClass']]:
if u'cransAccount' in self['objectClass']:
self.attribs = self.attribs + crans_account_attribs
self.full = True
@ -837,7 +872,7 @@ class adherent(proprio):
u"""Renvoie le nom du compte crans. S'il n'existe pas, et que uid
est précisé, le crée."""
if u'posixAccount' in [str(o) for o in self.attrs['objectClass']]:
if u'posixAccount' in self['objectClass']:
return self.attrs['uid'][0]
elif login: