keeai / app /models /class_.py
Seth0330's picture
Update app/models/class_.py
78c3038 verified
# app/models/class_.py
from datetime import datetime
from sqlalchemy import (
Column,
Integer,
String,
Boolean,
Text,
ForeignKey,
DateTime,
)
from sqlalchemy.orm import relationship
from core.database import Base
class Class(Base):
__tablename__ = "classes"
id = Column(Integer, primary_key=True, index=True)
# Basic info
name = Column(String(255), nullable=False)
description = Column(Text, nullable=True)
# Schedule
# Store time as a simple string "HH:MM" (or "HH:MM:SS") to avoid DB driver issues
class_time = Column(String(8), nullable=False)
# e.g. "Monday,Wednesday,Friday"
days_of_week = Column(String(50), nullable=False)
classes_per_week = Column(Integer, nullable=False, default=1)
max_students = Column(Integer, nullable=False, default=20)
# Coach assignment
coach_email = Column(String(255), nullable=True, index=True)
# Location - can be physical address or online meeting link
location = Column(Text, nullable=True)
# Status + timestamps
is_active = Column(Boolean, default=True)
created_at = Column(DateTime, default=datetime.utcnow)
updated_at = Column(
DateTime,
default=datetime.utcnow,
onupdate=datetime.utcnow,
)
# Relationships
# Keep this so ClassEnrollment.back_populates="class_" works
enrollments = relationship(
"ClassEnrollment",
back_populates="class_",
cascade="all, delete-orphan",
)
# Many-to-many relationship with membership plans
membership_plans = relationship(
"ClassMembershipPlan",
back_populates="class_",
cascade="all, delete-orphan",
)
class ClassEnrollment(Base):
__tablename__ = "class_enrollments"
id = Column(Integer, primary_key=True, index=True)
class_id = Column(
Integer,
ForeignKey("classes.id"),
nullable=False,
)
# Link to student if available (for direct enrollment)
student_id = Column(
Integer,
ForeignKey("students.id"),
nullable=True,
)
student_email = Column(String(255), nullable=False)
student_name = Column(String(255), nullable=True)
status = Column(
String(20),
default="invited", # invited | joined | removed
nullable=False,
)
invited_at = Column(DateTime, default=datetime.utcnow)
joined_at = Column(DateTime, nullable=True)
# Optional, since your service sets removed_at when removing:
removed_at = Column(DateTime, nullable=True)
class_ = relationship("Class", back_populates="enrollments")
class ClassMembershipPlan(Base):
"""Many-to-many relationship between classes and membership plans."""
__tablename__ = "class_membership_plans"
id = Column(Integer, primary_key=True, index=True)
class_id = Column(
Integer,
ForeignKey("classes.id"),
nullable=False,
index=True,
)
membership_plan_id = Column(
Integer,
ForeignKey("membership_plans.id"),
nullable=False,
index=True,
)
created_at = Column(DateTime, default=datetime.utcnow)
# Relationships
class_ = relationship("Class", back_populates="membership_plans")