99 lines
1.8 KiB
Python
99 lines
1.8 KiB
Python
from pydantic import BaseModel, computed_field
|
|
|
|
|
|
class Recipient(BaseModel):
|
|
name: str
|
|
company: str
|
|
street: str
|
|
city: str
|
|
|
|
|
|
class LetterMeta(BaseModel):
|
|
recipient: Recipient
|
|
subject: str
|
|
date: str
|
|
greeting: str
|
|
closing: str
|
|
appended: str
|
|
|
|
|
|
class ContactInfo(BaseModel):
|
|
address: str
|
|
address_full: str
|
|
phone: str
|
|
phone_url: str
|
|
email: str
|
|
github: str
|
|
github_url: str
|
|
linkedin: str
|
|
linkedin_url: str
|
|
|
|
|
|
class Skill(BaseModel):
|
|
name: str
|
|
level: int
|
|
specification: str | None = None
|
|
|
|
@computed_field
|
|
@property
|
|
def css_class(self) -> str:
|
|
return f"skilllevel_{self.level}"
|
|
|
|
|
|
class Certificate(BaseModel):
|
|
name: str
|
|
url: str
|
|
|
|
|
|
class OtherSkill(BaseModel):
|
|
text: str
|
|
|
|
|
|
class Language(BaseModel):
|
|
name: str
|
|
level: int
|
|
specification: str | None = None
|
|
|
|
@computed_field
|
|
@property
|
|
def css_class(self) -> str:
|
|
return f"skilllevel_{self.level}"
|
|
|
|
|
|
class SubExperience(BaseModel):
|
|
time: str
|
|
title: str
|
|
bullets: list[str] = []
|
|
|
|
|
|
class Experience(BaseModel):
|
|
time: str
|
|
title: str
|
|
institution: str | None = None
|
|
description: str | None = None
|
|
grades: str | None = None
|
|
sub_experiences: list[SubExperience] = []
|
|
|
|
|
|
class OtherActivity(BaseModel):
|
|
time: str
|
|
title: str
|
|
institution: str | None = None
|
|
description: str | None = None
|
|
|
|
|
|
class CVData(BaseModel):
|
|
first_name: str
|
|
last_name: str
|
|
description: str
|
|
photo: str
|
|
signature: str
|
|
contact: ContactInfo
|
|
letter: LetterMeta
|
|
skills: list[Skill]
|
|
certificates: list[Certificate]
|
|
other_skills: list[OtherSkill] = []
|
|
languages: list[Language]
|
|
work_experience: list[Experience]
|
|
education: list[Experience]
|
|
other_activities: list[OtherActivity]
|