Update app/schemas/class_.py
Browse files- 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
|
| 3 |
from typing import List, Optional
|
| 4 |
|
| 5 |
-
from pydantic import BaseModel
|
| 6 |
|
| 7 |
|
| 8 |
-
# ----------
|
| 9 |
|
| 10 |
|
| 11 |
class ClassBase(BaseModel):
|
| 12 |
name: str
|
| 13 |
description: Optional[str] = None
|
|
|
|
|
|
|
|
|
|
| 14 |
days_of_week: List[str]
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 |
-
|
| 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
|