44
55from .base import BaseHandler
66from ..database import Class , LunchSchedule , Session
7+ from ..utils .dates import get_weekdays
78
89if typing .TYPE_CHECKING :
910 import datetime
@@ -17,38 +18,75 @@ class ScheduleHandler(BaseHandler):
1718
1819 @classmethod
1920 def routes (cls , bp : Blueprint , config : Config ) -> None :
21+ def _serialize_schedule (schedule : LunchSchedule , class_ : str ) -> dict [str , Any ]:
22+ return {
23+ "class" : class_ ,
24+ "date" : schedule .date .isoformat (),
25+ "time" : schedule .time .isoformat ("minutes" ) if schedule .time else None ,
26+ "location" : schedule .location ,
27+ "notes" : schedule .notes ,
28+ }
29+
30+ def _fetch_schedules_for_date (
31+ date : datetime .date ,
32+ classes : list [str ] | None = None ,
33+ ) -> list [dict [str , Any ]]:
34+ """Fetch lunch schedules for a specific date."""
35+
36+ query = (
37+ Session .query (LunchSchedule , Class .name )
38+ .join (Class )
39+ .filter (LunchSchedule .date == date )
40+ .order_by (LunchSchedule .time , LunchSchedule .class_ )
41+ )
42+
43+ if classes :
44+ query = query .filter (Class .name .in_ (classes ))
45+
46+ return [_serialize_schedule (model [0 ], model [1 ]) for model in query ]
47+
48+ def _fetch_schedules_for_week (
49+ weekdays : list [datetime .date ],
50+ classes : list [str ] | None = None ,
51+ ) -> dict [datetime .date , list [dict [str , Any ]]]:
52+ """Fetch lunch schedules for a specific week."""
53+
54+ query = (
55+ Session .query (LunchSchedule , Class .name )
56+ .join (Class )
57+ .filter (LunchSchedule .date .in_ (weekdays ))
58+ .order_by (LunchSchedule .time , LunchSchedule .class_ )
59+ )
60+
61+ if classes :
62+ query = query .filter (Class .name .in_ (classes ))
63+
64+ schedules : dict [datetime .date , list [dict [str , Any ]]] = {day : [] for day in weekdays }
65+
66+ for schedule , class_ in query .all ():
67+ schedules [schedule .date ].append (_serialize_schedule (schedule , class_ ))
68+
69+ return schedules
70+
2071 @bp .route ("/schedule/date/<date:date>" )
21- def get_lunch_schedule (date : datetime .date ) -> list [dict [str , Any ]]:
22- return [
23- {
24- "class" : model [1 ],
25- "date" : model [0 ].date .strftime ("%Y-%m-%d" ),
26- "time" : model [0 ].time .strftime ("%H:%M" ) if model [0 ].time else None ,
27- "location" : model [0 ].location ,
28- "notes" : model [0 ].notes ,
29- }
30- for model in (
31- Session .query (LunchSchedule , Class .name )
32- .join (Class )
33- .filter (LunchSchedule .date == date )
34- .order_by (LunchSchedule .time , LunchSchedule .class_ )
35- )
36- ]
72+ def get_date_schedule (date : datetime .date ) -> list [dict [str , Any ]]:
73+ return _fetch_schedules_for_date (date )
3774
3875 @bp .route ("/schedule/date/<date:date>/classes/<list:classes>" )
39- def get_lunch_schedule_for_classes (date : datetime .date , classes : list [str ]) -> list [dict [str , Any ]]:
40- return [
41- {
42- "class" : model [1 ],
43- "date" : model [0 ].date .strftime ("%Y-%m-%d" ),
44- "time" : model [0 ].time .strftime ("%H:%M" ) if model [0 ].time else None ,
45- "location" : model [0 ].location ,
46- "notes" : model [0 ].notes ,
47- }
48- for model in (
49- Session .query (LunchSchedule , Class .name )
50- .join (Class )
51- .filter (LunchSchedule .date == date , Class .name .in_ (classes ))
52- .order_by (LunchSchedule .time , LunchSchedule .class_ )
53- )
54- ]
76+ def get_date_schedule_for_classes (date : datetime .date , classes : list [str ]) -> list [dict [str , Any ]]:
77+ return _fetch_schedules_for_date (date , classes )
78+
79+ @bp .route ("/schedule/week/<date:date>" )
80+ def get_week_schedule (date : datetime .date ) -> list [list [dict [str , Any ]]]:
81+ weekdays = get_weekdays (date )
82+ schedules = _fetch_schedules_for_week (weekdays )
83+ return list (schedules .values ())
84+
85+ @bp .route ("/schedule/week/<date:date>/classes/<list:classes>" )
86+ def get_week_schedule_for_classes (
87+ date : datetime .date ,
88+ classes : list [str ],
89+ ) -> list [list [dict [str , Any ]]]:
90+ weekdays = get_weekdays (date )
91+ schedules = _fetch_schedules_for_week (weekdays , classes )
92+ return list (schedules .values ())
0 commit comments