""" Custom Pydantic base models for consistent serialization. Following best practice of having a global base model. """ from datetime import datetime from typing import Any from fastapi.encoders import jsonable_encoder from pydantic import BaseModel, ConfigDict def datetime_to_iso_str(dt: datetime) -> str: """Convert datetime to ISO format string.""" return dt.isoformat() class CustomBaseModel(BaseModel): """ Custom base model with consistent configuration. All domain models should inherit from this for: - Consistent JSON serialization - Timezone-aware datetime handling - Alias population support """ model_config = ConfigDict( json_encoders={datetime: datetime_to_iso_str}, populate_by_name=True, use_enum_values=True, validate_assignment=True, arbitrary_types_allowed=True, ) def serializable_dict(self, **kwargs: Any) -> dict[str, Any]: """ Return dict with only JSON-serializable fields. Useful for logging and debugging. """ return jsonable_encoder( self.model_dump(**kwargs), custom_encoder={datetime: datetime_to_iso_str} )