From d7fc0c7e160388ce30dbd9c531b1eaf599215da8 Mon Sep 17 00:00:00 2001 From: Griatch Date: Thu, 17 Oct 2013 19:07:01 +0200 Subject: [PATCH] Made OOB tracking work for Attributes. Tested repeat across reloads. --- src/server/oobhandler.py | 40 ++++++++++++++++++++++------------------ src/utils/dbserialize.py | 4 +++- 2 files changed, 25 insertions(+), 19 deletions(-) diff --git a/src/server/oobhandler.py b/src/server/oobhandler.py index cb9840f2be..949dfe5a63 100644 --- a/src/server/oobhandler.py +++ b/src/server/oobhandler.py @@ -52,7 +52,9 @@ class TrackerHandler(object): """ This is initiated and stored on the object as a property _trackerhandler. """ - self.obj = obj.dbobj + try: obj = obj.dbobj + except AttributeError: pass + self.obj = obj self.ntrackers = 0 # initiate store only with valid on-object fieldnames self.tracktargets = dict((key, {}) for key in _GA(_GA(self.obj, "_meta"), "get_all_field_names")()) @@ -204,10 +206,10 @@ class OOBHandler(object): ServerConf field """ if self.oob_tracker_storage: - print "saved tracker_storage:", self.oob_tracker_storage + #print "saved tracker_storage:", self.oob_tracker_storage ServerConfig.objects.conf(key="oob_tracker_storage", value=dbserialize(self.oob_tracker_storage)) if self.oob_repeat_storage: - print "saved repeat_storage:", self.oob_repeat_storage + #print "saved repeat_storage:", self.oob_repeat_storage ServerConfig.objects.conf(key="oob_repeat_storage", value=dbserialize(self.oob_repeat_storage)) self.oob_tracker_pool.stop() @@ -220,7 +222,7 @@ class OOBHandler(object): tracker_storage = ServerConfig.objects.conf(key="oob_tracker_storage") if tracker_storage: self.oob_tracker_storage = dbunserialize(tracker_storage) - print "recovered from tracker_storage:", self.oob_tracker_storage + #print "recovered from tracker_storage:", self.oob_tracker_storage for (obj, sessid, fieldname, trackerclass, args, kwargs) in self.oob_tracker_storage.values(): self.track(unpack_dbobj(obj), sessid, fieldname, trackerclass, *args, **kwargs) # make sure to purce the storage @@ -229,7 +231,7 @@ class OOBHandler(object): repeat_storage = ServerConfig.objects.conf(key="oob_repeat_storage") if repeat_storage: self.oob_repeat_storage = dbunserialize(repeat_storage) - print "recovered from repeat_storage:", self.oob_repeat_storage + #print "recovered from repeat_storage:", self.oob_repeat_storage for (obj, sessid, func_key, interval, args, kwargs) in self.oob_repeat_storage.values(): self.repeat(unpack_dbobj(obj), sessid, func_key, interval, *args, **kwargs) # make sure to purge the storage @@ -242,19 +244,17 @@ class OOBHandler(object): it to obj. If property_key is not given, but the OOB has a class property property_name, this will be used as the property name when assigning the OOB to - obj, otherwise tracker_key is ysed as the property name. + obj, otherwise tracker_key is used as the property name. """ - try: - obj = obj.dbobj - except AttributeError: - pass + try: obj = obj.dbobj + except AttributeError: pass + if not "_trackerhandler" in _GA(obj, "__dict__"): # assign trackerhandler to object _SA(obj, "_trackerhandler", TrackerHandler(obj)) # initialize object tracker = trackerclass(self, fieldname, sessid, *args, **kwargs) _GA(obj, "_trackerhandler").add(fieldname, tracker) - # store calling arguments as a pickle for retrieval later obj_packed = pack_dbobj(obj) storekey = (obj_packed, sessid, fieldname) @@ -266,10 +266,8 @@ class OOBHandler(object): Remove the OOB from obj. If oob implements an at_delete hook, this will be called with args, kwargs """ - try: - obj = obj.dbobj - except AttributeError: - pass + try: obj = obj.dbobj + except AttributeError: pass try: # call at_delete hook @@ -303,14 +301,18 @@ class OOBHandler(object): name in a way the Attribute expects. """ # get the attribute object if we can + try: obj = obj.dbobj + except AttributeError: pass attrobj = _GA(obj, "attributes").get(attr_name, return_obj=True) if attrobj: - self.track(attrobj, sessid, attr_name, trackerclass) + self.track(attrobj, sessid, "db_value", trackerclass, attr_name) def untrack_attribute(self, obj, sessid, attr_name, trackerclass): """ Shortcut for deactivating tracking for a given attribute. """ + try: obj = obj.dbobj + except AttributeError: pass attrobj = _GA(obj, "attributes").get(attr_name, return_obj=True) if attrobj: self.untrack(attrobj, sessid, attr_name, trackerclass) @@ -363,17 +365,19 @@ class OOBHandler(object): #print "OOB execute_cmd:", session, func_key, args, kwargs, _OOB_FUNCS.keys() oobfunc = _OOB_FUNCS[func_key] # raise traceback if not found oobfunc(self, session, *args, **kwargs) - except KeyError: - errmsg = "OOB Error: function '%s' not recognized." % func_key + except KeyError,e: + errmsg = "OOB Error: function '%s' not recognized: %s" % (func_key, e) if _OOB_ERROR: _OOB_ERROR(self, session, errmsg, *args, **kwargs) else: logger.log_trace(errmsg) + raise except Exception, err: errmsg = "OOB Error: Exception in '%s'(%s, %s):\n%s" % (func_key, args, kwargs, err) if _OOB_ERROR: _OOB_ERROR(self, session, errmsg, *args, **kwargs) else: logger.log_trace(errmsg) + raise # access object OOB_HANDLER = OOBHandler() diff --git a/src/utils/dbserialize.py b/src/utils/dbserialize.py index fa2fc9b205..61e402010d 100644 --- a/src/utils/dbserialize.py +++ b/src/utils/dbserialize.py @@ -209,7 +209,9 @@ def unpack_dbobj(item): except ObjectDoesNotExist: return None # even if we got back a match, check the sanity of the date (some databases may 're-use' the id) - return _TO_DATESTRING(obj.dbobj) == item[2] and obj or None + try: dbobj = obj.dbobj + except AttributeError: dbobj = obj + return _TO_DATESTRING(dbobj) == item[2] and obj or None # # Access methods