1- import base64
21import dataclasses
32import importlib
43import json
54import os
65import tempfile
7- import traceback
86from typing import Optional
97
108from fastapi import Depends , FastAPI , File , Request , Response , UploadFile
1513import dedoc .version
1614from dedoc .api .api_args import QueryParameters
1715from dedoc .api .api_utils import json2collapsed_tree , json2html , json2tree , json2txt
16+ from dedoc .api .process_handler import ProcessHandler
1817from dedoc .api .schema .parsed_document import ParsedDocument
1918from dedoc .common .exceptions .dedoc_error import DedocError
2019from dedoc .common .exceptions .missing_file_error import MissingFileError
2120from dedoc .config import get_config
22- from dedoc .dedoc_manager import DedocManager
2321from dedoc .utils .utils import save_upload_file
2422
2523config = get_config ()
24+ logger = config ["logger" ]
2625PORT = config ["api_port" ]
2726static_path = os .path .join (os .path .dirname (os .path .abspath (__file__ )), "web" )
2827static_files_dirs = config .get ("static_files_dirs" )
2928
3029app = FastAPI ()
3130app .mount ("/web" , StaticFiles (directory = config .get ("static_path" , static_path )), name = "web" )
32-
3331module_api_args = importlib .import_module (config ["import_path_init_api_args" ])
34- logger = config ["logger" ]
35- manager = DedocManager (config = config )
32+ process_handler = ProcessHandler (logger = logger )
3633
3734
3835@app .get ("/" )
@@ -62,27 +59,20 @@ def _get_static_file_path(request: Request) -> str:
6259 return os .path .abspath (os .path .join (directory , file ))
6360
6461
65- def __add_base64_info_to_attachments (document_tree : ParsedDocument , attachments_dir : str ) -> None :
66- for attachment in document_tree .attachments :
67- with open (os .path .join (attachments_dir , attachment .metadata .temporary_file_name ), "rb" ) as attachment_file :
68- attachment .metadata .add_attribute ("base64" , base64 .b64encode (attachment_file .read ()).decode ("utf-8" ))
69-
70-
7162@app .post ("/upload" , response_model = ParsedDocument )
72- async def upload (file : UploadFile = File (...), query_params : QueryParameters = Depends ()) -> Response :
63+ async def upload (request : Request , file : UploadFile = File (...), query_params : QueryParameters = Depends ()) -> Response :
7364 parameters = dataclasses .asdict (query_params )
7465 if not file or file .filename == "" :
7566 raise MissingFileError ("Error: Missing content in request_post file parameter" , version = dedoc .version .__version__ )
7667
77- return_format = str (parameters .get ("return_format" , "json" )).lower ()
78-
7968 with tempfile .TemporaryDirectory () as tmpdir :
8069 file_path = save_upload_file (file , tmpdir )
81- document_tree = manager . parse ( file_path , parameters = { ** dict ( parameters ), "attachments_dir" : tmpdir } )
70+ document_tree = await process_handler . handle ( request = request , parameters = parameters , file_path = file_path , tmpdir = tmpdir )
8271
83- if return_format == "html" :
84- __add_base64_info_to_attachments ( document_tree , tmpdir )
72+ if document_tree is None :
73+ return JSONResponse ( status_code = 499 , content = {} )
8574
75+ return_format = str (parameters .get ("return_format" , "json" )).lower ()
8676 if return_format == "html" :
8777 html_content = json2html (
8878 text = "" ,
@@ -102,24 +92,25 @@ async def upload(file: UploadFile = File(...), query_params: QueryParameters = D
10292 return HTMLResponse (content = html_content )
10393
10494 if return_format == "ujson" :
105- return UJSONResponse (content = document_tree .to_api_schema (). model_dump ())
95+ return UJSONResponse (content = document_tree .model_dump ())
10696
10797 if return_format == "collapsed_tree" :
10898 html_content = json2collapsed_tree (paragraph = document_tree .content .structure )
10999 return HTMLResponse (content = html_content )
110100
111101 if return_format == "pretty_json" :
112- return PlainTextResponse (content = json .dumps (document_tree .to_api_schema (). model_dump (), ensure_ascii = False , indent = 2 ))
102+ return PlainTextResponse (content = json .dumps (document_tree .model_dump (), ensure_ascii = False , indent = 2 ))
113103
114104 logger .info (f"Send result. File { file .filename } with parameters { parameters } " )
115- return ORJSONResponse (content = document_tree .to_api_schema (). model_dump ())
105+ return ORJSONResponse (content = document_tree .model_dump ())
116106
117107
118108@app .get ("/upload_example" )
119- async def upload_example (file_name : str , return_format : Optional [str ] = None ) -> Response :
109+ async def upload_example (request : Request , file_name : str , return_format : Optional [str ] = None ) -> Response :
120110 file_path = os .path .join (static_path , "examples" , file_name )
121111 parameters = {} if return_format is None else {"return_format" : return_format }
122- document_tree = manager .parse (file_path , parameters = parameters )
112+ with tempfile .TemporaryDirectory () as tmpdir :
113+ document_tree = await process_handler .handle (request = request , parameters = parameters , file_path = file_path , tmpdir = tmpdir )
123114
124115 if return_format == "html" :
125116 html_page = json2html (
@@ -130,12 +121,11 @@ async def upload_example(file_name: str, return_format: Optional[str] = None) ->
130121 tabs = 0
131122 )
132123 return HTMLResponse (content = html_page )
133- return ORJSONResponse (content = document_tree .to_api_schema (). model_dump (), status_code = 200 )
124+ return ORJSONResponse (content = document_tree .model_dump (), status_code = 200 )
134125
135126
136127@app .exception_handler (DedocError )
137128async def exception_handler (request : Request , exc : DedocError ) -> Response :
138- logger .error (f"Exception { exc } \n { traceback .format_exc ()} " )
139129 result = {"message" : exc .msg }
140130 if exc .filename :
141131 result ["file_name" ] = exc .filename
0 commit comments