Source code for openff.bespokefit.executor.services.optimizer.app

import json

from fastapi import APIRouter
from qcelemental.util import serialize

from openff.bespokefit.executor.services import current_settings
from openff.bespokefit.executor.services.optimizer import worker
from openff.bespokefit.executor.services.optimizer.models import (
    OptimizerGETResponse,
    OptimizerPOSTBody,
    OptimizerPOSTResponse,
)
from openff.bespokefit.executor.utilities.celery import get_task_information

router = APIRouter()

__settings = current_settings()

__GET_ENDPOINT = "/" + __settings.BEFLOW_OPTIMIZER_PREFIX + "/{optimization_id}"


[docs]@router.get(__GET_ENDPOINT) def get_optimization(optimization_id: str) -> OptimizerGETResponse: task_info = get_task_information(worker.celery_app, optimization_id) # noinspection PyTypeChecker return { "id": optimization_id, "self": __settings.BEFLOW_API_V1_STR + __GET_ENDPOINT.format(optimization_id=optimization_id), "status": task_info["status"], "result": task_info["result"], "error": json.dumps(task_info["error"]), }
[docs]@router.post("/" + __settings.BEFLOW_OPTIMIZER_PREFIX) def post_optimization(body: OptimizerPOSTBody) -> OptimizerPOSTResponse: # We use celery delay method in order to enqueue the task with the given # parameters task = worker.optimize.delay( optimization_input_json=serialize(body.input_schema, "json") ) return OptimizerPOSTResponse( id=task.id, self=__settings.BEFLOW_API_V1_STR + __GET_ENDPOINT.format(optimization_id=task.id), )