Made OOB tracking work for Attributes. Tested repeat across reloads.

This commit is contained in:
Griatch 2013-10-17 19:07:01 +02:00
parent 57e7c6a11e
commit d7fc0c7e16
2 changed files with 25 additions and 19 deletions

View file

@ -52,7 +52,9 @@ class TrackerHandler(object):
""" """
This is initiated and stored on the object as a property _trackerhandler. 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 self.ntrackers = 0
# initiate store only with valid on-object fieldnames # initiate store only with valid on-object fieldnames
self.tracktargets = dict((key, {}) for key in _GA(_GA(self.obj, "_meta"), "get_all_field_names")()) 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 ServerConf field
""" """
if self.oob_tracker_storage: 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)) ServerConfig.objects.conf(key="oob_tracker_storage", value=dbserialize(self.oob_tracker_storage))
if self.oob_repeat_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)) ServerConfig.objects.conf(key="oob_repeat_storage", value=dbserialize(self.oob_repeat_storage))
self.oob_tracker_pool.stop() self.oob_tracker_pool.stop()
@ -220,7 +222,7 @@ class OOBHandler(object):
tracker_storage = ServerConfig.objects.conf(key="oob_tracker_storage") tracker_storage = ServerConfig.objects.conf(key="oob_tracker_storage")
if tracker_storage: if tracker_storage:
self.oob_tracker_storage = dbunserialize(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(): for (obj, sessid, fieldname, trackerclass, args, kwargs) in self.oob_tracker_storage.values():
self.track(unpack_dbobj(obj), sessid, fieldname, trackerclass, *args, **kwargs) self.track(unpack_dbobj(obj), sessid, fieldname, trackerclass, *args, **kwargs)
# make sure to purce the storage # make sure to purce the storage
@ -229,7 +231,7 @@ class OOBHandler(object):
repeat_storage = ServerConfig.objects.conf(key="oob_repeat_storage") repeat_storage = ServerConfig.objects.conf(key="oob_repeat_storage")
if repeat_storage: if repeat_storage:
self.oob_repeat_storage = dbunserialize(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(): 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) self.repeat(unpack_dbobj(obj), sessid, func_key, interval, *args, **kwargs)
# make sure to purge the storage # make sure to purge the storage
@ -242,19 +244,17 @@ class OOBHandler(object):
it to obj. it to obj.
If property_key is not given, but the OOB has a class property property_name, this 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 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: try: obj = obj.dbobj
obj = obj.dbobj except AttributeError: pass
except AttributeError:
pass
if not "_trackerhandler" in _GA(obj, "__dict__"): if not "_trackerhandler" in _GA(obj, "__dict__"):
# assign trackerhandler to object # assign trackerhandler to object
_SA(obj, "_trackerhandler", TrackerHandler(obj)) _SA(obj, "_trackerhandler", TrackerHandler(obj))
# initialize object # initialize object
tracker = trackerclass(self, fieldname, sessid, *args, **kwargs) tracker = trackerclass(self, fieldname, sessid, *args, **kwargs)
_GA(obj, "_trackerhandler").add(fieldname, tracker) _GA(obj, "_trackerhandler").add(fieldname, tracker)
# store calling arguments as a pickle for retrieval later # store calling arguments as a pickle for retrieval later
obj_packed = pack_dbobj(obj) obj_packed = pack_dbobj(obj)
storekey = (obj_packed, sessid, fieldname) storekey = (obj_packed, sessid, fieldname)
@ -266,10 +266,8 @@ class OOBHandler(object):
Remove the OOB from obj. If oob implements an Remove the OOB from obj. If oob implements an
at_delete hook, this will be called with args, kwargs at_delete hook, this will be called with args, kwargs
""" """
try: try: obj = obj.dbobj
obj = obj.dbobj except AttributeError: pass
except AttributeError:
pass
try: try:
# call at_delete hook # call at_delete hook
@ -303,14 +301,18 @@ class OOBHandler(object):
name in a way the Attribute expects. name in a way the Attribute expects.
""" """
# get the attribute object if we can # get the attribute object if we can
try: obj = obj.dbobj
except AttributeError: pass
attrobj = _GA(obj, "attributes").get(attr_name, return_obj=True) attrobj = _GA(obj, "attributes").get(attr_name, return_obj=True)
if attrobj: 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): def untrack_attribute(self, obj, sessid, attr_name, trackerclass):
""" """
Shortcut for deactivating tracking for a given attribute. 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) attrobj = _GA(obj, "attributes").get(attr_name, return_obj=True)
if attrobj: if attrobj:
self.untrack(attrobj, sessid, attr_name, trackerclass) 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() #print "OOB execute_cmd:", session, func_key, args, kwargs, _OOB_FUNCS.keys()
oobfunc = _OOB_FUNCS[func_key] # raise traceback if not found oobfunc = _OOB_FUNCS[func_key] # raise traceback if not found
oobfunc(self, session, *args, **kwargs) oobfunc(self, session, *args, **kwargs)
except KeyError: except KeyError,e:
errmsg = "OOB Error: function '%s' not recognized." % func_key errmsg = "OOB Error: function '%s' not recognized: %s" % (func_key, e)
if _OOB_ERROR: if _OOB_ERROR:
_OOB_ERROR(self, session, errmsg, *args, **kwargs) _OOB_ERROR(self, session, errmsg, *args, **kwargs)
else: else:
logger.log_trace(errmsg) logger.log_trace(errmsg)
raise
except Exception, err: except Exception, err:
errmsg = "OOB Error: Exception in '%s'(%s, %s):\n%s" % (func_key, args, kwargs, err) errmsg = "OOB Error: Exception in '%s'(%s, %s):\n%s" % (func_key, args, kwargs, err)
if _OOB_ERROR: if _OOB_ERROR:
_OOB_ERROR(self, session, errmsg, *args, **kwargs) _OOB_ERROR(self, session, errmsg, *args, **kwargs)
else: else:
logger.log_trace(errmsg) logger.log_trace(errmsg)
raise
# access object # access object
OOB_HANDLER = OOBHandler() OOB_HANDLER = OOBHandler()

View file

@ -209,7 +209,9 @@ def unpack_dbobj(item):
except ObjectDoesNotExist: except ObjectDoesNotExist:
return None return None
# even if we got back a match, check the sanity of the date (some databases may 're-use' the id) # 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 # Access methods