From 03c45b8889fb600f5c50d98a5d8838465117a625 Mon Sep 17 00:00:00 2001 From: Valentin Samir Date: Fri, 14 Feb 2014 02:06:47 +0100 Subject: [PATCH] =?UTF-8?q?[attributs,=20objets]=20Possibilit=C3=A9=20d'ut?= =?UTF-8?q?iliser=20directement=20les=20methodes=20sur=20les=20liste=20ren?= =?UTF-8?q?voy=C3=A9=20par=20=5F=5Fgetitems=5F=5F=20sur=20un=20cransLdapOb?= =?UTF-8?q?jet?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- attributs.py | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ objets.py | 6 +++--- 2 files changed, 54 insertions(+), 3 deletions(-) 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):