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