def task_status_ajax(request, task_id): """returns a JSON representation of the task state""" if settings.DEBUG: # show results for task in debug mode valid_request = True else: valid_request = request.is_ajax() if valid_request: try: task = celery.AsyncResult(task_id) if task.state == TaskState.PENDING: response = { "state": "pending", "status_message": "try to start task" } elif task.state == TaskState.STARTED or task.state.lower() == TaskState.PROCESSING: response = { "state": "processing", "status_message": task.info.get("status_message", "") } elif task.state == TaskState.SUCCESS: response = { "state": "success", "status_message": task.info.get("status_message", "") } if "error_message" in task.info: response["error_message"] = task.info["error_message"] if "data" in task.info: response["data"] = task.info["data"] else: # something went wrong in the within the task response = { "state": "failed", "error_message": str(task.info), # this is the exception that was raised } except redis.ConnectionError: logger.error("cannot get task update", exc_info=True) response = { "state": "failed", "error_message": "A server process (redis) is not running, please contact the administrator" } except Exception: # catch any exception logger.error("cannot get task update", exc_info=True) response = { "state": "failed", "error_message": "Unknown error: " + str(task.info), # this is the exception raised } logger.debug("task state for %s is\n%s" % (task_id, str(response))) return JsonResponse(response) else: return HttpResponse("Bad Request", status=400)
def get_task_state_message(task_id): if task_id is None: return "Task ID not found, the initial import was not executed or the results are already deleted" result = "(Task not found)" task = celery.AsyncResult(task_id) if task.status != "PENDING": result = "State: %s\nMessage: %s" % ( task.state, task.info.get("status_message", "Status not found")) return result
def get(self, request, *args, **kwargs): job_id = request.GET.get('job') from django_project.celery import app try: job = app.AsyncResult(job_id) except: return HttpResponseBadRequest() if job.state == 'SUCCESS': try: fmessage = job.info.get('fmessage') except: result = { 'message': 'The process has finished.', 'progress': 100 } else: # the task has actually failed but we caught the exception to # display an appropriate message to the user result = {'error': 1, 'message': fmessage} elif job.state == 'PENDING': result = { 'message': 'Waiting for the importer to start...', 'progress': 3 } elif job.state == 'STARTED': result = {'message': 'The import has started.', 'progress': 5} elif job.state == 'FAILURE': result = { 'error': 1, 'message': 'The import has failed. Please retry later.' } elif job.state == 'PROGRESS': message = job.info.get('message') progress = job.info.get('progress') result = {'message': message, 'progress': progress} else: result = {'message': 'The import state is unknown...'} return JsonResponse(result)