[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:
parent
8739640687
commit
03c45b8889
2 changed files with 54 additions and 3 deletions
51
attributs.py
51
attributs.py
|
@ -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):
|
||||||
|
|
|
@ -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):
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue