Spaces:
Sleeping
Sleeping
File size: 2,774 Bytes
cccf200 | 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 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 | """
TaskGroup model for storing grouped tasks.
"""
from typing import Optional, List
from datetime import datetime
from sqlmodel import SQLModel, Field, Column, JSON
class TaskGroup(SQLModel, table=True):
"""Task group entity for organizing related tasks."""
__tablename__ = "task_groups"
id: Optional[int] = Field(default=None, primary_key=True)
user_id: int = Field(foreign_key="users.id", index=True)
# Group information
name: str = Field(max_length=100)
description: Optional[str] = Field(default=None, max_length=500)
category: str = Field(max_length=50, index=True) # shopping, work, personal, health, finance, home, learning
# Tasks in this group
task_ids: List[int] = Field(sa_column=Column(JSON))
# Metadata
color: Optional[str] = Field(default=None, max_length=7) # Hex color for UI display
icon: Optional[str] = Field(default=None, max_length=50) # Icon name for UI display
sort_order: int = Field(default=0) # Display order
# Statistics
total_tasks: int = Field(default=0)
completed_tasks: int = Field(default=0)
# Timestamps
created_at: datetime = Field(default_factory=datetime.utcnow)
updated_at: datetime = Field(default_factory=datetime.utcnow)
class TaskGroupCreate(SQLModel):
"""Schema for creating a new task group."""
name: str = Field(max_length=100, min_length=1)
description: Optional[str] = Field(default=None, max_length=500)
category: str = Field(max_length=50)
task_ids: List[int] = []
color: Optional[str] = Field(default=None, max_length=7)
icon: Optional[str] = Field(default=None, max_length=50)
class TaskGroupUpdate(SQLModel):
"""Schema for updating a task group."""
name: Optional[str] = Field(default=None, max_length=100, min_length=1)
description: Optional[str] = Field(default=None, max_length=500)
category: Optional[str] = Field(default=None, max_length=50)
task_ids: Optional[List[int]] = None
color: Optional[str] = Field(default=None, max_length=7)
icon: Optional[str] = Field(default=None, max_length=50)
sort_order: Optional[int] = None
class TaskGroupResponse(SQLModel):
"""Schema for task group response."""
id: int
user_id: int
name: str
description: Optional[str]
category: str
task_ids: List[int]
color: Optional[str]
icon: Optional[str]
sort_order: int
total_tasks: int
completed_tasks: int
created_at: datetime
updated_at: datetime
class TaskGroupStats(SQLModel):
"""Schema for task group statistics."""
group_id: int
group_name: str
total_tasks: int
completed_tasks: int
pending_tasks: int
completion_rate: float # Percentage 0-100
last_activity: Optional[datetime]
|