diff --git a/mongoengine/base.py b/mongoengine/base.py index 18a831d9..625d1a1d 100644 --- a/mongoengine/base.py +++ b/mongoengine/base.py @@ -1147,17 +1147,12 @@ class BaseList(list): self.observer = observer super(BaseList, self).__init__(list_items) - def __getattribute__(self, name): - if name == 'observer' and not hasattr(self, 'observer'): - self.observer = DataObserver(None, None) - return super(BaseList, self).__getattribute__(name) - def __setitem__(self, *args, **kwargs): - self.observer.updated() + self._updated() super(BaseList, self).__setitem__(*args, **kwargs) def __delitem__(self, *args, **kwargs): - self.observer.updated() + self._updated() super(BaseList, self).__delitem__(*args, **kwargs) def __getstate__(self): @@ -1168,33 +1163,39 @@ class BaseList(list): self = state def append(self, *args, **kwargs): - self.observer.updated() + self._updated() return super(BaseList, self).append(*args, **kwargs) def extend(self, *args, **kwargs): - self.observer.updated() + self._updated() return super(BaseList, self).extend(*args, **kwargs) def insert(self, *args, **kwargs): - self.observer.updated() + self._updated() return super(BaseList, self).insert(*args, **kwargs) def pop(self, *args, **kwargs): - self.observer.updated() + self._updated() return super(BaseList, self).pop(*args, **kwargs) def remove(self, *args, **kwargs): - self.observer.updated() + self._updated() return super(BaseList, self).remove(*args, **kwargs) def reverse(self, *args, **kwargs): - self.observer.updated() + self._updated() return super(BaseList, self).reverse(*args, **kwargs) def sort(self, *args, **kwargs): - self.observer.updated() + self._updated() return super(BaseList, self).sort(*args, **kwargs) + def _updated(self): + try: + self.observer.updated() + except AttributeError: + pass + class BaseDict(dict): """A special dict so we can watch any changes @@ -1204,25 +1205,20 @@ class BaseDict(dict): self.observer = observer super(BaseDict, self).__init__(dict_items) - def __getattribute__(self, name): - if name == 'observer' and not hasattr(self, 'observer'): - self.observer = DataObserver(None, None) - return super(BaseDict, self).__getattribute__(name) - def __setitem__(self, *args, **kwargs): - self.observer.updated() + self._updated() super(BaseDict, self).__setitem__(*args, **kwargs) def __delete__(self, *args, **kwargs): - self.observer.updated() + self._updated() super(BaseDict, self).__delete__(*args, **kwargs) def __delitem__(self, *args, **kwargs): - self.observer.updated() + self._updated() super(BaseDict, self).__delitem__(*args, **kwargs) def __delattr__(self, *args, **kwargs): - self.observer.updated() + self._updated() super(BaseDict, self).__delattr__(*args, **kwargs) def __getstate__(self): @@ -1233,17 +1229,22 @@ class BaseDict(dict): self = state def clear(self, *args, **kwargs): - self.observer.updated() + self._updated() super(BaseDict, self).clear(*args, **kwargs) def pop(self, *args, **kwargs): - self.observer.updated() + self._updated() super(BaseDict, self).clear(*args, **kwargs) def popitem(self, *args, **kwargs): - self.observer.updated() + self._updated() super(BaseDict, self).clear(*args, **kwargs) + def _updated(self): + try: + self.observer.updated() + except AttributeError: + pass if sys.version_info < (2, 5): # Prior to Python 2.5, Exception was an old-style class