def task_succeeded(sender=None, **kwargs): # pylint: disable=unused-argument """ Update the status record accordingly when a :py:class:`UserTaskMixin` finishes successfully. """ if isinstance(sender, UserTaskMixin): sender.status.succeed() user_task_stopped.send_robust(sender=UserTaskStatus, status=sender.status)
def test_duplicate_stopped_signal(self): """The test signal receiver should be able to detect and flag duplicate signals""" sample_task.delay(self.user.id, 'Argument') status = UserTaskStatus.objects.all()[0] user_task_stopped.send_robust(sender=UserTaskStatus, status=status) status.cancel() user_task_stopped.send_robust(sender=UserTaskStatus, status=status) assert SIGNAL_DATA['received_status'].state == UserTaskStatus.CANCELED + ' again'
def task_succeeded(sender=None, **kwargs): # pylint: disable=unused-argument """ Update the status record accordingly when a :py:class:`UserTaskMixin` finishes successfully. """ if isinstance(sender, UserTaskMixin): status = sender.status # Failed tasks with good exception handling did not succeed just because they ended cleanly if status.state not in (UserTaskStatus.CANCELED, UserTaskStatus.FAILED, UserTaskStatus.RETRYING): status.succeed() user_task_stopped.send_robust(sender=UserTaskStatus, status=sender.status)
def task_failed(sender=None, **kwargs): """ Update the status record accordingly when a :py:class:`UserTaskMixin` fails. """ if isinstance(sender, UserTaskMixin): exception = kwargs['exception'] if not isinstance(exception, TaskCanceledException): # Don't include traceback, since this is intended for end users sender.status.fail(str(exception)) user_task_stopped.send_robust(sender=UserTaskStatus, status=sender.status)
def cancel(self): """ Cancel the associated task if it hasn't already finished running. """ if self.is_container: children = UserTaskStatus.objects.filter(parent=self) for child in children: child.cancel() elif self.state in (UserTaskStatus.PENDING, UserTaskStatus.RETRYING): current_app.control.revoke(self.task_id) user_task_stopped.send_robust(UserTaskStatus, status=self) with transaction.atomic(): status = UserTaskStatus.objects.select_for_update().get(pk=self.id) if status.state in (UserTaskStatus.CANCELED, UserTaskStatus.FAILED, UserTaskStatus.SUCCEEDED): return status.state = UserTaskStatus.CANCELED status.save(update_fields={'state', 'modified'}) self.state = status.state self.modified = status.modified