Files
012-kaopeilian/backend/app/models/task.py
111 998211c483 feat: 初始化考培练系统项目
- 从服务器拉取完整代码
- 按框架规范整理项目结构
- 配置 Drone CI 测试环境部署
- 包含后端(FastAPI)、前端(Vue3)、管理端

技术栈: Vue3 + TypeScript + FastAPI + MySQL
2026-01-24 19:33:28 +08:00

101 lines
3.8 KiB
Python

"""
任务相关模型
"""
from datetime import datetime
from typing import List, Optional
from sqlalchemy import Column, Integer, String, Text, DateTime, Enum as SQLEnum, JSON, Boolean, ForeignKey
from sqlalchemy.orm import Mapped, mapped_column, relationship
from app.models.base import BaseModel
from enum import Enum
class TaskPriority(str, Enum):
"""任务优先级"""
LOW = "low"
MEDIUM = "medium"
HIGH = "high"
class TaskStatus(str, Enum):
"""任务状态"""
PENDING = "pending" # 待开始
ONGOING = "ongoing" # 进行中
COMPLETED = "completed" # 已完成
EXPIRED = "expired" # 已过期
class AssignmentStatus(str, Enum):
"""分配状态"""
NOT_STARTED = "not_started"
IN_PROGRESS = "in_progress"
COMPLETED = "completed"
class Task(BaseModel):
"""任务表"""
__tablename__ = "tasks"
title: Mapped[str] = mapped_column(String(200), nullable=False, comment="任务标题")
description: Mapped[Optional[str]] = mapped_column(Text, nullable=True, comment="任务描述")
priority: Mapped[TaskPriority] = mapped_column(
SQLEnum(TaskPriority, values_callable=lambda x: [e.value for e in x]),
default=TaskPriority.MEDIUM,
nullable=False,
comment="优先级"
)
status: Mapped[TaskStatus] = mapped_column(
SQLEnum(TaskStatus, values_callable=lambda x: [e.value for e in x]),
default=TaskStatus.PENDING,
nullable=False,
comment="任务状态"
)
creator_id: Mapped[int] = mapped_column(Integer, ForeignKey("users.id"), nullable=False, comment="创建人ID")
deadline: Mapped[Optional[datetime]] = mapped_column(DateTime, nullable=True, comment="截止时间")
requirements: Mapped[Optional[dict]] = mapped_column(JSON, nullable=True, comment="任务要求配置")
progress: Mapped[int] = mapped_column(Integer, default=0, nullable=False, comment="完成进度")
is_deleted: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False)
# 关系
creator = relationship("User", backref="created_tasks", foreign_keys=[creator_id])
course_links = relationship("TaskCourse", back_populates="task", cascade="all, delete-orphan")
assignments = relationship("TaskAssignment", back_populates="task", cascade="all, delete-orphan")
class TaskCourse(BaseModel):
"""任务课程关联表"""
__tablename__ = "task_courses"
task_id: Mapped[int] = mapped_column(Integer, ForeignKey("tasks.id"), nullable=False, comment="任务ID")
course_id: Mapped[int] = mapped_column(Integer, ForeignKey("courses.id"), nullable=False, comment="课程ID")
# 关系
task = relationship("Task", back_populates="course_links")
course = relationship("Course")
class TaskAssignment(BaseModel):
"""任务分配表"""
__tablename__ = "task_assignments"
task_id: Mapped[int] = mapped_column(Integer, ForeignKey("tasks.id"), nullable=False, comment="任务ID")
user_id: Mapped[int] = mapped_column(Integer, ForeignKey("users.id"), nullable=False, comment="分配用户ID")
team_id: Mapped[Optional[int]] = mapped_column(Integer, nullable=True, comment="团队ID")
status: Mapped[AssignmentStatus] = mapped_column(
SQLEnum(AssignmentStatus, values_callable=lambda x: [e.value for e in x]),
default=AssignmentStatus.NOT_STARTED,
nullable=False,
comment="完成状态"
)
progress: Mapped[int] = mapped_column(Integer, default=0, nullable=False, comment="个人完成进度")
completed_at: Mapped[Optional[datetime]] = mapped_column(DateTime, nullable=True, comment="完成时间")
# 关系
task = relationship("Task", back_populates="assignments")
user = relationship("User")
__all__ = ["Task", "TaskCourse", "TaskAssignment", "TaskPriority", "TaskStatus", "AssignmentStatus"]