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