v1.0
-- full integration with mol-edit backend -- added readme -- added vqe local_computational
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
from collections.abc import AsyncIterator
|
||||
from contextlib import asynccontextmanager
|
||||
|
||||
from fastapi import FastAPI
|
||||
from fastapi import FastAPI, Request
|
||||
from fastapi.exceptions import HTTPException
|
||||
from fastapi.middleware.cors import CORSMiddleware
|
||||
|
||||
@@ -14,7 +14,13 @@ from logging_config import logger
|
||||
from openbabel import pybel
|
||||
from pyscf import gto # pyright: ignore
|
||||
from redis import asyncio as aioredis
|
||||
from request_response_models import BasicError, ConvertRequest, MolFileModel
|
||||
from request_response_models import (
|
||||
BasicError,
|
||||
ConvertRequest,
|
||||
MolFileModel,
|
||||
SmilesRequest,
|
||||
)
|
||||
from starlette.middleware.base import BaseHTTPMiddleware
|
||||
|
||||
|
||||
@asynccontextmanager
|
||||
@@ -28,25 +34,47 @@ async def lifespan(_: FastAPI) -> AsyncIterator[None]:
|
||||
app = FastAPI(lifespan=lifespan)
|
||||
|
||||
|
||||
origins = [
|
||||
"http://localhost",
|
||||
"http://localhost:8001",
|
||||
]
|
||||
class ForceCORSHeadersMiddleware(BaseHTTPMiddleware):
|
||||
async def dispatch(self, request: Request, call_next):
|
||||
# Handle OPTIONS preflight requests
|
||||
if request.method == "OPTIONS":
|
||||
response = JSONResponse(status_code=200, content={})
|
||||
else:
|
||||
response = await call_next(request)
|
||||
|
||||
app.add_middleware(
|
||||
CORSMiddleware,
|
||||
allow_origins=origins,
|
||||
allow_credentials=True,
|
||||
allow_methods=["*"],
|
||||
allow_headers=["*"],
|
||||
)
|
||||
# Always add CORS headers
|
||||
response.headers["Access-Control-Allow-Origin"] = "*"
|
||||
response.headers["Access-Control-Allow-Methods"] = (
|
||||
"GET, POST, PUT, DELETE, OPTIONS"
|
||||
)
|
||||
response.headers["Access-Control-Allow-Headers"] = "*"
|
||||
response.headers["Access-Control-Allow-Credentials"] = "true"
|
||||
|
||||
return response
|
||||
|
||||
|
||||
# Add this middleware FIRST
|
||||
app.add_middleware(ForceCORSHeadersMiddleware)
|
||||
|
||||
|
||||
@app.options("/{path:path}")
|
||||
async def options_handler(request: Request):
|
||||
return JSONResponse(
|
||||
content={},
|
||||
status_code=200,
|
||||
headers={
|
||||
"Access-Control-Allow-Origin": "*", # or specific origins
|
||||
"Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, OPTIONS",
|
||||
"Access-Control-Allow-Headers": "*",
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
@app.post(
|
||||
"/convert",
|
||||
responses={
|
||||
200: {"description": "Coversion Successful", "model": MolFileModel},
|
||||
400: {"description": "Item created", "model": BasicError},
|
||||
400: {"description": "Error Converting", "model": BasicError},
|
||||
},
|
||||
)
|
||||
def convert_molecule(req: ConvertRequest):
|
||||
@@ -84,6 +112,22 @@ def convert_molecule(req: ConvertRequest):
|
||||
raise HTTPException(status_code=400, detail={"error": str(e)})
|
||||
|
||||
|
||||
@app.post(
|
||||
"/smiles",
|
||||
)
|
||||
def smiles_mol(req: SmilesRequest):
|
||||
try:
|
||||
# Rad the string and format from request
|
||||
mol = pybel.readstring("xyz", req.text)
|
||||
mol.addh()
|
||||
mol.OBMol.SetTitle("")
|
||||
|
||||
mol2string = mol.write("smi", opt={"h": True, "U": True})
|
||||
return JSONResponse({"molfile": mol2string}, 200)
|
||||
except Exception as e:
|
||||
raise HTTPException(status_code=400, detail={"error": str(e)})
|
||||
|
||||
|
||||
@app.get("/informats")
|
||||
@cache()
|
||||
async def get_informats():
|
||||
|
||||
@@ -9,6 +9,10 @@ class ConvertRequest(BaseModel):
|
||||
optimize_geometry: bool = False
|
||||
|
||||
|
||||
class SmilesRequest(BaseModel):
|
||||
text: str
|
||||
|
||||
|
||||
class MolFileModel(BaseModel):
|
||||
molfile: str
|
||||
|
||||
|
||||
Reference in New Issue
Block a user