Almost working new tickerhandler. Still some errors with using idstrings. Also still some debug messages in place.
This commit is contained in:
parent
77b178bf28
commit
bd7f9dfe47
1 changed files with 22 additions and 12 deletions
|
|
@ -99,30 +99,36 @@ class Ticker(object):
|
||||||
kwargs is used here to identify which hook method to call.
|
kwargs is used here to identify which hook method to call.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
to_remove = []
|
||||||
for store_key, (args, kwargs) in self.subscriptions.iteritems():
|
for store_key, (args, kwargs) in self.subscriptions.iteritems():
|
||||||
|
print "calling:", store_key, args, kwargs
|
||||||
callback = yield kwargs.pop("_callback", "at_tick")
|
callback = yield kwargs.pop("_callback", "at_tick")
|
||||||
|
obj = yield kwargs.pop("_obj", None)
|
||||||
try:
|
try:
|
||||||
if callable(callback):
|
if callable(callback):
|
||||||
# call directly
|
# call directly
|
||||||
yield callback(*args, **kwargs)
|
yield callback(*args, **kwargs)
|
||||||
return
|
return
|
||||||
|
|
||||||
# try object method
|
# try object method
|
||||||
obj = yield kwargs.pop("_obj", None)
|
|
||||||
if not obj or not obj.pk:
|
if not obj or not obj.pk:
|
||||||
# object was deleted between calls
|
# object was deleted between calls
|
||||||
self.remove(store_key)
|
log_err("Obj undefined. Removing ticker.")
|
||||||
|
to_remove.append(store_key)
|
||||||
continue
|
continue
|
||||||
else:
|
else:
|
||||||
yield _GA(obj, callback)(*args, **kwargs)
|
yield _GA(obj, callback)(*args, **kwargs)
|
||||||
except ObjectDoesNotExist:
|
except ObjectDoesNotExist:
|
||||||
log_trace()
|
log_trace("Removing ticker.")
|
||||||
self.remove(store_key)
|
to_remove.append(store_key)
|
||||||
except Exception:
|
except Exception:
|
||||||
log_trace()
|
log_trace()
|
||||||
finally:
|
finally:
|
||||||
# make sure to re-store
|
# make sure to re-store
|
||||||
kwargs["_callback"] = callback
|
kwargs["_callback"] = callback
|
||||||
|
kwargs["_obj"] = obj
|
||||||
|
# cleanup
|
||||||
|
for store_key in to_remove:
|
||||||
|
self.remove(store_key)
|
||||||
|
|
||||||
def __init__(self, interval):
|
def __init__(self, interval):
|
||||||
"""
|
"""
|
||||||
|
|
@ -167,6 +173,7 @@ class Ticker(object):
|
||||||
|
|
||||||
"""
|
"""
|
||||||
start_delay = kwargs.pop("_start_delay", None)
|
start_delay = kwargs.pop("_start_delay", None)
|
||||||
|
print "adding sub:", store_key, args, kwargs
|
||||||
self.subscriptions[store_key] = (args, kwargs)
|
self.subscriptions[store_key] = (args, kwargs)
|
||||||
self.validate(start_delay=start_delay)
|
self.validate(start_delay=start_delay)
|
||||||
|
|
||||||
|
|
@ -235,6 +242,8 @@ class TickerPool(object):
|
||||||
_, _, _, interval, _ = store_key
|
_, _, _, interval, _ = store_key
|
||||||
if interval in self.tickers:
|
if interval in self.tickers:
|
||||||
self.tickers[interval].remove(store_key)
|
self.tickers[interval].remove(store_key)
|
||||||
|
if not self.tickers[interval]:
|
||||||
|
del self.tickers[interval]
|
||||||
|
|
||||||
def stop(self, interval=None):
|
def stop(self, interval=None):
|
||||||
"""
|
"""
|
||||||
|
|
@ -274,7 +283,7 @@ class TickerHandler(object):
|
||||||
self.save_name = save_name
|
self.save_name = save_name
|
||||||
self.ticker_pool = self.ticker_pool_class()
|
self.ticker_pool = self.ticker_pool_class()
|
||||||
|
|
||||||
def _get_callback(callback):
|
def _get_callback(self, callback):
|
||||||
"""
|
"""
|
||||||
Analyze callback and determine its consituents
|
Analyze callback and determine its consituents
|
||||||
|
|
||||||
|
|
@ -329,9 +338,9 @@ class TickerHandler(object):
|
||||||
`obj_or_path` is a python-path.
|
`obj_or_path` is a python-path.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
outobj = pack_dbobj(obj) if obj and hasattr(obj, "db_key") else None
|
outobj = obj if obj and hasattr(obj, "db_key") else None
|
||||||
outpath = path if isinstance(basestring, path) else None
|
outpath = path if path and isinstance(path, basestring) else None
|
||||||
methodname = callfunc if callfunc and isinstance(basestring, callfunc) else None
|
methodname = callfunc if callfunc and isinstance(callfunc, basestring) else None
|
||||||
return (outobj, methodname, outpath, interval, idstring)
|
return (outobj, methodname, outpath, interval, idstring)
|
||||||
|
|
||||||
def save(self):
|
def save(self):
|
||||||
|
|
@ -373,12 +382,12 @@ class TickerHandler(object):
|
||||||
try:
|
try:
|
||||||
obj, methodname, path, interval, idstring = store_key
|
obj, methodname, path, interval, idstring = store_key
|
||||||
if obj and methodname:
|
if obj and methodname:
|
||||||
kwargs["_callable"] = methodname
|
kwargs["_callback"] = methodname
|
||||||
kwargs["_obj"] = obj
|
kwargs["_obj"] = obj
|
||||||
elif path:
|
elif path:
|
||||||
modname, varname = path.rsplit(".", 1)
|
modname, varname = path.rsplit(".", 1)
|
||||||
callback = variable_from_module(modname, varname)
|
callback = variable_from_module(modname, varname)
|
||||||
kwargs["_callable"] = callback
|
kwargs["_callback"] = callback
|
||||||
kwargs["_obj"] = None
|
kwargs["_obj"] = None
|
||||||
except Exception as err:
|
except Exception as err:
|
||||||
# this suggests a malformed save or missing objects
|
# this suggests a malformed save or missing objects
|
||||||
|
|
@ -418,7 +427,7 @@ class TickerHandler(object):
|
||||||
self.ticker_storage[store_key] = (args, kwargs)
|
self.ticker_storage[store_key] = (args, kwargs)
|
||||||
self.save()
|
self.save()
|
||||||
kwargs["_obj"] = obj
|
kwargs["_obj"] = obj
|
||||||
kwargs["_callable"] = callfunc # either method-name or callable
|
kwargs["_callback"] = callfunc # either method-name or callable
|
||||||
self.ticker_pool.add(store_key, *args, **kwargs)
|
self.ticker_pool.add(store_key, *args, **kwargs)
|
||||||
|
|
||||||
def remove(self, interval=60, callback=None, idstring=""):
|
def remove(self, interval=60, callback=None, idstring=""):
|
||||||
|
|
@ -435,6 +444,7 @@ class TickerHandler(object):
|
||||||
"""
|
"""
|
||||||
obj, path, callfunc = self._get_callback(callback)
|
obj, path, callfunc = self._get_callback(callback)
|
||||||
store_key = self._store_key(obj, path, interval, callfunc, idstring)
|
store_key = self._store_key(obj, path, interval, callfunc, idstring)
|
||||||
|
print "remove store_key:", store_key
|
||||||
to_remove = self.ticker_storage.pop(store_key, None)
|
to_remove = self.ticker_storage.pop(store_key, None)
|
||||||
if to_remove:
|
if to_remove:
|
||||||
self.ticker_pool.remove(store_key)
|
self.ticker_pool.remove(store_key)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue