diff --git a/src/core/sat_main.py b/src/core/sat_main.py index 5da46d3d..eb0f739d 100644 --- a/src/core/sat_main.py +++ b/src/core/sat_main.py @@ -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