Source code for nick_derobertis_site.api.routers.research

from typing import List, Optional, Sequence

from derobertis_cv.models.category import CategoryModel
from derobertis_cv.models.resources import ResourceModel
from derobertis_cv.pldata.papers import (
    ResearchProjectModel,
    get_working_papers,
    get_works_in_progress,
)
from derobertis_cv.pltemplates.coauthor import CoAuthor
from fastapi import APIRouter
from pydantic import BaseModel
from pydantic.fields import Field

router = APIRouter()


[docs] class APIResearchCategoryModel(BaseModel): title: str logo_svg_text: Optional[str] = None logo_fa_icon_class_str: Optional[str] = None
[docs] @classmethod def from_cv_category_model(cls, model: CategoryModel) -> "APIResearchCategoryModel": return cls( title=model.title, logo_svg_text=model.logo_svg_text, logo_fa_icon_class_str=model.logo_fa_icon_class_str, )
[docs] @classmethod def list_from_cv_seq( cls, models: Sequence[CategoryModel] ) -> List["APIResearchCategoryModel"]: return [cls.from_cv_category_model(mod) for mod in models]
[docs] class APICoAuthorModel(BaseModel): name: str
[docs] @classmethod def from_cv_co_author_model(cls, model: CoAuthor) -> "APICoAuthorModel": return cls(name=model.author_name)
[docs] @classmethod def list_from_cv_seq(cls, models: Sequence[CoAuthor]) -> List["APICoAuthorModel"]: return [cls.from_cv_co_author_model(mod) for mod in models]
[docs] class APIResourceModel(BaseModel): name: str url: str author: Optional[str] = None description: Optional[str] = None
[docs] @classmethod def from_cv_model(cls, model: ResourceModel) -> "APIResourceModel": return cls( name=model.name, url=model.url, author=model.author, description=model.description, )
[docs] @classmethod def list_from_cv_seq( cls, models: Sequence[ResourceModel] ) -> List["APIResourceModel"]: return [cls.from_cv_model(mod) for mod in models]
[docs] class APIResearchModel(BaseModel): title: str co_authors: List[APICoAuthorModel] = Field(default_factory=lambda: []) href: Optional[str] = None description: str = "" categories: Sequence[APIResearchCategoryModel] = Field(default_factory=lambda: []) resources: Sequence[APIResourceModel] = Field(default_factory=lambda: [])
[docs] @classmethod def from_cv_research_model(cls, model: ResearchProjectModel) -> "APIResearchModel": return cls( title=model.title, co_authors=APICoAuthorModel.list_from_cv_seq(model.co_authors or []), href=model.href, description=model.description or "", categories=APIResearchCategoryModel.list_from_cv_seq( model.categories or [] ), resources=APIResourceModel.list_from_cv_seq(model.resources or []), )
[docs] @classmethod def list_from_cv_seq( cls, models: Sequence[ResearchProjectModel] ) -> List["APIResearchModel"]: return [cls.from_cv_research_model(mod) for mod in models]
[docs] class APIResearchResponseModel(BaseModel): working_papers: List[APIResearchModel] = Field(default_factory=lambda: []) works_in_progress: List[APIResearchModel] = Field(default_factory=lambda: [])
[docs] class APIResearchStatisticsModel(BaseModel): count: int
[docs] class APIResearchStatisticsResponseModel(BaseModel): working_papers: APIResearchStatisticsModel works_in_progress: APIResearchStatisticsModel
WORKING_PAPER_CV_MODELS: List[ResearchProjectModel] = get_working_papers() WORKS_IN_PROGRESS_CV_MODELS: List[ResearchProjectModel] = get_works_in_progress() WORKING_PAPERS = APIResearchModel.list_from_cv_seq(WORKING_PAPER_CV_MODELS) WORKS_IN_PROGRESS = APIResearchModel.list_from_cv_seq(WORKS_IN_PROGRESS_CV_MODELS) ALL_RESEARCH = APIResearchResponseModel( working_papers=WORKING_PAPERS, works_in_progress=WORKS_IN_PROGRESS ) COUNT_WP = len(WORKING_PAPERS) COUNT_WIP = len(WORKS_IN_PROGRESS) STATS = APIResearchStatisticsResponseModel( working_papers=APIResearchStatisticsModel(count=COUNT_WP), works_in_progress=APIResearchStatisticsModel(count=COUNT_WIP), )
[docs] @router.get("/", tags=["research"], response_model=APIResearchResponseModel) async def read_all_research(): return ALL_RESEARCH
[docs] @router.get("/working-papers", tags=["research"], response_model=List[APIResearchModel]) async def read_working_papers(): return WORKING_PAPERS
[docs] @router.get( "/works-in-progress", tags=["research"], response_model=List[APIResearchModel] ) async def read_works_in_progress(): return WORKS_IN_PROGRESS
[docs] @router.get( "/stats", tags=["research"], response_model=APIResearchStatisticsResponseModel, ) async def read_skill_stats(): return STATS