ocr-2 / ocr /api /report /views.py
brestok's picture
made report and changes editable
e183e6b
import asyncio
from fastapi import UploadFile, File
from ocr.api.message.schemas import CreateMessageRequest
from ocr.api.openai_requests import generate_report, generate_changes
from ocr.api.report import report_router
from ocr.api.report.db_requests import (get_all_reports_obj,
delete_all_reports,
get_report_obj_by_id,
save_report_obj,
get_last_report_obj, change_report_report_obj, change_changes_report_obj)
from ocr.api.report.dto import Paging
from ocr.api.report.model import ReportModel
from ocr.api.report.schemas import AllReportResponse
from ocr.api.utils import divide_images, clean_response, extract_text_from_images
from ocr.core.wrappers import OcrResponseWrapper
@report_router.get('/all')
async def get_all_reports() -> OcrResponseWrapper[AllReportResponse]:
reports = await get_all_reports_obj()
response = AllReportResponse(
paging=Paging(pageSize=len(reports), pageIndex=0, totalCount=len(reports)),
data=reports
)
return OcrResponseWrapper(data=response)
@report_router.delete('/all')
async def delete_all_report() -> OcrResponseWrapper:
await delete_all_reports()
return OcrResponseWrapper()
@report_router.get('/{reportId}')
async def get_report(reportId: str) -> OcrResponseWrapper[ReportModel]:
report = await get_report_obj_by_id(reportId)
return OcrResponseWrapper(data=report)
@report_router.patch('/{reportId}/report')
async def change_report_report(
reportId: str,
data: CreateMessageRequest
) -> OcrResponseWrapper[ReportModel]:
report = await change_report_report_obj(reportId, data)
return OcrResponseWrapper(data=report)
@report_router.patch('/{reportId}/changes')
async def change_report_changes(
reportId: str,
data: CreateMessageRequest
) -> OcrResponseWrapper[ReportModel]:
report = await change_changes_report_obj(reportId, data)
return OcrResponseWrapper(data=report)
@report_router.post('')
async def create_report(
file: UploadFile = File(...),
) -> OcrResponseWrapper[ReportModel]:
try:
last_report, contents = await asyncio.gather(get_last_report_obj(), file.read())
report, changes = None, None
images = divide_images(contents)
text_content = extract_text_from_images(images)
if last_report:
report, changes = await asyncio.gather(
generate_report(text_content),
generate_changes(text_content, last_report.report)
)
else:
report = await generate_report(text_content)
report = await save_report_obj(clean_response(report), clean_response(changes), text_content, file.filename)
finally:
await file.close()
return OcrResponseWrapper(data=report)