File size: 3,315 Bytes
7602502 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 |
"""Pydantic models for Common Standards Project API data structures."""
from __future__ import annotations
from typing import Any, Optional
from pydantic import BaseModel, ConfigDict
class CSPBaseModel(BaseModel):
"""Base model for all CSP API models with extra fields allowed."""
model_config = ConfigDict(extra="allow")
# ============================================================================
# Jurisdiction List Models
# ============================================================================
class Jurisdiction(CSPBaseModel):
"""Basic jurisdiction information from the jurisdictions list endpoint."""
id: str
title: str
type: str # "school", "organization", "state", "nation"
class JurisdictionsResponse(CSPBaseModel):
"""API response wrapper for jurisdictions list."""
data: list[Jurisdiction]
# ============================================================================
# Jurisdiction Details Models
# ============================================================================
class Document(CSPBaseModel):
"""Standard document metadata."""
id: Optional[str] = None
title: str
valid: Optional[str] = None # Year as string
sourceURL: Optional[str] = None
asnIdentifier: Optional[str] = None
publicationStatus: Optional[str] = None
class StandardSetReference(CSPBaseModel):
"""Reference to a standard set (metadata only, not full content)."""
id: str
title: str
subject: str
educationLevels: list[str]
document: Document
class JurisdictionDetails(CSPBaseModel):
"""Full jurisdiction details including standard set references."""
id: str
title: str
type: str # "school", "organization", "state", "nation"
standardSets: list[StandardSetReference]
class JurisdictionDetailsResponse(CSPBaseModel):
"""API response wrapper for jurisdiction details."""
data: JurisdictionDetails
# ============================================================================
# Standard Set Models
# ============================================================================
class License(CSPBaseModel):
"""License information for a standard set."""
title: str
URL: str
rightsHolder: str
class JurisdictionRef(CSPBaseModel):
"""Simple jurisdiction reference within a standard set."""
id: str
title: str
class Standard(CSPBaseModel):
"""Individual standard within a standard set."""
id: str
asnIdentifier: Optional[str] = None
position: int
depth: int
statementNotation: Optional[str] = None
description: str
ancestorIds: list[str]
parentId: Optional[str] = None
statementLabel: Optional[str] = None # e.g., "Standard", "Benchmark"
educationLevels: Optional[list[str]] = None
class StandardSet(CSPBaseModel):
"""Full standard set data including all standards."""
id: str
title: str
subject: str
normalizedSubject: Optional[str] = None
educationLevels: list[str]
license: License
document: Document
jurisdiction: JurisdictionRef
standards: dict[str, Standard] # GUID -> Standard mapping
cspStatus: Optional[dict[str, Any]] = None
class StandardSetResponse(CSPBaseModel):
"""API response wrapper for standard set."""
data: StandardSet
|