File size: 3,282 Bytes
6a0788c eb7425a 72e41f8 eb7425a 72e41f8 eb7425a 72e41f8 7338420 72e41f8 eb7425a 72e41f8 eb7425a 3f3c2a2 eb7425a 4f74be7 78c3038 72e41f8 eb7425a 6a0788c 3f3c2a2 6a0788c 72e41f8 3f3c2a2 78c3038 3f3c2a2 72e41f8 7338420 6a0788c eb7425a 6ef26f7 eb7425a 5a655c5 72e41f8 eb7425a 3f3c2a2 eb7425a 78c3038 | 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 116 117 118 119 120 121 122 123 124 125 | # 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")
|