Source code for nick_derobertis_site.api.routers.courses
from typing import List, Optional, Sequence
from derobertis_cv.models.category import CategoryModel
from derobertis_cv.models.course import CourseModel
from derobertis_cv.models.university import UniversityModel
from derobertis_cv.pldata.courses.main import get_courses
from fastapi import APIRouter
from pydantic import BaseModel
from nick_derobertis_site.api.routers.software import APISoftwareModel
router = APIRouter()
[docs]
class APIUniversityModel(BaseModel):
title: str
abbreviation: str
logo_url: Optional[str] = None
logo_svg_text: Optional[str] = None
logo_fa_icon_class_str: Optional[str] = None
logo_base64: Optional[str] = None
[docs]
@classmethod
def from_cv_model(cls, model: UniversityModel) -> "APIUniversityModel":
return cls(
title=model.title,
abbreviation=model.abbreviation,
logo_url=model.logo_url,
logo_svg_text=model.logo_svg_text,
logo_fa_icon_class_str=model.logo_fa_icon_class_str,
logo_base64=model.logo_base64,
)
[docs]
class APICourseTopicModel(BaseModel):
title: str
logo_svg_text: Optional[str] = None
logo_fa_icon_class_str: Optional[str] = None
children: Optional[Sequence["APICourseTopicModel"]] = None
[docs]
@classmethod
def from_cv_category_model(cls, model: CategoryModel) -> "APICourseTopicModel":
return cls(
title=model.title,
logo_svg_text=model.logo_svg_text,
logo_fa_icon_class_str=model.logo_fa_icon_class_str,
children=cls.list_from_cv_seq(model.children),
)
[docs]
@classmethod
def list_from_cv_seq(
cls, models: Sequence[CategoryModel]
) -> List["APICourseTopicModel"]:
return [cls.from_cv_category_model(mod) for mod in models]
APICourseTopicModel.update_forward_refs()
[docs]
class APICourseModel(BaseModel):
title: str
description: str
periods_taught: Optional[Sequence[str]] = None
evaluation_score: Optional[float] = None
evaluation_max_score: int = 5
university: Optional[APIUniversityModel] = None
course_id: Optional[str] = None
instructor: str = "Nick DeRobertis"
instructor_email: Optional[str] = "derobertisna@ufl.edu"
topics: Optional[Sequence[APICourseTopicModel]] = None
current_period: Optional[str] = None
current_time: Optional[str] = None
website_url: Optional[str] = None
software_projects: Optional[Sequence[APISoftwareModel]] = None
pdf_name: Optional[str] = None
[docs]
@classmethod
def from_cv_model(cls, model: CourseModel) -> "APICourseModel":
return cls(
title=model.title,
description=model.description,
periods_taught=model.periods_taught,
evaluation_score=model.evaluation_score,
evaluation_max_score=model.evaluation_max_score,
university=APIUniversityModel.from_cv_model(model.university),
course_id=model.course_id,
instructor=model.instructor,
instructor_email=model.instructor_email,
topics=APICourseTopicModel.list_from_cv_seq(model.topics),
current_period=model.current_period,
current_time=model.current_time,
website_url=model.website_url,
software_projects=APISoftwareModel.list_from_cv_seq(
model.software_projects or []
),
)
[docs]
@classmethod
def list_from_cv_seq(cls, models: Sequence[CourseModel]) -> List["APICourseModel"]:
return [cls.from_cv_model(mod) for mod in models]
[docs]
class APICourseStatisticsModel(BaseModel):
count: int
ALL_COURSE_CV_MODELS = get_courses()
ALL_COURSE_MODELS = APICourseModel.list_from_cv_seq(ALL_COURSE_CV_MODELS)
for cp in ALL_COURSE_MODELS:
if cp.title == "Financial Modeling":
cp.pdf_name = "Financial Modeling Syllabus.pdf"
COURSE_COUNT = len(ALL_COURSE_MODELS)
COURSE_STATS = APICourseStatisticsModel(count=COURSE_COUNT)
[docs]
@router.get("/", tags=["courses"], response_model=List[APICourseModel])
async def read_parent_skills():
return ALL_COURSE_MODELS
[docs]
@router.get("/stats", tags=["courses"], response_model=APICourseStatisticsModel)
async def read_skill_stats():
return COURSE_STATS