From 0075c0a1e85929a4b418b8b73f3451173653ed5f Mon Sep 17 00:00:00 2001 From: Ross Lawley Date: Mon, 28 Nov 2011 05:54:03 -0800 Subject: [PATCH] Gracefully handle when self.observer is absent After pickles / deepcopying etc.. --- mongoengine/base.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/mongoengine/base.py b/mongoengine/base.py index c801c2ee..5a10cc73 100644 --- a/mongoengine/base.py +++ b/mongoengine/base.py @@ -1135,7 +1135,8 @@ class DataObserver(object): self.name = name def updated(self): - self.instance._mark_as_changed(self.name) + if hasattr(self.instance, '_mark_as_changed'): + self.instance._mark_as_changed(self.name) class BaseList(list): @@ -1146,6 +1147,11 @@ 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() super(BaseList, self).__setitem__(*args, **kwargs) @@ -1198,6 +1204,11 @@ 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(BaseList, self).__getattribute__(name) + def __setitem__(self, *args, **kwargs): self.observer.updated() super(BaseDict, self).__setitem__(*args, **kwargs)