diff --git a/backend/app/schemas/chore.py b/backend/app/schemas/chore.py index f497f9b..3c9c660 100644 --- a/backend/app/schemas/chore.py +++ b/backend/app/schemas/chore.py @@ -1,7 +1,8 @@ """Chore schemas.""" -from pydantic import BaseModel, ConfigDict -from typing import Optional -from datetime import datetime +from pydantic import BaseModel, ConfigDict, field_validator +from typing import Optional, Union +from datetime import datetime, date + from app.models.chore import ChoreFrequency, ChoreStatus @@ -12,7 +13,22 @@ class ChoreBase(BaseModel): room: str frequency: ChoreFrequency assigned_user_id: Optional[int] = None - due_date: Optional[datetime] = None + due_date: Optional[Union[datetime, date, str]] = None + + @field_validator('due_date', mode='before') + @classmethod + def parse_due_date(cls, v): + """Parse due_date to handle various formats.""" + if v is None or isinstance(v, (datetime, date)): + return v + if isinstance(v, str): + # Try parsing as datetime first + for fmt in ['%Y-%m-%dT%H:%M:%S', '%Y-%m-%d']: + try: + return datetime.strptime(v, fmt) + except ValueError: + continue + return v class ChoreCreate(ChoreBase): @@ -28,7 +44,22 @@ class ChoreUpdate(BaseModel): frequency: Optional[ChoreFrequency] = None status: Optional[ChoreStatus] = None assigned_user_id: Optional[int] = None - due_date: Optional[datetime] = None + due_date: Optional[Union[datetime, date, str]] = None + + @field_validator('due_date', mode='before') + @classmethod + def parse_due_date(cls, v): + """Parse due_date to handle various formats.""" + if v is None or isinstance(v, (datetime, date)): + return v + if isinstance(v, str): + # Try parsing as datetime first + for fmt in ['%Y-%m-%dT%H:%M:%S', '%Y-%m-%d']: + try: + return datetime.strptime(v, fmt) + except ValueError: + continue + return v class AssignedUser(BaseModel):