from typing import List, Optional from pydantic import BaseModel, Field, model_validator MAX_BATCH_EXPORT_ITEMS = 50 class BatchExportItem(BaseModel): camera: str = Field(title="Camera name") start_time: float = Field(title="Start time") end_time: float = Field(title="End time") image_path: Optional[str] = Field( default=None, title="Existing thumbnail path", description="Optional existing image to use as the export thumbnail", ) friendly_name: Optional[str] = Field( default=None, title="Friendly name", max_length=256, description="Optional friendly name for this specific export item", ) client_item_id: Optional[str] = Field( default=None, title="Client item ID", max_length=128, description="Optional opaque client identifier echoed back in results", ) class BatchExportBody(BaseModel): items: List[BatchExportItem] = Field( title="Items", min_length=1, max_length=MAX_BATCH_EXPORT_ITEMS, description="List of export items. Each item has its own camera and time range.", ) export_case_id: Optional[str] = Field( default=None, title="Export case ID", max_length=30, description=( "Existing export case ID to assign all exports to. Attaching to an " "existing case is temporarily admin-only until case-level ACLs exist." ), ) new_case_name: Optional[str] = Field( default=None, title="New case name", max_length=100, description="Name of a new export case to create when export_case_id is omitted", ) new_case_description: Optional[str] = Field( default=None, title="New case description", description="Optional description for a newly created export case", ) @model_validator(mode="after") def validate_case_target(self) -> "BatchExportBody": for item in self.items: if item.end_time <= item.start_time: raise ValueError("end_time must be after start_time") return self