Spaces:
Sleeping
Sleeping
File size: 2,808 Bytes
2732fa3 | 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 72 73 74 | """Progress tracking models."""
from datetime import datetime
from sqlalchemy import Column, String, Boolean, DateTime, Integer, ForeignKey, Float, UniqueConstraint
from sqlalchemy.orm import relationship
from uuid import uuid4
from app.database import Base
class Enrollment(Base):
__tablename__ = "enrollments"
__table_args__ = (
UniqueConstraint('student_id', 'course_id', name='unique_enrollment'),
)
id = Column(String(36), primary_key=True, default=lambda: str(uuid4()))
student_id = Column(String(36), ForeignKey("users.id"), nullable=False)
course_id = Column(String(36), ForeignKey("courses.id"), nullable=False)
enrolled_at = Column(DateTime, default=datetime.utcnow)
completed_at = Column(DateTime, nullable=True)
is_completed = Column(Boolean, default=False)
progress_percentage = Column(Float, default=0.0)
# Relationships
student = relationship("User", back_populates="enrollments")
course = relationship("Course", back_populates="enrollments")
def __repr__(self):
return f"<Enrollment {self.student_id} -> {self.course_id}>"
class Progress(Base):
__tablename__ = "progress"
__table_args__ = (
UniqueConstraint('student_id', 'lesson_id', name='unique_progress'),
)
id = Column(String(36), primary_key=True, default=lambda: str(uuid4()))
student_id = Column(String(36), ForeignKey("users.id"), nullable=False)
lesson_id = Column(String(36), ForeignKey("lessons.id"), nullable=False)
is_completed = Column(Boolean, default=False)
completed_at = Column(DateTime, nullable=True)
time_spent_seconds = Column(Integer, default=0)
last_position = Column(Integer, default=0) # For video progress
# Timestamps
started_at = Column(DateTime, default=datetime.utcnow)
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
# Relationships
student = relationship("User", back_populates="progress_records")
lesson = relationship("Lesson", back_populates="progress_records")
def __repr__(self):
return f"<Progress {self.student_id} -> {self.lesson_id}>"
class StudyStreak(Base):
__tablename__ = "study_streaks"
id = Column(String(36), primary_key=True, default=lambda: str(uuid4()))
student_id = Column(String(36), ForeignKey("users.id"), nullable=False, unique=True)
current_streak = Column(Integer, default=0)
longest_streak = Column(Integer, default=0)
last_study_date = Column(DateTime, nullable=True)
total_study_days = Column(Integer, default=0)
# Relationships
student = relationship("User")
def __repr__(self):
return f"<StudyStreak {self.student_id}: {self.current_streak} days>"
|