Fixed repeat functionality with new Script implementation.
This commit is contained in:
parent
9f2433b9c2
commit
64fc8f0b2a
2 changed files with 44 additions and 22 deletions
|
|
@ -232,7 +232,7 @@ def format_script_list(scripts):
|
||||||
script.key,
|
script.key,
|
||||||
script.interval if script.interval > 0 else "--",
|
script.interval if script.interval > 0 else "--",
|
||||||
"%ss" % nextrep if nextrep else "--",
|
"%ss" % nextrep if nextrep else "--",
|
||||||
"%i" % script.repeats if script.repeats else "--",
|
"%i/%i" % (script.remaining_repeats(), script.repeats) if script.repeats else "--",
|
||||||
"*" if script.persistent else "-",
|
"*" if script.persistent else "-",
|
||||||
script.typeclass_path.rsplit('.', 1)[-1],
|
script.typeclass_path.rsplit('.', 1)[-1],
|
||||||
crop(script.desc, width=20)])
|
crop(script.desc, width=20)])
|
||||||
|
|
|
||||||
|
|
@ -44,7 +44,7 @@ class ExtendedLoopingCall(LoopingCall):
|
||||||
stopping. If None or 0, will loop forever.
|
stopping. If None or 0, will loop forever.
|
||||||
"""
|
"""
|
||||||
assert not self.running, ("Tried to start an already running "
|
assert not self.running, ("Tried to start an already running "
|
||||||
"LoopingCall.")
|
"ExtendedLoopingCall.")
|
||||||
if interval < 0:
|
if interval < 0:
|
||||||
raise ValueError, "interval must be >= 0"
|
raise ValueError, "interval must be >= 0"
|
||||||
|
|
||||||
|
|
@ -84,12 +84,22 @@ class ExtendedLoopingCall(LoopingCall):
|
||||||
"""
|
"""
|
||||||
if self.repeats is not None:
|
if self.repeats is not None:
|
||||||
self.repeats -= 1
|
self.repeats -= 1
|
||||||
if self.repeats <= 0:
|
|
||||||
self.stop()
|
|
||||||
return
|
|
||||||
self.start_delay = None
|
self.start_delay = None
|
||||||
super(ExtendedLoopingCall, self)._reschedule()
|
super(ExtendedLoopingCall, self)._reschedule()
|
||||||
|
# we cannot kill the task here, it seems the
|
||||||
|
# callback will often not have time to be
|
||||||
|
# triggered if we do. So kill from outside
|
||||||
|
# by checking repeats <= 0.
|
||||||
|
#if self.repeats <= 0:
|
||||||
|
# self.stop()
|
||||||
|
|
||||||
|
def fire(self):
|
||||||
|
"Force-fire the callback"
|
||||||
|
assert self.running ("Tried to fire an ExtendedLoopingCall "
|
||||||
|
"that was not running.")
|
||||||
|
if self.call is not None:
|
||||||
|
self.call.cancel()
|
||||||
|
self()
|
||||||
|
|
||||||
def next_call_time(self):
|
def next_call_time(self):
|
||||||
"""
|
"""
|
||||||
|
|
@ -125,13 +135,15 @@ class ScriptBase(TypeClass):
|
||||||
|
|
||||||
self.ndb._task = ExtendedLoopingCall(self._step_task)
|
self.ndb._task = ExtendedLoopingCall(self._step_task)
|
||||||
|
|
||||||
if self.ndb._paused_time:
|
if self.db._paused_time:
|
||||||
# the script was paused; restarting
|
# the script was paused; restarting
|
||||||
|
repeats = self.db._paused_repeats or self.dbobj.db_repeats
|
||||||
self.ndb._task.start(self.dbobj.db_interval,
|
self.ndb._task.start(self.dbobj.db_interval,
|
||||||
now=False,
|
now=False,
|
||||||
start_delay=self.ndb._paused_time,
|
start_delay=self.ndb._paused_time,
|
||||||
repeats=self.dbobj.db_repeats)
|
repeats=repeats)
|
||||||
del self.ndb._paused_time
|
del self.db._paused_time
|
||||||
|
del self.db._paused_repeats
|
||||||
else:
|
else:
|
||||||
# starting script anew
|
# starting script anew
|
||||||
self.ndb._task.start(self.dbobj.db_interval,
|
self.ndb._task.start(self.dbobj.db_interval,
|
||||||
|
|
@ -166,15 +178,13 @@ class ScriptBase(TypeClass):
|
||||||
# call hook
|
# call hook
|
||||||
self.at_repeat()
|
self.at_repeat()
|
||||||
|
|
||||||
|
# check repeats
|
||||||
repeats = self.ndb._task.repeats
|
repeats = self.ndb._task.repeats
|
||||||
if repeats is not None:
|
if repeats is not None and repeats <= 0:
|
||||||
if repeats <= 0:
|
|
||||||
self.stop()
|
self.stop()
|
||||||
else:
|
|
||||||
self.dbobj.repeats = repeats
|
|
||||||
|
|
||||||
def _step_task(self):
|
def _step_task(self):
|
||||||
"step task"
|
"Step task. This groups error handling."
|
||||||
try:
|
try:
|
||||||
return maybeDeferred(self._step_callback).addErrback(self._step_errback)
|
return maybeDeferred(self._step_callback).addErrback(self._step_errback)
|
||||||
except Exception:
|
except Exception:
|
||||||
|
|
@ -195,6 +205,11 @@ class ScriptBase(TypeClass):
|
||||||
return int(task.next_call_time())
|
return int(task.next_call_time())
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
def remaining_repeats(self):
|
||||||
|
"Get the number of returning repeats. Returns None if unlimited repeats."
|
||||||
|
task = self.ndb._task
|
||||||
|
if task:
|
||||||
|
return task.repeats
|
||||||
|
|
||||||
def start(self, force_restart=False):
|
def start(self, force_restart=False):
|
||||||
"""
|
"""
|
||||||
|
|
@ -272,8 +287,8 @@ class ScriptBase(TypeClass):
|
||||||
#print "pausing", self.key, self.time_until_next_repeat()
|
#print "pausing", self.key, self.time_until_next_repeat()
|
||||||
task = self.ndb._task
|
task = self.ndb._task
|
||||||
if task:
|
if task:
|
||||||
dt = self.ndb._task.next_call_time()
|
self.db._paused_time = task.next_call_time()
|
||||||
self.db._paused_time = dt
|
self.db._paused_repeats = task.repeats
|
||||||
self._stop_task()
|
self._stop_task()
|
||||||
|
|
||||||
def unpause(self):
|
def unpause(self):
|
||||||
|
|
@ -281,10 +296,7 @@ class ScriptBase(TypeClass):
|
||||||
Restart a paused script. This WILL call at_start().
|
Restart a paused script. This WILL call at_start().
|
||||||
"""
|
"""
|
||||||
#print "unpausing", self.key, self.db._paused_time
|
#print "unpausing", self.key, self.db._paused_time
|
||||||
dt = self.db._paused_time
|
if self.db._paused_time:
|
||||||
if dt:
|
|
||||||
self.ndb._paused_time = dt
|
|
||||||
del self.db._paused_time
|
|
||||||
self.dbobj.is_active = True
|
self.dbobj.is_active = True
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
|
@ -295,6 +307,16 @@ class ScriptBase(TypeClass):
|
||||||
self._start_task()
|
self._start_task()
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
def fire(self):
|
||||||
|
"""
|
||||||
|
Fire a premature triggering of the script callback. This
|
||||||
|
will reset timer and count down repeats as if the script
|
||||||
|
had fired normally.
|
||||||
|
"""
|
||||||
|
task = self.ndb._task
|
||||||
|
if task:
|
||||||
|
task.fire()
|
||||||
|
|
||||||
# hooks
|
# hooks
|
||||||
def at_script_creation(self):
|
def at_script_creation(self):
|
||||||
"placeholder"
|
"placeholder"
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue