跳轉到

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

  • 輸入RawEvent Pydantic Model(來自 Moodle AJAX 回應)
  • 做了什麼
  • 將 UNIX timestamp (timestart) 轉為 UTC+8 datetime
  • _clean_html() 清除 HTML 標籤(<p>, <br>, <a> 等)
  • activityname 擷取 Open/Close/Cutoff 時間資訊
  • course.fullname 解析學期、課程代碼

MoodleEventRead.from_internal(event: MoodleEvent, course_idx: str) → MoodleEventRead

  • 輸入MoodleEvent + 外部生成的課程索引(c1, c2
  • 做了什麼
  • 計算語意化 statusOpen/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: "..."}]
  • semestermonth 雙層分組
  • 過濾空列表以節省 Token
  • 回傳 {course_index, semester: {"114-1": {"2025-11": {due: [...]}}}} 結構