def on_failure(self, exc, task_id, args, kwargs, einfo):
     from tasks.models import ExportTask, ExportTaskException, ExportRun
     logger.debug('Task name: {0} failed, {1}'.format(self.name, einfo))
     task = ExportTask.objects.get(celery_uid=task_id)
     task.status = 'FAILED'
     task.finished_at = timezone.now()
     task.save()
     exception = cPickle.dumps(einfo)
     ete = ExportTaskException(task=task, exception=exception)
     ete.save()
     if self.abort_on_error:
         run = ExportRun.objects.get(tasks__celery_uid=task_id)
         run.status = 'FAILED'
         run.finished_at = timezone.now()
         run.save()
         error_handler = ExportTaskErrorHandler()
         # run error handler
         stage_dir = kwargs['stage_dir']
         error_handler.si(run_uid=str(run.uid), task_id=task_id, stage_dir=stage_dir).delay()
 def update_task_state(self, run_uid=None, name=None):
     """
     Update the task state and celery task uid.
     Can use the celery uid for diagnostics. 
     """
     started = timezone.now()
     from tasks.models import ExportRun, ExportTask 
     celery_uid = self.request.id
     try:
         task = ExportTask.objects.get(run__uid=run_uid, name=name)
         celery_uid = self.request.id
         task.celery_uid = celery_uid
         task.status = 'RUNNING'
         task.started_at = started
         task.save()
         logger.debug('Updated task: {0} with uid: {1}'.format(task.name, task.uid))
     except DatabaseError as e:
         logger.error('Updating task {0} state throws: {1}'.format(task.name, e))
         raise e
 def on_success(self, retval, task_id, args, kwargs):
     from tasks.models import ExportTask, ExportTaskResult
     # update the task
     finished = timezone.now()
     task = ExportTask.objects.get(celery_uid=task_id)   
     task.finished_at = finished
     # get the output
     output_url = retval['result']
     stat = os.stat(output_url)
     size = stat.st_size / 1024 / 1024.00
     # construct the download_path
     download_root = settings.EXPORT_DOWNLOAD_ROOT
     parts = output_url.split('/')
     filename = parts[-1]
     run_uid = parts[-2]
     run_dir = '{0}{1}'.format(download_root, run_uid)
     download_path = '{0}{1}/{2}'.format(download_root, run_uid, filename)
     try:
         if not os.path.exists(run_dir):
             os.makedirs(run_dir)
         # don't copy raw overpass data
         if (task.name != 'OverpassQuery'):
             shutil.copy(output_url, download_path)
     except IOError as e:
         logger.error('Error copying output file to: {0}'.format(download_path))
     # construct the download url
     download_media_root = settings.EXPORT_MEDIA_ROOT
     download_url = '{0}{1}/{2}'.format(download_media_root, run_uid, filename)
     # save the task and task result
     result = ExportTaskResult(
         task=task,
         filename=filename,
         size=size,
         download_url=download_url
     )
     result.save()
     task.status = 'SUCCESS'
     task.save()