from __future__ import annotations from datetime import datetime from uuid import UUID from pydantic import BaseModel, Field from app.schemas.operations import VectorSelectionBBox class AoiOperationCreate(BaseModel): area_id: UUID | None = None bbox: VectorSelectionBBox | None = None operation_type: str = Field(min_length=1, max_length=128) provider_key: str = Field(min_length=1, max_length=120) product_key: str = Field(min_length=1, max_length=120) coverage_zone: str | None = Field(default=None, max_length=64) max_partition_side_m: float | None = Field(default=None, gt=0, le=60_000) max_attempts: int = Field(default=3, ge=1, le=10) parameters_json: dict = Field(default_factory=dict) class AoiPartitionRead(BaseModel): id: UUID partition_key: str provider_key: str product_key: str ordinal: int status: str attempt_count: int max_attempts: int checkpoint_json: dict | None = None result_json: dict | None = None error_message: str | None = None model_config = {"from_attributes": True} class AoiOperationRead(BaseModel): id: UUID project_id: UUID area_id: UUID | None = None parent_job_id: UUID | None = None operation_type: str status: str request_json: dict plan_json: dict result_json: dict | None = None error_message: str | None = None progress: float partition_counts: dict[str, int] partitions: list[AoiPartitionRead] = Field(default_factory=list) created_at: datetime | None = None started_at: datetime | None = None finished_at: datetime | None = None class AoiOperationList(BaseModel): items: list[AoiOperationRead] total: int class AoiPartitionCheckpoint(BaseModel): checkpoint_json: dict = Field(default_factory=dict) class AoiPartitionComplete(BaseModel): result_json: dict = Field(default_factory=dict) skipped: bool = False class AoiPartitionFail(BaseModel): error_message: str = Field(min_length=1, max_length=4000) retryable: bool = True details: dict = Field(default_factory=dict)