Update app/main.py
Browse files- app/main.py +135 -4
app/main.py
CHANGED
|
@@ -31,7 +31,7 @@ from models.student import Student
|
|
| 31 |
from models.exam import Exam, ExamBatch, ExamStudentRegistration
|
| 32 |
from models.attendance import Attendance
|
| 33 |
from models.student_comment import StudentComment
|
| 34 |
-
from models.class_ import Class, ClassEnrollment
|
| 35 |
|
| 36 |
# Classes schemas + service
|
| 37 |
from schemas.class_ import (
|
|
@@ -766,7 +766,52 @@ def get_admin_classes(db: Session = Depends(get_db)):
|
|
| 766 |
List all classes (most recent first).
|
| 767 |
"""
|
| 768 |
classes = class_service.get_classes(db)
|
| 769 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 770 |
|
| 771 |
|
| 772 |
@app.post("/api/admin/classes", response_model=ClassOut, status_code=201)
|
|
@@ -778,7 +823,50 @@ def create_admin_class(
|
|
| 778 |
Create a new class configuration.
|
| 779 |
"""
|
| 780 |
db_class = class_service.create_class(db, class_in)
|
| 781 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 782 |
|
| 783 |
|
| 784 |
@app.put("/api/admin/classes/{class_id}", response_model=ClassOut)
|
|
@@ -793,7 +881,50 @@ def update_admin_class(
|
|
| 793 |
db_class = class_service.update_class(db, class_id, class_in)
|
| 794 |
if not db_class:
|
| 795 |
raise HTTPException(status_code=404, detail="Class not found")
|
| 796 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 797 |
|
| 798 |
|
| 799 |
@app.delete("/api/admin/classes/{class_id}", status_code=204)
|
|
|
|
| 31 |
from models.exam import Exam, ExamBatch, ExamStudentRegistration
|
| 32 |
from models.attendance import Attendance
|
| 33 |
from models.student_comment import StudentComment
|
| 34 |
+
from models.class_ import Class, ClassEnrollment, ClassMembershipPlan
|
| 35 |
|
| 36 |
# Classes schemas + service
|
| 37 |
from schemas.class_ import (
|
|
|
|
| 766 |
List all classes (most recent first).
|
| 767 |
"""
|
| 768 |
classes = class_service.get_classes(db)
|
| 769 |
+
# Add membership_plan_ids and schedule to each class
|
| 770 |
+
result = []
|
| 771 |
+
for cls in classes:
|
| 772 |
+
# Reconstruct schedule from days_of_week and class_time
|
| 773 |
+
days = cls.days_of_week.split(",") if cls.days_of_week else []
|
| 774 |
+
class_time_parts = cls.class_time.split("-") if cls.class_time and "-" in cls.class_time else [cls.class_time, ""]
|
| 775 |
+
start_time = class_time_parts[0].strip() if len(class_time_parts) > 0 else ""
|
| 776 |
+
end_time = class_time_parts[1].strip() if len(class_time_parts) > 1 else ""
|
| 777 |
+
|
| 778 |
+
schedule = []
|
| 779 |
+
for day in days:
|
| 780 |
+
if day.strip():
|
| 781 |
+
schedule.append({
|
| 782 |
+
"day": day.strip(),
|
| 783 |
+
"start_time": start_time,
|
| 784 |
+
"end_time": end_time,
|
| 785 |
+
"time": f"{start_time}-{end_time}" if start_time and end_time else start_time or "",
|
| 786 |
+
})
|
| 787 |
+
|
| 788 |
+
# If no schedule, create a default one
|
| 789 |
+
if not schedule:
|
| 790 |
+
schedule = [{"day": "Monday", "start_time": "", "end_time": "", "time": ""}]
|
| 791 |
+
|
| 792 |
+
class_dict = {
|
| 793 |
+
"id": cls.id,
|
| 794 |
+
"name": cls.name,
|
| 795 |
+
"description": cls.description,
|
| 796 |
+
"class_time": cls.class_time,
|
| 797 |
+
"days_of_week": days,
|
| 798 |
+
"classes_per_week": cls.classes_per_week,
|
| 799 |
+
"max_students": cls.max_students,
|
| 800 |
+
"is_active": cls.is_active,
|
| 801 |
+
"coach_email": cls.coach_email,
|
| 802 |
+
"location": cls.location,
|
| 803 |
+
"created_at": cls.created_at,
|
| 804 |
+
"updated_at": cls.updated_at,
|
| 805 |
+
"membership_plan_ids": [
|
| 806 |
+
cmp.membership_plan_id
|
| 807 |
+
for cmp in db.query(ClassMembershipPlan)
|
| 808 |
+
.filter(ClassMembershipPlan.class_id == cls.id)
|
| 809 |
+
.all()
|
| 810 |
+
],
|
| 811 |
+
"schedule": schedule,
|
| 812 |
+
}
|
| 813 |
+
result.append(class_dict)
|
| 814 |
+
return result
|
| 815 |
|
| 816 |
|
| 817 |
@app.post("/api/admin/classes", response_model=ClassOut, status_code=201)
|
|
|
|
| 823 |
Create a new class configuration.
|
| 824 |
"""
|
| 825 |
db_class = class_service.create_class(db, class_in)
|
| 826 |
+
# Get membership_plan_ids for response
|
| 827 |
+
membership_plan_ids = [
|
| 828 |
+
cmp.membership_plan_id
|
| 829 |
+
for cmp in db.query(ClassMembershipPlan)
|
| 830 |
+
.filter(ClassMembershipPlan.class_id == db_class.id)
|
| 831 |
+
.all()
|
| 832 |
+
]
|
| 833 |
+
# Reconstruct schedule
|
| 834 |
+
days = db_class.days_of_week.split(",") if db_class.days_of_week else []
|
| 835 |
+
class_time_parts = db_class.class_time.split("-") if db_class.class_time and "-" in db_class.class_time else [db_class.class_time, ""]
|
| 836 |
+
start_time = class_time_parts[0].strip() if len(class_time_parts) > 0 else ""
|
| 837 |
+
end_time = class_time_parts[1].strip() if len(class_time_parts) > 1 else ""
|
| 838 |
+
|
| 839 |
+
schedule = []
|
| 840 |
+
for day in days:
|
| 841 |
+
if day.strip():
|
| 842 |
+
schedule.append({
|
| 843 |
+
"day": day.strip(),
|
| 844 |
+
"start_time": start_time,
|
| 845 |
+
"end_time": end_time,
|
| 846 |
+
"time": f"{start_time}-{end_time}" if start_time and end_time else start_time or "",
|
| 847 |
+
})
|
| 848 |
+
|
| 849 |
+
if not schedule:
|
| 850 |
+
schedule = [{"day": "Monday", "start_time": "", "end_time": "", "time": ""}]
|
| 851 |
+
|
| 852 |
+
# Convert to dict for response
|
| 853 |
+
class_dict = {
|
| 854 |
+
"id": db_class.id,
|
| 855 |
+
"name": db_class.name,
|
| 856 |
+
"description": db_class.description,
|
| 857 |
+
"class_time": db_class.class_time,
|
| 858 |
+
"days_of_week": days,
|
| 859 |
+
"classes_per_week": db_class.classes_per_week,
|
| 860 |
+
"max_students": db_class.max_students,
|
| 861 |
+
"is_active": db_class.is_active,
|
| 862 |
+
"coach_email": db_class.coach_email,
|
| 863 |
+
"location": db_class.location,
|
| 864 |
+
"created_at": db_class.created_at,
|
| 865 |
+
"updated_at": db_class.updated_at,
|
| 866 |
+
"membership_plan_ids": membership_plan_ids,
|
| 867 |
+
"schedule": schedule,
|
| 868 |
+
}
|
| 869 |
+
return class_dict
|
| 870 |
|
| 871 |
|
| 872 |
@app.put("/api/admin/classes/{class_id}", response_model=ClassOut)
|
|
|
|
| 881 |
db_class = class_service.update_class(db, class_id, class_in)
|
| 882 |
if not db_class:
|
| 883 |
raise HTTPException(status_code=404, detail="Class not found")
|
| 884 |
+
# Get membership_plan_ids for response
|
| 885 |
+
membership_plan_ids = [
|
| 886 |
+
cmp.membership_plan_id
|
| 887 |
+
for cmp in db.query(ClassMembershipPlan)
|
| 888 |
+
.filter(ClassMembershipPlan.class_id == class_id)
|
| 889 |
+
.all()
|
| 890 |
+
]
|
| 891 |
+
# Reconstruct schedule
|
| 892 |
+
days = db_class.days_of_week.split(",") if db_class.days_of_week else []
|
| 893 |
+
class_time_parts = db_class.class_time.split("-") if db_class.class_time and "-" in db_class.class_time else [db_class.class_time, ""]
|
| 894 |
+
start_time = class_time_parts[0].strip() if len(class_time_parts) > 0 else ""
|
| 895 |
+
end_time = class_time_parts[1].strip() if len(class_time_parts) > 1 else ""
|
| 896 |
+
|
| 897 |
+
schedule = []
|
| 898 |
+
for day in days:
|
| 899 |
+
if day.strip():
|
| 900 |
+
schedule.append({
|
| 901 |
+
"day": day.strip(),
|
| 902 |
+
"start_time": start_time,
|
| 903 |
+
"end_time": end_time,
|
| 904 |
+
"time": f"{start_time}-{end_time}" if start_time and end_time else start_time or "",
|
| 905 |
+
})
|
| 906 |
+
|
| 907 |
+
if not schedule:
|
| 908 |
+
schedule = [{"day": "Monday", "start_time": "", "end_time": "", "time": ""}]
|
| 909 |
+
|
| 910 |
+
# Convert to dict for response
|
| 911 |
+
class_dict = {
|
| 912 |
+
"id": db_class.id,
|
| 913 |
+
"name": db_class.name,
|
| 914 |
+
"description": db_class.description,
|
| 915 |
+
"class_time": db_class.class_time,
|
| 916 |
+
"days_of_week": days,
|
| 917 |
+
"classes_per_week": db_class.classes_per_week,
|
| 918 |
+
"max_students": db_class.max_students,
|
| 919 |
+
"is_active": db_class.is_active,
|
| 920 |
+
"coach_email": db_class.coach_email,
|
| 921 |
+
"location": db_class.location,
|
| 922 |
+
"created_at": db_class.created_at,
|
| 923 |
+
"updated_at": db_class.updated_at,
|
| 924 |
+
"membership_plan_ids": membership_plan_ids,
|
| 925 |
+
"schedule": schedule,
|
| 926 |
+
}
|
| 927 |
+
return class_dict
|
| 928 |
|
| 929 |
|
| 930 |
@app.delete("/api/admin/classes/{class_id}", status_code=204)
|