"""Chore schemas.""" from pydantic import BaseModel, ConfigDict, field_validator <<<<<<< HEAD from typing import Optional, Union, List from datetime import datetime, date from app.models.chore import ChoreFrequency, ChoreStatus, ChoreAssignmentType ======= from typing import Optional, Union from datetime import datetime, date from app.models.chore import ChoreFrequency, ChoreStatus >>>>>>> 65c71b3d67d462fe9ecc01a1c2aa17e54b626fe2 class ChoreBase(BaseModel): """Base chore schema.""" title: str description: Optional[str] = None room: str frequency: ChoreFrequency <<<<<<< HEAD points: Optional[int] = 0 image_url: Optional[str] = None assignment_type: Optional[ChoreAssignmentType] = ChoreAssignmentType.ANY_ONE ======= assigned_user_id: Optional[int] = None >>>>>>> 65c71b3d67d462fe9ecc01a1c2aa17e54b626fe2 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.""" <<<<<<< HEAD if v is None or v == '' or isinstance(v, (datetime, date)): return None if v == '' else v ======= if v is None or isinstance(v, (datetime, date)): return v >>>>>>> 65c71b3d67d462fe9ecc01a1c2aa17e54b626fe2 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 <<<<<<< HEAD # If no format matches, return None instead of the invalid string return None return None ======= return v >>>>>>> 65c71b3d67d462fe9ecc01a1c2aa17e54b626fe2 class ChoreCreate(ChoreBase): """Schema for creating a chore.""" <<<<<<< HEAD assigned_user_ids: Optional[List[int]] = [] # Multiple users can be assigned ======= pass >>>>>>> 65c71b3d67d462fe9ecc01a1c2aa17e54b626fe2 class ChoreUpdate(BaseModel): """Schema for updating a chore.""" title: Optional[str] = None description: Optional[str] = None room: Optional[str] = None frequency: Optional[ChoreFrequency] = None <<<<<<< HEAD points: Optional[int] = None status: Optional[ChoreStatus] = None assignment_type: Optional[ChoreAssignmentType] = None assigned_user_ids: Optional[List[int]] = None # Multiple users ======= status: Optional[ChoreStatus] = None assigned_user_id: Optional[int] = None >>>>>>> 65c71b3d67d462fe9ecc01a1c2aa17e54b626fe2 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.""" <<<<<<< HEAD if v is None or v == '' or isinstance(v, (datetime, date)): return None if v == '' else v ======= if v is None or isinstance(v, (datetime, date)): return v >>>>>>> 65c71b3d67d462fe9ecc01a1c2aa17e54b626fe2 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 <<<<<<< HEAD # If no format matches, return None instead of the invalid string return None return None class AssignedUserDetail(BaseModel): """User info for chore assignment.""" ======= return v class AssignedUser(BaseModel): """Minimal user info for chore assignment.""" >>>>>>> 65c71b3d67d462fe9ecc01a1c2aa17e54b626fe2 model_config = ConfigDict(from_attributes=True) id: int username: str full_name: str <<<<<<< HEAD avatar_url: Optional[str] = None birthday: Optional[date] = None completed_at: Optional[datetime] = None # When this user completed the chore ======= >>>>>>> 65c71b3d67d462fe9ecc01a1c2aa17e54b626fe2 class Chore(ChoreBase): """Schema for a chore response.""" model_config = ConfigDict(from_attributes=True) id: int status: ChoreStatus <<<<<<< HEAD points: int assignment_type: ChoreAssignmentType assigned_users: List[AssignedUserDetail] = [] # Multiple users with completion status completed_at: Optional[datetime] = None created_at: datetime updated_at: datetime # Legacy field for backward compatibility assigned_user_id: Optional[int] = None ======= assigned_user: Optional[AssignedUser] = None completed_at: Optional[datetime] = None created_at: datetime updated_at: datetime >>>>>>> 65c71b3d67d462fe9ecc01a1c2aa17e54b626fe2