from datetime import datetime from typing import List, Optional, Dict, Any from pydantic import BaseModel, validator # TomatoImage schemas class TomatoImageBase(BaseModel): filename: str mime_type: str width: Optional[int] = None height: Optional[int] = None file_size: int class TomatoImageCreate(TomatoImageBase): file_path: str class TomatoImage(TomatoImageBase): id: str file_path: str uploaded_at: datetime class Config: from_attributes = True # SeverityDetail schemas class SeverityDetailBase(BaseModel): severity_class: str confidence: float affected_area_percentage: Optional[float] = None class SeverityDetailCreate(SeverityDetailBase): analysis_id: str class SeverityDetail(SeverityDetailBase): id: str analysis_id: str class Config: from_attributes = True # AnalysisResult schemas class AnalysisResultBase(BaseModel): model_name: str model_version: str primary_severity: Optional[str] = None severity_confidence: Optional[float] = None segmentation_data: Optional[str] = None processing_time_ms: Optional[int] = None class AnalysisResultCreate(AnalysisResultBase): image_id: str class AnalysisResult(AnalysisResultBase): id: str image_id: str processed_at: datetime severity_details: List[SeverityDetail] = [] class Config: from_attributes = True # Response schemas class AnalysisResponse(BaseModel): id: str image: TomatoImage primary_severity: Optional[str] = None severity_confidence: Optional[float] = None severity_details: List[SeverityDetail] = [] segmentation_data: Optional[Dict[str, Any]] = None processed_at: datetime model_name: str model_version: str @validator('segmentation_data', pre=True) def parse_segmentation_data(cls, v): import json if v and isinstance(v, str): try: return json.loads(v) except Exception: return None return v class UploadResponse(BaseModel): image: TomatoImage message: str = "Image uploaded successfully"