core: added "one_shot" option to registered callback:

when this keyword is used, the callback is automatically removed once it has been called.
This commit is contained in:
Goffi 2014-02-04 18:24:27 +01:00
commit 7d313660eb

View file

@ -847,6 +847,7 @@ class SAT(service.Service):
""" Register a callback.
Use with_data=True in kwargs if the callback use the optional data dict
use force_id=id to avoid generated id. Can lead to name conflict, avoid if possible
use one_shot=True to delete callback once it have been called
@param callback: any callable
@return: id of the registered callback
"""
@ -857,11 +858,21 @@ class SAT(service.Service):
if callback_id in self._cb_map:
raise exceptions.ConflictError(_(u"id already registered"))
self._cb_map[callback_id] = (callback, args, kwargs)
if "one_shot" in kwargs: # One Shot callback are removed after 30 min
def purgeCallback():
try:
self.removeCallback(callback_id)
except KeyError:
pass
reactor.callLater(1800, purgeCallback)
return callback_id
def removeCallback(self, callback_id):
""" Remove a previously registered callback
@param callback_id: id returned by [registerCallback] """
debug("Removing callback [%s]" % callback_id)
del self._cb_map[callback_id]
def launchCallback(self, callback_id, data=None, profile_key="@NONE@"):
@ -889,6 +900,9 @@ class SAT(service.Service):
kwargs["profile"] = profile
del kwargs["with_data"]
if kwargs.pop('one_shot', False):
self.removeCallback(callback_id)
return defer.maybeDeferred(callback, *args, **kwargs)
#Menus management