mirror of https://github.com/eyhc1/rendercv.git
enhance data models
This commit is contained in:
parent
43da08205d
commit
df630645eb
|
@ -36,11 +36,10 @@ from .terminal_reporter import warning, error, information
|
||||||
# returns a Date object. It also checks if the date is in the past.
|
# returns a Date object. It also checks if the date is in the past.
|
||||||
# See https://docs.pydantic.dev/2.5/concepts/types/#custom-types for more information
|
# See https://docs.pydantic.dev/2.5/concepts/types/#custom-types for more information
|
||||||
# about custom types.
|
# about custom types.
|
||||||
PastDate = Annotated[
|
RenderCVDate = Annotated[
|
||||||
str,
|
str,
|
||||||
pydantic.Field(pattern=r"\d{4}-\d{2}(-\d{2})?"),
|
pydantic.Field(pattern=r"\d{4}-\d{2}(-\d{2})?"),
|
||||||
]
|
]
|
||||||
PastDateAdapter = pydantic.TypeAdapter(PastDate)
|
|
||||||
|
|
||||||
|
|
||||||
def get_date_object(date: str | int) -> Date:
|
def get_date_object(date: str | int) -> Date:
|
||||||
|
@ -92,13 +91,13 @@ class EntryBase(RenderCVBaseModel):
|
||||||
etc.
|
etc.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
start_date: Optional[int | PastDate] = pydantic.Field(
|
start_date: Optional[int | RenderCVDate] = pydantic.Field(
|
||||||
default=None,
|
default=None,
|
||||||
title="Start Date",
|
title="Start Date",
|
||||||
description="The start date of the event in YYYY-MM-DD format.",
|
description="The start date of the event in YYYY-MM-DD format.",
|
||||||
examples=["2020-09-24"],
|
examples=["2020-09-24"],
|
||||||
)
|
)
|
||||||
end_date: Optional[Literal["present"] | int | PastDate] = pydantic.Field(
|
end_date: Optional[Literal["present"] | int | RenderCVDate] = pydantic.Field(
|
||||||
default=None,
|
default=None,
|
||||||
title="End Date",
|
title="End Date",
|
||||||
description=(
|
description=(
|
||||||
|
@ -107,7 +106,7 @@ class EntryBase(RenderCVBaseModel):
|
||||||
),
|
),
|
||||||
examples=["2020-09-24", "present"],
|
examples=["2020-09-24", "present"],
|
||||||
)
|
)
|
||||||
date: Optional[PastDate | int | str] = pydantic.Field(
|
date: Optional[RenderCVDate | int | str] = pydantic.Field(
|
||||||
default=None,
|
default=None,
|
||||||
title="Date",
|
title="Date",
|
||||||
description=(
|
description=(
|
||||||
|
@ -415,10 +414,10 @@ class PublicationEntry(RenderCVBaseModel):
|
||||||
description="The DOI of the publication.",
|
description="The DOI of the publication.",
|
||||||
examples=["10.48550/arXiv.2310.03138"],
|
examples=["10.48550/arXiv.2310.03138"],
|
||||||
)
|
)
|
||||||
date: str = pydantic.Field(
|
date: int | RenderCVDate = pydantic.Field(
|
||||||
title="Publication Date",
|
title="Publication Date",
|
||||||
description="The date of the publication.",
|
description="The date of the publication.",
|
||||||
examples=["2021-10-31"],
|
examples=["2021-10-31", "2010"],
|
||||||
)
|
)
|
||||||
journal: Optional[str] = pydantic.Field(
|
journal: Optional[str] = pydantic.Field(
|
||||||
default=None,
|
default=None,
|
||||||
|
@ -426,6 +425,19 @@ class PublicationEntry(RenderCVBaseModel):
|
||||||
description="The journal or the conference name.",
|
description="The journal or the conference name.",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@pydantic.field_validator("date")
|
||||||
|
@classmethod
|
||||||
|
def check_date(cls, date: int | RenderCVDate) -> int | RenderCVDate:
|
||||||
|
"""Check if the date is in the past."""
|
||||||
|
date_object = get_date_object(date)
|
||||||
|
if date_object > Date.today():
|
||||||
|
raise ValueError(
|
||||||
|
f"The publication date {date} cannot be in the future. The publication"
|
||||||
|
" date should be in the past."
|
||||||
|
)
|
||||||
|
|
||||||
|
return date
|
||||||
|
|
||||||
@pydantic.field_validator("doi")
|
@pydantic.field_validator("doi")
|
||||||
@classmethod
|
@classmethod
|
||||||
def check_doi(cls, doi: str) -> str:
|
def check_doi(cls, doi: str) -> str:
|
||||||
|
@ -448,6 +460,19 @@ class PublicationEntry(RenderCVBaseModel):
|
||||||
def doi_url(self) -> str:
|
def doi_url(self) -> str:
|
||||||
return f"https://doi.org/{self.doi}"
|
return f"https://doi.org/{self.doi}"
|
||||||
|
|
||||||
|
@pydantic.computed_field
|
||||||
|
@cached_property
|
||||||
|
def date_string(self) -> str:
|
||||||
|
if isinstance(self.date, int):
|
||||||
|
date_string = str(self.date)
|
||||||
|
elif isinstance(self.date, str):
|
||||||
|
date_object = get_date_object(self.date)
|
||||||
|
date_string = utilities.format_date(date_object)
|
||||||
|
else:
|
||||||
|
date_string = ""
|
||||||
|
|
||||||
|
return date_string
|
||||||
|
|
||||||
|
|
||||||
# ======================================================================================
|
# ======================================================================================
|
||||||
# Section models: ======================================================================
|
# Section models: ======================================================================
|
||||||
|
@ -699,6 +724,12 @@ class CurriculumVitae(RenderCVBaseModel):
|
||||||
|
|
||||||
section_type.model_validate(test_section)
|
section_type.model_validate(test_section)
|
||||||
|
|
||||||
|
else:
|
||||||
|
raise ValueError(
|
||||||
|
f'The entry type for the section "{title}" is not provided!'
|
||||||
|
" Please provide an entry type."
|
||||||
|
)
|
||||||
|
|
||||||
return sections_input
|
return sections_input
|
||||||
|
|
||||||
@pydantic.computed_field
|
@pydantic.computed_field
|
||||||
|
@ -784,9 +815,9 @@ def generate_json_schema(output_directory: str) -> str:
|
||||||
del json_schema["description"]
|
del json_schema["description"]
|
||||||
|
|
||||||
# add $id
|
# add $id
|
||||||
json_schema[
|
json_schema["$id"] = (
|
||||||
"$id"
|
"https://raw.githubusercontent.com/sinaatalay/rendercv/main/schema.json"
|
||||||
] = "https://raw.githubusercontent.com/sinaatalay/rendercv/main/schema.json"
|
)
|
||||||
|
|
||||||
# add $schema
|
# add $schema
|
||||||
json_schema["$schema"] = "http://json-schema.org/draft-07/schema#"
|
json_schema["$schema"] = "http://json-schema.org/draft-07/schema#"
|
||||||
|
|
Loading…
Reference in New Issue