Source code for derobertis_cv.pldata.employment_model
import datetime
from copy import deepcopy
from dataclasses import dataclass
from enum import Enum
from typing import Any, Callable, Dict, List, Optional, Sequence, Union
import pyexlatex.resume as lr
from pyexlatex.typing import PyexlatexItems
from derobertis_cv.models.course import CourseModel
from derobertis_cv.pldata.timelineable import Timelineable
from derobertis_cv.pltemplates.academic_employment import AcademicEmployment
[docs]
@dataclass
class EmploymentModel(Timelineable):
id: str
description: Sequence[str]
company_name: str
job_title: str
location: str
begin_date: datetime.date
end_date: Optional[datetime.date] = None
date_format: str = "%B %Y"
latex_contents: Optional[PyexlatexItems] = None
extra_contents: Optional[Any] = None
company_short_name: Optional[str] = None
short_job_title: Optional[str] = None
hours_per_week: Optional[int] = None
def __post_init__(self):
if self.latex_contents is None:
self.latex_contents = [
desc.replace("$", "\\$") for desc in self.description
]
@property
def sort_key(self) -> datetime.date:
if self.end_date is not None:
return self.end_date
return datetime.datetime.now()
[docs]
def to_pyexlatex_employment(
self, include_hours_per_week: bool = False
) -> lr.Employment:
date_str = self.date_str
if include_hours_per_week and self.hours_per_week is not None:
date_str += f" ({self.hours_per_week} hours/wk)"
return lr.Employment(
self.latex_contents,
self.company_name,
date_str,
self.job_title,
self.location,
)
[docs]
@dataclass
class AcademicEmploymentModel(EmploymentModel):
courses_taught: Optional[Sequence[CourseModel]] = None
[docs]
def to_pyexlatex_employment(
self, include_hours_per_week: bool = False
) -> AcademicEmployment:
date_str = self.date_str
if include_hours_per_week and self.hours_per_week is not None:
date_str += f" ({self.hours_per_week} hours/wk)"
return AcademicEmployment(
self.latex_contents,
self.company_name,
date_str,
self.job_title,
self.location,
self.courses_taught,
self.extra_contents,
)
[docs]
class JobIDs(str, Enum):
EVB_PORTFOLIO_ANALYST = "evb_portfolio_analyst"
CNC_MP = "cnc_managing_partner"
FRB_INTERN = "frb_intern"
UF_GA = "uf_ga"
VCU_GA = "vcu_ga"
PARLIAMENT_TUTOR = "parliament_tutor"
CLAIMFOUND_CTO = "claimfound_cto"
CARBON_HEALTH_SENIOR = "carbon_health_senior"
CARBON_HEALTH_STAFF = "carbon_health_staff"
COVARIANCE_PM_ENG = "covariance_pm_eng"
SPENDOSO_CTO = "spendoso_cto"
[docs]
def filter_jobs(
jobs: List[Union[EmploymentModel, AcademicEmploymentModel]],
excluded_companies: Optional[Sequence[str]] = None,
modify_descriptions: Optional[
Dict[JobIDs, Callable[[Sequence[str]], Sequence[str]]]
] = None,
) -> List[Union[EmploymentModel, AcademicEmploymentModel]]:
if excluded_companies:
jobs = [job for job in jobs if job.id not in excluded_companies]
jobs.sort(key=lambda job: job.sort_key, reverse=True)
if modify_descriptions:
lookup_modifiers: Dict[str, Callable[[Sequence[str]], Sequence[str]]] = {
key.value: value for key, value in modify_descriptions.items()
}
new_jobs: List[EmploymentModel] = []
for job in jobs:
if job.id in modify_descriptions:
new_job = deepcopy(job)
desc_func = lookup_modifiers[job.id]
new_job.description = desc_func(new_job.description)
# TODO [#43]: better handling for modifying latex contents of job descriptions
new_job.latex_contents = desc_func(new_job.latex_contents) # type: ignore
new_jobs.append(new_job)
else:
new_jobs.append(job)
jobs = new_jobs
return jobs