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