diff --git a/attributs.py b/attributs.py index 49dd37b..d25b22d 100644 --- a/attributs.py +++ b/attributs.py @@ -131,6 +131,57 @@ def attrify(val, attr, conn, Parent=None): val = val.decode('utf-8') 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): def __init__(self, conn, uldif={}, Parent=None): diff --git a/objets.py b/objets.py index 4d6c07b..eab4177 100644 --- a/objets.py +++ b/objets.py @@ -396,11 +396,11 @@ class CransLdapObject(object): def __getitem__(self, attr, default=None): 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): - 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): - return [] if default is None else default + return attributs.AttrsList(self, attr, []) if default is None else default raise KeyError(attr) def has_key(self, attr):