61 lines
2.3 KiB
Python
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)
|