Files
OCR/docengine/app/schemas/document.py
2026-06-01 21:49:53 +05:30

135 lines
2.9 KiB
Python

from __future__ import annotations
import uuid
from datetime import datetime
from typing import Any
from pydantic import Field
from app.schemas.common import BaseSchema
class DocumentUploadResponse(BaseSchema):
"""Response after document upload."""
id: uuid.UUID
filename: str
original_filename: str
content_type: str
file_size: int
checksum: str
status: str
created_at: datetime
class TextBlockResponse(BaseSchema):
"""Extracted text block."""
id: uuid.UUID
text: str
x: float
y: float
width: float
height: float
confidence: float | None
font_family: str | None
font_size: float | None
font_color: str | None
font_style: str | None
block_type: str
sequence: int
class DocumentImageResponse(BaseSchema):
"""Extracted document image."""
id: uuid.UUID
x: float
y: float
width: float
height: float
image_path: str
image_type: str
class DocumentTableResponse(BaseSchema):
"""Extracted document table."""
id: uuid.UUID
x: float
y: float
width: float
height: float
rows: int
columns: int
data: dict[str, Any] | None
class DocumentPageResponse(BaseSchema):
"""Document page with extracted content."""
id: uuid.UUID
page_number: int
width: float
height: float
image_path: str | None
text_content: str | None
text_blocks: list[TextBlockResponse] = Field(default_factory=list)
images: list[DocumentImageResponse] = Field(default_factory=list)
tables: list[DocumentTableResponse] = Field(default_factory=list)
class DocumentResponse(BaseSchema):
"""Full document response."""
id: uuid.UUID
filename: str
original_filename: str
content_type: str
file_size: int
checksum: str
storage_path: str
status: str
page_count: int | None
is_scanned: bool | None
document_metadata: dict[str, Any] | None
error_message: str | None
uploaded_by: uuid.UUID | None
pages: list[DocumentPageResponse] = Field(default_factory=list)
created_at: datetime
updated_at: datetime
class DocumentListResponse(BaseSchema):
"""Minimal document response for lists."""
id: uuid.UUID
original_filename: str
content_type: str
file_size: int
status: str
page_count: int | None
is_scanned: bool | None
created_at: datetime
class TemplateMatchResponse(BaseSchema):
"""Template match result."""
id: uuid.UUID
document_id: uuid.UUID
format_id: uuid.UUID
confidence_score: float
match_details: dict[str, Any] | None
selected: bool
template_name: str | None = None
created_at: datetime
class TemplateMatchRequest(BaseSchema):
"""Request to match a document against templates."""
document_id: uuid.UUID
min_confidence: float = Field(default=0.5, ge=0.0, le=1.0)
max_results: int = Field(default=5, ge=1, le=20)