PYTHON
schemas.py🐍python
"""
Pydantic schemas for request/response validation.
"""
from pydantic import BaseModel, EmailStr, Field
from datetime import datetime
from typing import Optional
from enum import Enum
# =============================================================================
# Enums
# =============================================================================
class TaskPriority(str, Enum):
LOW = "low"
MEDIUM = "medium"
HIGH = "high"
URGENT = "urgent"
# =============================================================================
# User Schemas
# =============================================================================
class UserBase(BaseModel):
"""Base user schema."""
email: EmailStr
username: str = Field(..., min_length=3, max_length=50)
class UserCreate(UserBase):
"""Schema for creating a user."""
password: str = Field(..., min_length=8)
class UserResponse(UserBase):
"""Schema for user response."""
id: int
is_active: bool
created_at: datetime
class Config:
from_attributes = True # Allow ORM model conversion
class UserLogin(BaseModel):
"""Schema for user login."""
username: str
password: str
# =============================================================================
# Token Schemas
# =============================================================================
class Token(BaseModel):
"""JWT token response."""
access_token: str
token_type: str = "bearer"
class TokenData(BaseModel):
"""Token payload data."""
username: Optional[str] = None
# =============================================================================
# Task Schemas
# =============================================================================
class TaskBase(BaseModel):
"""Base task schema."""
title: str = Field(..., min_length=1, max_length=200)
description: Optional[str] = Field(None, max_length=1000)
priority: TaskPriority = TaskPriority.MEDIUM
category: Optional[str] = Field(None, max_length=50)
due_date: Optional[datetime] = None
class TaskCreate(TaskBase):
"""Schema for creating a task."""
pass
class TaskUpdate(BaseModel):
"""Schema for updating a task (all fields optional)."""
title: Optional[str] = Field(None, min_length=1, max_length=200)
description: Optional[str] = Field(None, max_length=1000)
completed: Optional[bool] = None
priority: Optional[TaskPriority] = None
category: Optional[str] = Field(None, max_length=50)
due_date: Optional[datetime] = None
class TaskResponse(TaskBase):
"""Schema for task response."""
id: int
completed: bool
created_at: datetime
updated_at: Optional[datetime]
owner_id: int
class Config:
from_attributes = True
# =============================================================================
# Pagination
# =============================================================================
class PaginatedResponse(BaseModel):
"""Generic paginated response."""
items: list
total: int
page: int
per_page: int
pages: int