[attributs, objets] Possibilité d'utiliser directement les methodes sur les liste renvoyé par __getitems__ sur un cransLdapObjet

Au lieu d'être obligé de faire à chaque fois obj[attr] = obj[attr] + [val]
on peut faire directement obj[attr].append(val).
Si on affecte obj[attr] à une variable (l=obj[attr])
et que l'on modifie la variable (l.append(val)), a la fois la variable et obj[attr] sont modifié
et maintenue à jour.
Attention toutefois :
 l1 = obj[attr]
 l2 = obj[attr]
 l1 == l2 <=> True

 l1.append(val)
 l1 == obj[attr] <=> True
 l1 == l2 <=> False
 l2 == obj[attr] <=> False

et l2.append(val) lèvera une exception.
This commit is contained in:
Valentin Samir 2014-02-14 02:06:47 +01:00
parent 8739640687
commit 03c45b8889
2 changed files with 54 additions and 3 deletions

View file

@ -131,6 +131,57 @@ def attrify(val, attr, conn, Parent=None):
val = val.decode('utf-8') val = val.decode('utf-8')
return attr_classe(val, conn, Parent) return attr_classe(val, conn, Parent)
class AttrsList(list):
def __init__(self, Parent, attr, attr_list):
super(AttrsList, self).__init__(attr_list)
self._parent = Parent
self._attr = attr
def _start(self):
if self._parent[self._attr] != self:
raise ValueError("La variable que vous utilisez n'est pas à jour (modifications conccurentes ?)")
def _commit(self):
try:
self._parent[self._attr] = self
finally:
super(AttrsList, self).__init__(self._parent[self._attr])
def append(self, val):
self._start()
super(AttrsList, self).append(val)
self._commit()
def extend(self, vals):
self._start()
super(AttrsList, self).extend(vals)
self._commit()
def insert(self, pos, val):
self._start()
super(AttrsList, self).insert(pos, val)
self._commit()
def remove(self, val):
self._start()
super(AttrsList, self).remove(val)
self._commit()
def sort(self):
self._start()
super(AttrsList, self).sort()
self._commit()
def pop(self, index=None):
self._start()
ret = super(AttrsList, self).pop(index) if index else super(AttrsList, self).pop()
self._commit()
return ret
def reverse(self):
self._start()
super(AttrsList, self).reverse()
self._commit()
class AttrsDict(dict): class AttrsDict(dict):
def __init__(self, conn, uldif={}, Parent=None): def __init__(self, conn, uldif={}, Parent=None):

View file

@ -396,11 +396,11 @@ class CransLdapObject(object):
def __getitem__(self, attr, default=None): def __getitem__(self, attr, default=None):
if self._modifs.has_key(attr) and self.mode in [ 'w', 'rw' ]: if self._modifs.has_key(attr) and self.mode in [ 'w', 'rw' ]:
return [ v for v in self._modifs[attr] ] return attributs.AttrsList(self, attr, [ v for v in self._modifs[attr] ])
elif self.attrs.has_key(attr): elif self.attrs.has_key(attr):
return [ v for v in self.attrs[attr] ] return attributs.AttrsList(self, attr, [ v for v in self.attrs[attr] ])
elif self.has_key(attr): elif self.has_key(attr):
return [] if default is None else default return attributs.AttrsList(self, attr, []) if default is None else default
raise KeyError(attr) raise KeyError(attr)
def has_key(self, attr): def has_key(self, attr):