Implemented a idstring for the tickerhandler, as per #554.

This commit is contained in:
Griatch 2014-10-19 19:40:42 +02:00
parent 36629a8bdb
commit f6b9b7e1a9

View file

@ -195,7 +195,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 _store_key(self, obj, interval): def _store_key(self, obj, interval, idstring=""):
""" """
Tries to create a store_key for the object. Tries to create a store_key for the object.
Returns a tuple (isdb, store_key) where isdb Returns a tuple (isdb, store_key) where isdb
@ -224,7 +224,7 @@ class TickerHandler(object):
objkey = id(obj) objkey = id(obj)
isdb = False isdb = False
# return sidb and store_key # return sidb and store_key
return isdb, (objkey, interval) return isdb, (objkey, interval, idstring)
def save(self): def save(self):
""" """
@ -237,7 +237,7 @@ class TickerHandler(object):
start_delays = dict((interval, ticker.task.next_call_time()) start_delays = dict((interval, ticker.task.next_call_time())
for interval, ticker in self.ticker_pool.tickers.items()) for interval, ticker in self.ticker_pool.tickers.items())
# update the timers for the tickers # update the timers for the tickers
for (obj, interval), (args, kwargs) in self.ticker_storage.items(): for (obj, interval, idstring), (args, kwargs) in self.ticker_storage.items():
kwargs["_start_delay"] = start_delays.get(interval, None) kwargs["_start_delay"] = start_delays.get(interval, None)
ServerConfig.objects.conf(key=self.save_name, ServerConfig.objects.conf(key=self.save_name,
@ -254,30 +254,34 @@ class TickerHandler(object):
if ticker_storage: if ticker_storage:
self.ticker_storage = dbunserialize(ticker_storage) self.ticker_storage = dbunserialize(ticker_storage)
#print "restore:", self.ticker_storage #print "restore:", self.ticker_storage
for (obj, interval), (args, kwargs) in self.ticker_storage.items(): for store_key, (args, kwargs) in self.ticker_storage.items():
if len(store_key) == 2:
# old form of store_key
store_key = (store_key[0], store_key[1], "")
obj, interval, idstring = store_key
obj = unpack_dbobj(obj) obj = unpack_dbobj(obj)
_, store_key = self._store_key(obj, interval) _, store_key = self._store_key(obj, interval, idstring)
self.ticker_pool.add(store_key, obj, interval, *args, **kwargs) self.ticker_pool.add(store_key, obj, interval, *args, **kwargs)
def add(self, obj, interval, *args, **kwargs): def add(self, obj, interval, idstring="", *args, **kwargs):
""" """
Add object to tickerhandler. The object must have an at_tick Add object to tickerhandler. The object must have an at_tick
method. This will be called every interval seconds until the method. This will be called every interval seconds until the
object is unsubscribed from the ticker. object is unsubscribed from the ticker.
""" """
isdb, store_key = self._store_key(obj, interval) isdb, store_key = self._store_key(obj, interval, idstring)
if isdb: if isdb:
self.ticker_storage[store_key] = (args, kwargs) self.ticker_storage[store_key] = (args, kwargs)
self.save() self.save()
self.ticker_pool.add(store_key, obj, interval, *args, **kwargs) self.ticker_pool.add(store_key, obj, interval, *args, **kwargs)
def remove(self, obj, interval=None): def remove(self, obj, interval=None, idstring=""):
""" """
Remove object from ticker, or only this object ticking Remove object from ticker, or only this object ticking
at a given interval. at a given interval.
""" """
if interval: if interval:
isdb, store_key = self._store_key(obj, interval) isdb, store_key = self._store_key(obj, interval, idstring)
if isdb: if isdb:
self.ticker_storage.pop(store_key, None) self.ticker_storage.pop(store_key, None)
self.save() self.save()
@ -287,7 +291,7 @@ class TickerHandler(object):
intervals = self.ticker_pool.tickers.keys() intervals = self.ticker_pool.tickers.keys()
should_save = False should_save = False
for interval in intervals: for interval in intervals:
isdb, store_key = self._store_key(obj, interval) isdb, store_key = self._store_key(obj, interval, idstring)
if isdb: if isdb:
self.ticker_storage.pop(store_key, None) self.ticker_storage.pop(store_key, None)
should_save = True should_save = True