from __future__ import annotations from datetime import datetime from uuid import UUID from pydantic import BaseModel, Field class SourceRegistryRead(BaseModel): """Read-only, server-owned source-authority definition.""" id: UUID source_key: str display_name: str classification: str authority_name: str authority_scope_json: dict provider_adapter_key: str | None = None source_url: str | None = None license_name: str license_url: str | None = None usage_restrictions: str default_crs: str default_units: str spatial_resolution_json: dict temporal_coverage_json: dict geographic_coverage_json: dict expected_geometry_types_json: list expected_attributes_json: dict usage_policy_json: dict freshness_status: str ingest_status: str known_limitations_json: list registry_metadata_json: dict created_at: datetime | None = None updated_at: datetime | None = None snapshot_count: int = 0 model_config = {"from_attributes": True} class SourceSnapshotRead(BaseModel): """Immutable version/snapshot evidence attached to an imported dataset.""" id: UUID source_registry_id: UUID snapshot_key: str source_version: str | None = None snapshot_at: datetime | None = None fetched_at: datetime | None = None source_url: str | None = None checksum_sha256: str | None = None crs: str | None = None units: str | None = None spatial_resolution_json: dict temporal_coverage_json: dict geographic_coverage_json: dict observed_schema_json: dict freshness_status: str ingest_status: str known_limitations_json: list snapshot_metadata_json: dict created_at: datetime | None = None model_config = {"from_attributes": True} class SourceRegistryDetailRead(BaseModel): source: SourceRegistryRead snapshots: list[SourceSnapshotRead] class DatasetLineageEdgeRead(BaseModel): id: UUID parent_dataset_id: UUID child_dataset_id: UUID parent_dataset_version_id: UUID | None = None child_dataset_version_id: UUID | None = None relation_type: str transformation_name: str transformation_version: str | None = None parameters_json: dict | None = None input_checksum_sha256: str | None = None output_checksum_sha256: str | None = None created_at: datetime | None = None model_config = {"from_attributes": True} class DatasetQuarantineRead(BaseModel): id: UUID dataset_id: UUID | None = None dataset_version_id: UUID | None = None source_snapshot_id: UUID | None = None stage: str reason_code: str details_json: dict | None = None artifact_path: str | None = None artifact_checksum_sha256: str | None = None status: str created_at: datetime | None = None resolved_at: datetime | None = None resolved_by: str | None = None model_config = {"from_attributes": True} class DatasetProvenanceRead(BaseModel): dataset_id: UUID source: SourceRegistryRead | None = None snapshot: SourceSnapshotRead | None = None data_contract_key: str | None = None data_contract_version: str | None = None validation_status: str | None = None validation_report_json: dict | None = None provenance_status: str | None = None lineage_status: str | None = None quarantine_status: str | None = None lineage: list[DatasetLineageEdgeRead] = Field(default_factory=list) quarantines: list[DatasetQuarantineRead] = Field(default_factory=list)