Moodle 資料流¶
回到 資料流索引
[!NOTE] Moodle 是唯一保留完整三層 DDD(Raw → Internal → Read)的整合模組。 因為 Moodle API 回傳的資料結構遠比 Google 複雜,需要更多中間處理。
層級結構¶
| 層 | 檔案 | 主要類別/函數 |
|---|---|---|
| Raw | models_raw.py | RawEvent, RawCalendarData, RawCourse, RawDay 等 |
| Internal | models_internal.py | MoodleEvent, MoodleResult, AcademicCourse |
| Read | models_read.py | MoodleEventRead, CourseCatalog |
| Core | async_core.py | scrape_moodle_events(), fetch_events_by_range() |
| TOON | models_read.py | to_toon_moodle(), to_toon_moodle_event() |
| MCP | other_tools.py | get_moodle_events() |
轉換函數詳解¶
MoodleEvent.from_raw(raw: RawEvent) → MoodleEvent¶
- 輸入:
RawEventPydantic Model(來自 Moodle AJAX 回應) - 做了什麼:
- 將 UNIX timestamp (
timestart) 轉為 UTC+8datetime - 用
_clean_html()清除 HTML 標籤(<p>,<br>,<a>等) - 從
activityname擷取 Open/Close/Cutoff 時間資訊 - 從
course.fullname解析學期、課程代碼
MoodleEventRead.from_internal(event: MoodleEvent, course_idx: str) → MoodleEventRead¶
- 輸入:
MoodleEvent+ 外部生成的課程索引(c1,c2) - 做了什麼:
- 計算語意化
status(Open/Closed/Not yet open/Overdue (Grace period)) - 截斷
description至 200 字元 - 解析
semester("114學年度 第 1 學期"→"114-1") - 條件式欄位:僅在
Not yet open時填入open_date
to_toon_moodle_event(event: MoodleEventRead) → dict¶
- 做了什麼:將單一事件壓縮為
{title, description, cid, status, due_d, due_wd, due_hm}格式
to_toon_moodle(events, course_catalog) → dict¶
- 輸入:
List[MoodleEventRead]+List[CourseCatalog] - 做了什麼:
- 建立課程索引表
[{cid: "c1", course: "..."}] - 按
semester→month雙層分組 - 過濾空列表以節省 Token
- 回傳
{course_index, semester: {"114-1": {"2025-11": {due: [...]}}}}結構