"""Chore schemas.""" from pydantic import BaseModel, ConfigDict, field_validator from typing import Optional, Union from datetime import datetime, date from app.models.chore import ChoreFrequency, ChoreStatus class ChoreBase(BaseModel): """Base chore schema.""" title: str description: Optional[str] = None room: str frequency: ChoreFrequency assigned_user_id: Optional[int] = 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): """Schema for creating a chore.""" pass class ChoreUpdate(BaseModel): """Schema for updating a chore.""" title: Optional[str] = None description: Optional[str] = None room: Optional[str] = None frequency: Optional[ChoreFrequency] = None status: Optional[ChoreStatus] = None assigned_user_id: Optional[int] = 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): """Minimal user info for chore assignment.""" model_config = ConfigDict(from_attributes=True) id: int username: str full_name: str class Chore(ChoreBase): """Schema for a chore response.""" model_config = ConfigDict(from_attributes=True) id: int status: ChoreStatus assigned_user: Optional[AssignedUser] = None completed_at: Optional[datetime] = None created_at: datetime updated_at: datetime