46 lines
1.5 KiB
Python
46 lines
1.5 KiB
Python
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")
|