1
- import base64
2
1
import dataclasses
3
2
import importlib
4
3
import json
5
4
import os
6
5
import tempfile
7
- import traceback
8
6
from typing import Optional
9
7
10
8
from fastapi import Depends , FastAPI , File , Request , Response , UploadFile
15
13
import dedoc .version
16
14
from dedoc .api .api_args import QueryParameters
17
15
from dedoc .api .api_utils import json2collapsed_tree , json2html , json2tree , json2txt
16
+ from dedoc .api .process_handler import ProcessHandler
18
17
from dedoc .api .schema .parsed_document import ParsedDocument
19
18
from dedoc .common .exceptions .dedoc_error import DedocError
20
19
from dedoc .common .exceptions .missing_file_error import MissingFileError
21
20
from dedoc .config import get_config
22
- from dedoc .dedoc_manager import DedocManager
23
21
from dedoc .utils .utils import save_upload_file
24
22
25
23
config = get_config ()
24
+ logger = config ["logger" ]
26
25
PORT = config ["api_port" ]
27
26
static_path = os .path .join (os .path .dirname (os .path .abspath (__file__ )), "web" )
28
27
static_files_dirs = config .get ("static_files_dirs" )
29
28
30
29
app = FastAPI ()
31
30
app .mount ("/web" , StaticFiles (directory = config .get ("static_path" , static_path )), name = "web" )
32
-
33
31
module_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 )
36
33
37
34
38
35
@app .get ("/" )
@@ -62,27 +59,20 @@ def _get_static_file_path(request: Request) -> str:
62
59
return os .path .abspath (os .path .join (directory , file ))
63
60
64
61
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
-
71
62
@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 :
73
64
parameters = dataclasses .asdict (query_params )
74
65
if not file or file .filename == "" :
75
66
raise MissingFileError ("Error: Missing content in request_post file parameter" , version = dedoc .version .__version__ )
76
67
77
- return_format = str (parameters .get ("return_format" , "json" )).lower ()
78
-
79
68
with tempfile .TemporaryDirectory () as tmpdir :
80
69
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 )
82
71
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 = {} )
85
74
75
+ return_format = str (parameters .get ("return_format" , "json" )).lower ()
86
76
if return_format == "html" :
87
77
html_content = json2html (
88
78
text = "" ,
@@ -102,24 +92,25 @@ async def upload(file: UploadFile = File(...), query_params: QueryParameters = D
102
92
return HTMLResponse (content = html_content )
103
93
104
94
if return_format == "ujson" :
105
- return UJSONResponse (content = document_tree .to_api_schema (). model_dump ())
95
+ return UJSONResponse (content = document_tree .model_dump ())
106
96
107
97
if return_format == "collapsed_tree" :
108
98
html_content = json2collapsed_tree (paragraph = document_tree .content .structure )
109
99
return HTMLResponse (content = html_content )
110
100
111
101
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 ))
113
103
114
104
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 ())
116
106
117
107
118
108
@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 :
120
110
file_path = os .path .join (static_path , "examples" , file_name )
121
111
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 )
123
114
124
115
if return_format == "html" :
125
116
html_page = json2html (
@@ -130,12 +121,11 @@ async def upload_example(file_name: str, return_format: Optional[str] = None) ->
130
121
tabs = 0
131
122
)
132
123
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 )
134
125
135
126
136
127
@app .exception_handler (DedocError )
137
128
async def exception_handler (request : Request , exc : DedocError ) -> Response :
138
- logger .error (f"Exception { exc } \n { traceback .format_exc ()} " )
139
129
result = {"message" : exc .msg }
140
130
if exc .filename :
141
131
result ["file_name" ] = exc .filename
0 commit comments