Spaces:
Sleeping
Sleeping
File size: 4,348 Bytes
72a559f |
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 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
# models.py
from sqlalchemy import create_engine, Column, Integer, String, DateTime, Boolean, ForeignKey, JSON, Float
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship, sessionmaker
from datetime import datetime
import uuid
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
username = Column(String, unique=True, nullable=False)
email = Column(String, unique=True, nullable=False)
password_hash = Column(String, nullable=False)
created_at = Column(DateTime, default=datetime.utcnow)
last_login = Column(DateTime)
is_active = Column(Boolean, default=True)
preferences = Column(JSON)
# Relationships
courses = relationship("UserCourse", back_populates="user")
progress = relationship("CourseProgress", back_populates="user")
interactions = relationship("UserInteraction", back_populates="user")
class Course(Base):
__tablename__ = 'courses'
id = Column(Integer, primary_key=True)
uuid = Column(String, unique=True, default=lambda: str(uuid.uuid4()))
title = Column(String, nullable=False)
description = Column(String)
difficulty_level = Column(String)
created_at = Column(DateTime, default=datetime.utcnow)
updated_at = Column(DateTime, onupdate=datetime.utcnow)
content = Column(JSON) # Stores complete course structure
metadata = Column(JSON) # Stores additional course metadata
# Relationships
modules = relationship("CourseModule", back_populates="course")
user_courses = relationship("UserCourse", back_populates="course")
class CourseModule(Base):
__tablename__ = 'course_modules'
id = Column(Integer, primary_key=True)
course_id = Column(Integer, ForeignKey('courses.id'))
title = Column(String, nullable=False)
description = Column(String)
order_index = Column(Integer)
content = Column(JSON)
prerequisites = Column(JSON)
# Relationships
course = relationship("Course", back_populates="modules")
sections = relationship("ModuleSection", back_populates="module")
class ModuleSection(Base):
__tablename__ = 'module_sections'
id = Column(Integer, primary_key=True)
module_id = Column(Integer, ForeignKey('course_modules.id'))
title = Column(String, nullable=False)
content = Column(String)
order_index = Column(Integer)
metadata = Column(JSON)
# Relationships
module = relationship("CourseModule", back_populates="sections")
quizzes = relationship("SectionQuiz", back_populates="section")
class UserCourse(Base):
__tablename__ = 'user_courses'
id = Column(Integer, primary_key=True)
user_id = Column(Integer, ForeignKey('users.id'))
course_id = Column(Integer, ForeignKey('courses.id'))
enrollment_date = Column(DateTime, default=datetime.utcnow)
completion_date = Column(DateTime)
status = Column(String) # 'enrolled', 'in_progress', 'completed', 'archived'
# Relationships
user = relationship("User", back_populates="courses")
course = relationship("Course", back_populates="user_courses")
progress = relationship("CourseProgress", back_populates="user_course")
class CourseProgress(Base):
__tablename__ = 'course_progress'
id = Column(Integer, primary_key=True)
user_id = Column(Integer, ForeignKey('users.id'))
user_course_id = Column(Integer, ForeignKey('user_courses.id'))
module_id = Column(Integer, ForeignKey('course_modules.id'))
last_accessed = Column(DateTime)
completion_percentage = Column(Float)
status = Column(String) # 'not_started', 'in_progress', 'completed'
# Relationships
user = relationship("User", back_populates="progress")
user_course = relationship("UserCourse", back_populates="progress")
class UserInteraction(Base):
__tablename__ = 'user_interactions'
id = Column(Integer, primary_key=True)
user_id = Column(Integer, ForeignKey('users.id'))
interaction_type = Column(String) # 'quiz_attempt', 'question_asked', 'content_viewed'
content_reference = Column(String)
timestamp = Column(DateTime, default=datetime.utcnow)
metadata = Column(JSON)
# Relationships
user = relationship("User", back_populates="interactions")
|