File size: 2,650 Bytes
c72a1e8 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | import enum
from datetime import datetime, timezone
from sqlalchemy import Boolean, Column, DateTime, Enum, ForeignKey, Integer, String, Text
from sqlalchemy.orm import relationship
from database import Base
class MicroStepStatus(enum.Enum):
pending = "pending"
in_progress = "in_progress"
completed = "completed"
skipped = "skipped"
class Subject(Base):
__tablename__ = "subjects"
id = Column(Integer, primary_key=True, index=True)
name = Column(String(200), nullable=False)
semester = Column(String(50))
is_active = Column(Boolean, default=True)
is_parked = Column(Boolean, default=False)
created_at = Column(DateTime, default=lambda: datetime.now(timezone.utc).replace(tzinfo=None))
deadlines = relationship("Deadline", back_populates="subject", cascade="all, delete-orphan")
study_sessions = relationship("StudySession", back_populates="subject", cascade="all, delete-orphan")
class Deadline(Base):
__tablename__ = "deadlines"
id = Column(Integer, primary_key=True, index=True)
subject_id = Column(Integer, ForeignKey("subjects.id"), nullable=False)
title = Column(String(200), nullable=False)
description = Column(Text)
due_date = Column(DateTime, nullable=False)
created_at = Column(DateTime, default=lambda: datetime.now(timezone.utc).replace(tzinfo=None))
subject = relationship("Subject", back_populates="deadlines")
micro_steps = relationship("MicroStep", back_populates="deadline", cascade="all, delete-orphan")
class MicroStep(Base):
__tablename__ = "micro_steps"
id = Column(Integer, primary_key=True, index=True)
deadline_id = Column(Integer, ForeignKey("deadlines.id"), nullable=False)
title = Column(String(300), nullable=False)
context = Column(Text) # what exactly to do — fresh-start framing
order_num = Column(Integer, default=0)
duration_minutes = Column(Integer, default=5)
status = Column(Enum(MicroStepStatus), default=MicroStepStatus.pending)
created_at = Column(DateTime, default=lambda: datetime.now(timezone.utc).replace(tzinfo=None))
deadline = relationship("Deadline", back_populates="micro_steps")
class StudySession(Base):
__tablename__ = "study_sessions"
id = Column(Integer, primary_key=True, index=True)
subject_id = Column(Integer, ForeignKey("subjects.id"), nullable=False)
started_at = Column(DateTime, default=lambda: datetime.now(timezone.utc).replace(tzinfo=None))
ended_at = Column(DateTime)
steps_completed = Column(Integer, default=0)
notes = Column(Text)
subject = relationship("Subject", back_populates="study_sessions")
|