from typing import List, Optional, Union from datetime import date from pydantic import BaseModel, Field, ConfigDict class TransactionBase(BaseModel): amount: float = Field(..., gt=-1e18, lt=1e18) description: Optional[str] = None # accept either ISO date string or date object date: Optional[Union[date, str]] = None class TransactionCreate(TransactionBase): category_ids: Optional[List[int]] = None class TransactionUpdate(BaseModel): amount: Optional[float] = Field(None, gt=-1e18, lt=1e18) description: Optional[str] = None # accept either ISO date string or date object date: Optional[Union[date, str]] = None category_ids: Optional[List[int]] = None class TransactionRead(TransactionBase): id: int category_ids: List[int] = [] date: Optional[Union[date, str]] model_config = ConfigDict(from_attributes=True)