Source code for luna_tasks.app.handlers.results_proxy_handler
from luna3.common.exceptions import LunaApiException
from sanic.response import HTTPResponse
from app.handlers.base_handler import BaseRequestHandler
from crutches_on_wheels.cow.enums.tasks import TaskStatus
from crutches_on_wheels.cow.errors.errors import Error
from crutches_on_wheels.cow.errors.exception import VLException
from crutches_on_wheels.cow.web.query_getters import uriParamIntGetter, uuidGetter
[docs]class TaskResultHandler(BaseRequestHandler):
"""
Task result handler.
"""
[docs] async def get(self, taskId: str) -> HTTPResponse:
"""
Get error, see `spec`_
.. _spec:
_static/api.html#operation/getTaskResult
Returns:
response with result and "Content-Disposition" header
"""
taskId = uriParamIntGetter(taskId, Error.PageNotFoundError)
accountId = self.getQueryParam("account_id", uuidGetter)
task = await self.dbContext.getTask(taskId=taskId, accountId=accountId)
resultId = task["result_id"]
if task["task_status"] in (TaskStatus.cancelled.value, TaskStatus.failed.value):
error = Error.ImpossibleGetTaskResult.format(taskId, task["task_status"])
raise VLException(error, 400, isCriticalError=False)
if resultId is None:
error = Error.TaskDoesNotHaveResultYet.format(taskId)
raise VLException(error, 404, isCriticalError=False)
try:
resultResponse = await self.luna3Client.lunaTasksResultsStore.getObject(
self.config.taskResultStorage.bucket, objectId=resultId, raiseError=True
)
except LunaApiException as e:
if e.statusCode == 404:
error = Error.TaskResultNotFound.format(taskId)
self.logger.warning(f"result of task {taskId} with result id {resultId} not found")
return self.error(404, error)
raise
extension = resultResponse.contentType.split("/")[-1]
filename = f"task_{taskId}.{extension}"
return self.success(
200,
resultResponse.body,
contentType=resultResponse.contentType,
extraHeaders={"Content-Disposition": f"attachment; filename={filename}"},
)