from __future__ import annotations from typing import List, Literal, Optional from pydantic import BaseModel, Field class PersonalDetails(BaseModel): name: Optional[str] = None father_name: Optional[str] = None registration_number: Optional[str] = None roll_number: Optional[str] = None program: Optional[str] = None department: Optional[str] = None institute: Optional[str] = None class SubjectResult(BaseModel): code: Optional[str] = None title: Optional[str] = None marks: Optional[float] = None credit_hours: Optional[float] = None grade: Optional[str] = None gpa: Optional[float] = Field(default=None, description="Subject grade points, if shown on the transcript.") class SemesterResult(BaseModel): semester: Optional[str] = None subjects: List[SubjectResult] = Field(default_factory=list) semester_gpa: Optional[float] = None credit_hours: Optional[float] = None class TranscriptResponse(BaseModel): document_status: Literal["transcript", "not_transcript", "unreadable"] message: Optional[str] = None personal_details: PersonalDetails = Field(default_factory=PersonalDetails) semesters: List[SemesterResult] = Field(default_factory=list) cgpa: Optional[float] = None total_credit_hours: Optional[float] = None