Spaces:
Sleeping
Sleeping
File size: 1,980 Bytes
08af9fd | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | from datetime import datetime
from typing import Optional
from sqlmodel import Field, SQLModel, Relationship
from pydantic import validator
class TaskBase(SQLModel):
title: str = Field(min_length=1, max_length=255)
description: Optional[str] = Field(default=None, max_length=1000)
completed: bool = Field(default=False)
priority: int = Field(default=1, description="1: Low, 2: Medium, 3: High")
category: Optional[str] = Field(default="General", max_length=50)
@validator('title')
def validate_title(cls, v):
if not v or not v.strip():
raise ValueError('Title is required and cannot be empty')
return v.strip()
@validator('description')
def validate_description(cls, v):
if v and len(v) > 1000:
raise ValueError('Description must be 1000 characters or less')
return v
@validator('priority')
def validate_priority(cls, v):
if v not in [1, 2, 3]:
return 1
return v
class Task(TaskBase, table=True):
"""
Task model representing a todo item.
"""
__tablename__ = "tasks"
id: Optional[int] = Field(default=None, primary_key=True)
user_id: str = Field(foreign_key="auth_user.id", nullable=False)
created_at: datetime = Field(default_factory=datetime.utcnow)
updated_at: datetime = Field(default_factory=datetime.utcnow)
# Relationship to User
user: Optional["User"] = Relationship(back_populates="tasks")
class TaskCreate(TaskBase):
"""
Schema for creating a new task.
"""
pass
class TaskRead(TaskBase):
"""
Schema for reading task data.
"""
id: int
user_id: str
created_at: datetime
updated_at: datetime
class TaskUpdate(SQLModel):
"""
Schema for updating a task.
"""
title: Optional[str] = None
description: Optional[str] = None
completed: Optional[bool] = None
priority: Optional[int] = None
category: Optional[str] = None |