Files
2026-11-02 15:45:49 +08:00

61 lines
2.3 KiB
Python

from sqlalchemy import Column, Integer, String, Text, Float, DateTime, ForeignKey, JSON, Date, Enum
from sqlalchemy.orm import relationship
from datetime import datetime, timezone
from database import Base
import enum
class TaskStatus(str, enum.Enum):
todo = "todo"
in_progress = "in_progress"
done = "done"
class TaskPriority(str, enum.Enum):
low = "low"
medium = "medium"
high = "high"
class User(Base):
__tablename__ = "users"
id = Column(Integer, primary_key=True, index=True, autoincrement=True)
name = Column(String(100), nullable=False)
email = Column(String(191), unique=True, nullable=False, index=True)
password_hash = Column(String(255), nullable=False)
xp = Column(Integer, nullable=False, default=0)
created_at = Column(DateTime, default=lambda: datetime.now(timezone.utc))
plans = relationship("Plan", back_populates="user", cascade="all, delete-orphan")
class Plan(Base):
__tablename__ = "plans"
id = Column(Integer, primary_key=True, index=True, autoincrement=True)
user_id = Column(Integer, ForeignKey("users.id"), nullable=False)
goal = Column(Text, nullable=False)
created_at = Column(DateTime, default=lambda: datetime.now(timezone.utc))
user = relationship("User", back_populates="plans")
tasks = relationship("Task", back_populates="plan", cascade="all, delete-orphan")
class Task(Base):
__tablename__ = "tasks"
id = Column(Integer, primary_key=True, index=True, autoincrement=True)
plan_id = Column(Integer, ForeignKey("plans.id"), nullable=False)
parent_id = Column(Integer, ForeignKey("tasks.id"), nullable=True, index=True)
task_id = Column(String(100), nullable=False, index=True)
title = Column(String(255), nullable=False)
description = Column(Text, nullable=False)
dependencies = Column(JSON, default=list)
duration_in_hours = Column(Float, nullable=False, default=0)
priority = Column(String(10), nullable=False, default="medium")
due_date = Column(Date, nullable=True)
status = Column(String(20), nullable=False, default="todo")
sort_order = Column(Integer, nullable=False, default=0)
plan = relationship("Plan", back_populates="tasks")
children = relationship("Task", backref="parent", remote_side=[id], cascade="all, delete-orphan", single_parent=True)