from pydantic import BaseModel, Field, field_validator from typing import Optional, List from datetime import datetime from decimal import Decimal class UserBase(BaseModel): email: str = Field(..., max_length=255) name: str = Field(..., min_length=1, max_length=200) department_id: Optional[str] = None role_id: Optional[str] = None skills: Optional[List[str]] = None capacity: Optional[Decimal] = Field(Decimal("40.00"), ge=0, le=168) class UserCreate(UserBase): pass class UserUpdate(BaseModel): name: Optional[str] = Field(None, min_length=1, max_length=200) department_id: Optional[str] = None role_id: Optional[str] = None skills: Optional[List[str]] = None capacity: Optional[Decimal] = Field(None, ge=0, le=168) is_active: Optional[bool] = None class UserResponse(UserBase): id: str is_active: bool is_system_admin: bool created_at: datetime updated_at: datetime class Config: from_attributes = True class UserInDB(UserResponse): pass class CapacityUpdate(BaseModel): """Schema for updating user's weekly capacity hours.""" capacity_hours: Decimal @field_validator("capacity_hours") @classmethod def validate_capacity_hours(cls, v: Decimal) -> Decimal: """Validate capacity hours is within valid range (0-168).""" if v < 0: raise ValueError("Capacity hours must be non-negative") if v > 168: raise ValueError("Capacity hours cannot exceed 168 (hours in a week)") return v class Config: json_schema_extra = { "example": { "capacity_hours": 40.00 } }