File size: 1,488 Bytes
666f6cf |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
from solverforge_legacy.solver.score import HardMediumSoftScore
from pydantic import (
BaseModel,
ConfigDict,
PlainSerializer,
BeforeValidator,
ValidationInfo,
)
from pydantic.alias_generators import to_camel
from typing import Any
def make_list_item_validator(key: str):
def validator(v: Any, info: ValidationInfo) -> Any:
if v is None:
return None
if not isinstance(v, str) or not info.context:
return v
return info.context.get(key, {}).get(v, v)
return BeforeValidator(validator)
# Validators for foreign key references
MeetingDeserializer = make_list_item_validator("meetings")
RoomDeserializer = make_list_item_validator("rooms")
TimeGrainDeserializer = make_list_item_validator("timeGrains")
IdSerializer = PlainSerializer(
lambda item: item.id if item is not None else None, return_type=str | None
)
ScoreSerializer = PlainSerializer(
lambda score: str(score) if score is not None else None, return_type=str | None
)
def validate_score(v: Any, info: ValidationInfo) -> Any:
if isinstance(v, HardMediumSoftScore) or v is None:
return v
if isinstance(v, str):
return HardMediumSoftScore.parse(v)
raise ValueError('"score" should be a string')
ScoreValidator = BeforeValidator(validate_score)
class JsonDomainBase(BaseModel):
model_config = ConfigDict(
alias_generator=to_camel,
populate_by_name=True,
from_attributes=True,
)
|