|
|
from solverforge_legacy.solver.score import HardSoftDecimalScore |
|
|
|
|
|
from typing import Any |
|
|
from pydantic import ( |
|
|
BaseModel, |
|
|
ConfigDict, |
|
|
PlainSerializer, |
|
|
BeforeValidator, |
|
|
ValidationInfo, |
|
|
) |
|
|
from pydantic.alias_generators import to_camel |
|
|
|
|
|
|
|
|
class JsonDomainBase(BaseModel): |
|
|
model_config = ConfigDict( |
|
|
alias_generator=to_camel, |
|
|
populate_by_name=True, |
|
|
from_attributes=True, |
|
|
serialize_by_alias=True, |
|
|
) |
|
|
|
|
|
|
|
|
ScoreSerializer = PlainSerializer( |
|
|
lambda score: str(score) if score is not None else None, |
|
|
return_type=str | None |
|
|
) |
|
|
|
|
|
IdSerializer = PlainSerializer( |
|
|
lambda item: item.id if item is not None else None, |
|
|
return_type=str | None |
|
|
) |
|
|
|
|
|
IdListSerializer = PlainSerializer( |
|
|
lambda items: [item.id for item in items], |
|
|
return_type=list |
|
|
) |
|
|
|
|
|
|
|
|
def validate_score(v: Any, info: ValidationInfo) -> Any: |
|
|
if isinstance(v, HardSoftDecimalScore) or v is None: |
|
|
return v |
|
|
if isinstance(v, str): |
|
|
return HardSoftDecimalScore.parse(v) |
|
|
raise ValueError('"score" should be a string') |
|
|
|
|
|
|
|
|
ScoreValidator = BeforeValidator(validate_score) |
|
|
|