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")