from sqlalchemy import Column, String, Text, Integer, ForeignKey, DateTime, Enum from sqlalchemy.orm import relationship from datetime import datetime from enum import Enum as PyEnum from app.models.base import BaseModel class TaskStatus(str, PyEnum): TODO = "todo" IN_PROGRESS = "in_progress" DONE = "done" CANCELLED = "cancelled" class TaskPriority(str, PyEnum): LOW = "low" MEDIUM = "medium" HIGH = "high" URGENT = "urgent" class Task(BaseModel): __tablename__ = "tasks" user_id = Column(String(36), ForeignKey("users.id"), nullable=False, index=True) title = Column(String(500), nullable=False) description = Column(Text, nullable=True) status = Column(Enum(TaskStatus), default=TaskStatus.TODO, nullable=False, index=True) priority = Column(Enum(TaskPriority), default=TaskPriority.MEDIUM, nullable=False) due_date = Column(DateTime, nullable=True) completed_at = Column(DateTime, nullable=True) tags = Column(String(1000), nullable=True) # JSON 数组 history = relationship("TaskHistory", back_populates="task", cascade="all, delete-orphan") class TaskHistory(BaseModel): __tablename__ = "task_histories" task_id = Column(String(36), ForeignKey("tasks.id"), nullable=False, index=True) action = Column(String(100), nullable=False) # created, status_changed, updated, deleted old_value = Column(Text, nullable=True) new_value = Column(Text, nullable=True) task = relationship("Task", back_populates="history")