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:
parent
18aeb3a6aa
commit
7d313660eb
1 changed files with 14 additions and 0 deletions
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue