Made OOB tracking work for Attributes. Tested repeat across reloads.
This commit is contained in:
parent
57e7c6a11e
commit
d7fc0c7e16
2 changed files with 25 additions and 19 deletions
|
|
@ -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()
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue