Seth0330 commited on
Commit
c8ade5a
·
verified ·
1 Parent(s): 6f479ca

Update app/schemas/class_.py

Browse files
Files changed (1) hide show
  1. app/schemas/class_.py +56 -13
app/schemas/class_.py CHANGED
@@ -1,34 +1,81 @@
1
  # app/schemas/class_.py
2
- from datetime import datetime, time
3
  from typing import List, Optional
4
 
5
- from pydantic import BaseModel
6
 
7
 
8
- # ---------- CLASS SCHEMAS ----------
9
 
10
 
11
  class ClassBase(BaseModel):
12
  name: str
13
  description: Optional[str] = None
 
 
 
14
  days_of_week: List[str]
15
- class_time: Optional[time] = None
16
- classes_per_week: Optional[int] = None
17
- max_students: Optional[int] = None
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
18
 
19
 
20
  class ClassCreate(ClassBase):
 
 
 
 
 
 
 
 
 
 
 
 
 
21
  pass
22
 
23
 
24
  class ClassUpdate(BaseModel):
 
 
 
25
  name: Optional[str] = None
26
  description: Optional[str] = None
 
27
  days_of_week: Optional[List[str]] = None
28
- class_time: Optional[time] = None
29
  classes_per_week: Optional[int] = None
30
  max_students: Optional[int] = None
31
 
 
 
 
 
 
 
 
 
 
 
 
32
 
33
  class ClassOut(ClassBase):
34
  id: int
@@ -43,7 +90,6 @@ class ClassOut(ClassBase):
43
 
44
 
45
  class ClassEnrollmentBase(BaseModel):
46
- # NOTE: plain string, not EmailStr (avoids extra dependency)
47
  student_email: str
48
  student_name: Optional[str] = None
49
 
@@ -56,11 +102,8 @@ class ClassEnrollmentOut(ClassEnrollmentBase):
56
  id: int
57
  class_id: int
58
  status: str
59
- invited_at: datetime
60
- activated_at: Optional[datetime] = None
61
- removed_at: Optional[datetime] = None
62
- created_at: datetime
63
- updated_at: datetime
64
 
65
  class Config:
66
  orm_mode = True
 
1
  # app/schemas/class_.py
2
+ from datetime import datetime
3
  from typing import List, Optional
4
 
5
+ from pydantic import BaseModel, validator
6
 
7
 
8
+ # ---------- BASE SCHEMA ----------
9
 
10
 
11
  class ClassBase(BaseModel):
12
  name: str
13
  description: Optional[str] = None
14
+ # We keep class_time as a simple "HH:MM" string for API & DB
15
+ class_time: str
16
+ # Public API: always a list of day strings
17
  days_of_week: List[str]
18
+ classes_per_week: int = 1
19
+ max_students: int = 20
20
+
21
+ @validator("days_of_week", pre=True)
22
+ def ensure_list(cls, v):
23
+ """
24
+ Make sure days_of_week is always a list of strings.
25
+
26
+ - When coming from the DB via ORM, v is a string like "Monday,Wednesday".
27
+ - When coming from the request body, v is already a list like ["Monday"].
28
+ """
29
+ if v is None:
30
+ return []
31
+ if isinstance(v, str):
32
+ # Split comma-separated string from DB
33
+ return [d.strip() for d in v.split(",") if d.strip()]
34
+ return v
35
+
36
+
37
+ # ---------- CREATE / UPDATE ----------
38
 
39
 
40
  class ClassCreate(ClassBase):
41
+ """
42
+ Schema used for creating a class.
43
+
44
+ Frontend sends:
45
+ {
46
+ "name": "...",
47
+ "description": "...",
48
+ "class_time": "18:00",
49
+ "days_of_week": ["Monday", "Wednesday"],
50
+ "classes_per_week": 2,
51
+ "max_students": 20
52
+ }
53
+ """
54
  pass
55
 
56
 
57
  class ClassUpdate(BaseModel):
58
+ """
59
+ All fields optional for partial update.
60
+ """
61
  name: Optional[str] = None
62
  description: Optional[str] = None
63
+ class_time: Optional[str] = None
64
  days_of_week: Optional[List[str]] = None
 
65
  classes_per_week: Optional[int] = None
66
  max_students: Optional[int] = None
67
 
68
+ @validator("days_of_week", pre=True)
69
+ def ensure_list(cls, v):
70
+ if v is None:
71
+ return v
72
+ if isinstance(v, str):
73
+ return [d.strip() for d in v.split(",") if d.strip()]
74
+ return v
75
+
76
+
77
+ # ---------- OUT / RESPONSE ----------
78
+
79
 
80
  class ClassOut(ClassBase):
81
  id: int
 
90
 
91
 
92
  class ClassEnrollmentBase(BaseModel):
 
93
  student_email: str
94
  student_name: Optional[str] = None
95
 
 
102
  id: int
103
  class_id: int
104
  status: str
105
+ invited_at: Optional[datetime] = None
106
+ joined_at: Optional[datetime] = None
 
 
 
107
 
108
  class Config:
109
  orm_mode = True