From 0882dd3986608f9d7bbb56bb34a561d35119dbbd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E4=BD=B3=E6=81=A9?= Date: Fri, 30 Oct 2026 18:04:47 +0800 Subject: [PATCH] =?UTF-8?q?fix(audit):=20=E5=AE=89=E6=8E=92=E4=BB=A3?= =?UTF-8?q?=E5=B0=8E=E7=9A=84=E6=93=8D=E4=BD=9C=E7=B4=80=E9=8C=84=E5=AF=AB?= =?UTF-8?q?=E5=87=BA=E4=BB=A3=E5=B0=8E=E8=80=81=E5=B8=AB=E5=90=8D=E5=AD=97?= =?UTF-8?q?;=E7=99=BC=E5=B8=83=20v1.4.3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit handler 是 selectin 預先載入的,只改 handler_teacher_id 時同一個請求裡 cover.handler 還是舊值,紀錄寫成「由 代導」。改為直接設關聯。 Co-Authored-By: Claude Opus 5.5 --- .env.example | 2 +- CHANGELOG.md | 14 +++++++++++++- README.md | 6 +++--- backend/app/services/homeroom_covers.py | 6 ++++-- backend/tests/test_homeroom_cover.py | 16 ++++++++++++++++ docs/deploy/upgrade.html | 6 +++--- docs/deploy/upgrade.md | 4 ++-- docs/features.html | 9 +++++---- docs/index.html | 2 +- docs/roadmap.html | 5 +++++ docs/roadmap.md | 1 + 11 files changed, 54 insertions(+), 17 deletions(-) diff --git a/.env.example b/.env.example index 46465de..37155b1 100644 --- a/.env.example +++ b/.env.example @@ -32,7 +32,7 @@ HTTP_PORT=80 # ── 預建映像版本(僅「拉取映像」部署方式需要)────────── # 用 docker compose pull 拉官方映像時,決定要拉哪一版。 # 預設 latest(最新);正式部署建議釘選版本號以利可控升級,例如: -# IMAGE_TAG=v1.4.2 +# IMAGE_TAG=v1.4.3 # 若你是從原始碼 docker compose up -d 自行建置,此項可忽略。 IMAGE_TAG=latest diff --git a/CHANGELOG.md b/CHANGELOG.md index 4ea73d4..30bfa66 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,10 +4,22 @@ 破壞性變更(需人工介入才能升級)以 ⚠️ 標註。 -> **新使用者請直接安裝 v1.4.2**(見 [README](README.md) 快速開始)。v1.0.0 ~ v1.4.1 是先前版本;以下條目保留作為變更紀錄。 +> **新使用者請直接安裝 v1.4.3**(見 [README](README.md) 快速開始)。v1.0.0 ~ v1.4.2 是先前版本;以下條目保留作為變更紀錄。 ## [Unreleased] +## [1.4.3] — 2026-10-30 + +**操作紀錄寫出代導老師的名字。** 安排代導後,「系統管理 → 操作紀錄」那一筆寫成「由 代導」,老師的名字是空的(v1.4.0 起)。只影響操作紀錄這一行字;代導資料、通知、代導通知單與月結統計一直都正確。 + +功能與資料表都沒有其他變動,照一般方式升級即可(`.env` 改 `IMAGE_TAG=v1.4.3` → `docker compose pull && docker compose up -d`)。 + +官方映像(amd64 + arm64 雙架構)已發布於 GHCR: +`ghcr.io/begin0808/course_scheduling_system-{api,worker,web}:v1.4.3` + +### 修正 +- 安排代導的操作紀錄寫出代導老師是誰(例如「王師 請假,701 2026-11-16 由 陳師 代導」)。已經寫入的舊紀錄不會回頭補上名字。 + ## [1.4.2] — 2026-10-30 **事後才登記的請假,可以補登代課了。** 來自 LINE 社群一位組長:臨時找人代課,當天來不及在系統登記,事後才把公假補進去;這時節次已經過了,畫面上一直是「待處理」,按「處理」只會回「此節次已結束,無法變更處置」,代課老師的鐘點也就漏算。 diff --git a/README.md b/README.md index 09befc4..7070c7b 100644 --- a/README.md +++ b/README.md @@ -132,11 +132,11 @@ docker compose up -d # 首次會建置映像,需數分鐘 ## 專案狀態 -**v1.4.2 已發行(2026-10-30)。** 六大里程碑 M0–M5 全部完成,功能齊備並經完整驗收(後端 718 項單元/整合測試、57 項 Playwright 端對端測試涵蓋全部 20 個頁面,每次提交皆對真實 Docker 全棧跑過)。官方映像(amd64 + arm64)已發布於 GHCR。 +**v1.4.3 已發行(2026-10-30)。** 六大里程碑 M0–M5 全部完成,功能齊備並經完整驗收(後端 719 項單元/整合測試、57 項 Playwright 端對端測試涵蓋全部 20 個頁面,每次提交皆對真實 Docker 全棧跑過)。官方映像(amd64 + arm64)已發布於 GHCR。 -v1.4.2 可以**補登**事後才登記的請假(已經過去的節次補登代課,不通知老師、列入鐘點統計);v1.4.1 起改採 **AGPL-3.0 授權**(見下方「授權」;功能與資料都沒有變動);v1.4.0 新增**代導**(導師請假當天由誰代他帶班,當天沒課也算、半天也算;可印代導通知單,月結分開記全天與半天天數;⚠️ 資料表結構變更,升級前會自動備份);v1.3.5 修正**併班**選不到老師(改列出這一節正在上課的老師),調課單加上記號說明;v1.3.4 讓跑班群組、導師、任教科目等下拉選單都能**打字搜尋**;v1.3.3 的儀表板新增**即時概況**(現在這一節各班在上什麼課、誰在上,已套用當天的調代課);v1.3.2 新增**重設管理員密碼**的指令(忘了密碼或第一次就登不進去時,不必刪資料或還原備份);v1.3.1 新增**帳號管理**(系統管理員可設定教學組長、教務主任的帳號);v1.3.0 支援**單雙週課程**(同一節單週、雙週輪流上不同的課,排課、請假代課、調課、巡堂表、鐘點都分單雙週;⚠️ 首次改動資料表結構,升級前請先備份);v1.2.19 支援**日薪代課**(國小常見:月結統計把鐘點與日薪分開列)並可**整批指派代課**(整張假單或整天一次派給同一位老師);v1.2.18 可**檢查課表**(發布前列出衝堂、教師不可排時段等衝突;事後修改不可排時段時當場提示已排的課);v1.2.17 修正登入按一次送出兩筆請求(輸錯密碼約第 3 次就被鎖定);v1.2.15、v1.2.16 修正跑班群組的兩個問題(同一位老師在群組裡重複配課時自動排課會排出撞課的課表;同一格有多筆同科目配課時,手動排課把每日節數重複計算);v1.2.12~v1.2.14 可列印**巡堂表**並匯出 Excel(依當天的調代課結果產生,社團另出分組巡堂單);v1.2.10、v1.2.11 讓**國中小、完全中學**跨部上課的老師,課表與通知單都標出實際上課時間,兩部節數不同(國中七節、高中八節)也不會漏課;v1.2.9 可一次匯出**全校教師課表**(總表與批次打包);v1.2.8 可用 Excel **批次更新既有教師**(新學年職務異動),並能**停用/啟用教師登入帳號**(離職教師保留歷史紀錄又進不來);v1.2.7 補上**學期起訖日期**的填寫與修改(先前畫面上無處可填,導致請假被擋);v1.2.6 修掉第一批外部使用者回報的三個問題(教師帳號首次登入卡死、無法事後補開教師帳號、未排課務清單過長時拖不動),並可在畫面上自行修改與重設密碼;v1.2.5 可列印**教師代課通知單與班級代課通知單**(照學校紙本格式,代課時可選計費方式);v1.2.4 的調代課處理會寫出處置方式(代課或調課、哪天補課);v1.2.3 起系統會顯示目前版本,並在有新版時提醒系統管理員(只提醒、不自動升級);v1.2.2 可列印**教師調課通知單與班級調課通知單**(照學校紙本格式);v1.2.1 補上**調課**的操作畫面——請假(含研習)的節次可直接列出雙方都有空的對調節次,支援跨週(最多四週)與連堂,補課日也會出現在今日看板。v1.2.0 起另有**一鍵示範資料**,裝好後兩分鐘內就能看到一張排好的全校課表。 +v1.4.3 修正安排代導時操作紀錄沒寫出老師名字;v1.4.2 可以**補登**事後才登記的請假(已經過去的節次補登代課,不通知老師、列入鐘點統計);v1.4.1 起改採 **AGPL-3.0 授權**(見下方「授權」;功能與資料都沒有變動);v1.4.0 新增**代導**(導師請假當天由誰代他帶班,當天沒課也算、半天也算;可印代導通知單,月結分開記全天與半天天數;⚠️ 資料表結構變更,升級前會自動備份);v1.3.5 修正**併班**選不到老師(改列出這一節正在上課的老師),調課單加上記號說明;v1.3.4 讓跑班群組、導師、任教科目等下拉選單都能**打字搜尋**;v1.3.3 的儀表板新增**即時概況**(現在這一節各班在上什麼課、誰在上,已套用當天的調代課);v1.3.2 新增**重設管理員密碼**的指令(忘了密碼或第一次就登不進去時,不必刪資料或還原備份);v1.3.1 新增**帳號管理**(系統管理員可設定教學組長、教務主任的帳號);v1.3.0 支援**單雙週課程**(同一節單週、雙週輪流上不同的課,排課、請假代課、調課、巡堂表、鐘點都分單雙週;⚠️ 首次改動資料表結構,升級前請先備份);v1.2.19 支援**日薪代課**(國小常見:月結統計把鐘點與日薪分開列)並可**整批指派代課**(整張假單或整天一次派給同一位老師);v1.2.18 可**檢查課表**(發布前列出衝堂、教師不可排時段等衝突;事後修改不可排時段時當場提示已排的課);v1.2.17 修正登入按一次送出兩筆請求(輸錯密碼約第 3 次就被鎖定);v1.2.15、v1.2.16 修正跑班群組的兩個問題(同一位老師在群組裡重複配課時自動排課會排出撞課的課表;同一格有多筆同科目配課時,手動排課把每日節數重複計算);v1.2.12~v1.2.14 可列印**巡堂表**並匯出 Excel(依當天的調代課結果產生,社團另出分組巡堂單);v1.2.10、v1.2.11 讓**國中小、完全中學**跨部上課的老師,課表與通知單都標出實際上課時間,兩部節數不同(國中七節、高中八節)也不會漏課;v1.2.9 可一次匯出**全校教師課表**(總表與批次打包);v1.2.8 可用 Excel **批次更新既有教師**(新學年職務異動),並能**停用/啟用教師登入帳號**(離職教師保留歷史紀錄又進不來);v1.2.7 補上**學期起訖日期**的填寫與修改(先前畫面上無處可填,導致請假被擋);v1.2.6 修掉第一批外部使用者回報的三個問題(教師帳號首次登入卡死、無法事後補開教師帳號、未排課務清單過長時拖不動),並可在畫面上自行修改與重設密碼;v1.2.5 可列印**教師代課通知單與班級代課通知單**(照學校紙本格式,代課時可選計費方式);v1.2.4 的調代課處理會寫出處置方式(代課或調課、哪天補課);v1.2.3 起系統會顯示目前版本,並在有新版時提醒系統管理員(只提醒、不自動升級);v1.2.2 可列印**教師調課通知單與班級調課通知單**(照學校紙本格式);v1.2.1 補上**調課**的操作畫面——請假(含研習)的節次可直接列出雙方都有空的對調節次,支援跨週(最多四週)與連堂,補課日也會出現在今日看板。v1.2.0 起另有**一鍵示範資料**,裝好後兩分鐘內就能看到一張排好的全校課表。 -**請直接從最新版開始安裝**(見上方快速開始);`v1.4.2` 是目前建議使用的版本。各版變更見 [CHANGELOG](CHANGELOG.md),開發歷程見 [docs/tasks.md](docs/tasks.md)。 +**請直接從最新版開始安裝**(見上方快速開始);`v1.4.3` 是目前建議使用的版本。各版變更見 [CHANGELOG](CHANGELOG.md),開發歷程見 [docs/tasks.md](docs/tasks.md)。 系統仍在實際校園環境試用中,若你是第一批使用者,歡迎加入 [LINE 社群](https://line.me/ti/g2/hP0Lg7mqvE5rvWg0sE9MHI-QsLkd94Cfp3wKcg) 或透過 [Issues](https://github.com/begin0808/Course_Scheduling_System/issues) 回報任何問題。 diff --git a/backend/app/services/homeroom_covers.py b/backend/app/services/homeroom_covers.py index e29dd24..f934b2f 100644 --- a/backend/app/services/homeroom_covers.py +++ b/backend/app/services/homeroom_covers.py @@ -167,7 +167,9 @@ def _set(db: Session, cover: HomeroomCover, handler: Teacher | None, actor_name: _notify_cancelled(db, cover, previous, actor_name) cover.status = AffectedStatus.resolved.value cover.no_cover = handler is None - cover.handler_teacher_id = handler.id if handler else None + # 設關聯而不是只設 id:handler 是 selectin 預先載入的,只改 id 的話同一個請求裡 + # cover.handler 還是舊值(操作紀錄曾因此寫成「由 代導」,名字空白) + cover.handler = handler cover.assigned_by_name = actor_name # 補登(那天已經過了)不通知:老師已經代導過了 if handler is not None and previous != handler.id and not leaves.cover_is_past(cover.date): @@ -238,7 +240,7 @@ def clear(db: Session, cover: HomeroomCover, *, actor_name: str) -> None: _notify_cancelled(db, cover, cover.handler_teacher_id, actor_name) cover.status = AffectedStatus.pending.value cover.no_cover = False - cover.handler_teacher_id = None + cover.handler = None cover.assigned_by_name = "" db.flush() diff --git a/backend/tests/test_homeroom_cover.py b/backend/tests/test_homeroom_cover.py index 52a090c..4fc9fd9 100644 --- a/backend/tests/test_homeroom_cover.py +++ b/backend/tests/test_homeroom_cover.py @@ -342,3 +342,19 @@ def test_leave_time_window_values_are_kept(env2): # noqa: F811 cover = w.db.scalar(select(HomeroomCover)) assert (cover.from_time, cover.to_time) == (time(10, 0), time(14, 0)) assert cover.part_label == "10:00~14:00" + + +def test_audit_log_names_the_cover_teacher(env2): # noqa: F811 + """操作紀錄要寫出代導老師是誰(v1.4.0~v1.4.2 寫成「由 代導」,名字空白)。""" + from app.models.audit import AuditLog + + w = env2 + w.teacher("王師") + w.teacher("陳師") + _homeroom(w, "701", "王師") + cover_id = _leave(w, "王師", MON)["homeroom_covers"][0]["id"] + _assign(w, cover_id, handler_teacher_id=w.teachers["陳師"]) + detail = w.db.scalars(select(AuditLog).where( + AuditLog.action == "assign_homeroom_cover")).all()[-1].detail + assert detail.endswith("由 陳師 代導"), detail + diff --git a/docs/deploy/upgrade.html b/docs/deploy/upgrade.html index 42a707a..358d2ae 100644 --- a/docs/deploy/upgrade.html +++ b/docs/deploy/upgrade.html @@ -172,7 +172,7 @@ 路線圖開發用 開發任務卡開發用 -
本頁目錄
+
本頁目錄
@@ -189,8 +189,8 @@

升級指南

開始前先備份。 升級本身不會刪資料,但任何重大操作前留一份備份是好習慣。到「系統管理 → 資料備份與還原 → 立即備份」,或見備份指南。

-

升級到 v1.4.2:可以補登事後才登記的請假

-

v1.4.2 沒有資料表變更,照下方方式 A 或方式 B 一般升級即可。

+

升級到 v1.4.2、v1.4.3:可以補登事後才登記的請假

+

v1.4.2(補登)與 v1.4.3(操作紀錄修正)都沒有資料表變更,照下方方式 A 或方式 B 一般升級即可。

升級到 v1.4.1:授權改為 AGPL-3.0

v1.4.1 只改了授權(由 MIT 改為 AGPL-3.0),並在登入頁與側邊欄加上「原始碼」連結。功能與資料表都沒有變動, 照下方方式 A 或方式 B 一般升級即可;從 v1.3.x 或更早的版本升上來,一樣會經過 v1.4.0 的資料表變更(會先自動備份)。

diff --git a/docs/deploy/upgrade.md b/docs/deploy/upgrade.md index 42e995a..2821798 100644 --- a/docs/deploy/upgrade.md +++ b/docs/deploy/upgrade.md @@ -6,9 +6,9 @@ > **開始前先備份。** 升級本身不會刪資料,但任何重大操作前留一份備份是好習慣。到「系統管理 → 資料備份與還原 → 立即備份」,或見[備份指南](backup.md)。 -## 升級到 v1.4.2:可以補登事後才登記的請假 +## 升級到 v1.4.2、v1.4.3:可以補登事後才登記的請假 -v1.4.2 沒有資料表變更,照下方方式 A 或方式 B 一般升級即可。 +v1.4.2(補登)與 v1.4.3(操作紀錄修正)都沒有資料表變更,照下方方式 A 或方式 B 一般升級即可。 ## 升級到 v1.4.1:授權改為 AGPL-3.0 diff --git a/docs/features.html b/docs/features.html index 77332df..4d95e27 100644 --- a/docs/features.html +++ b/docs/features.html @@ -3,7 +3,7 @@ - + 功能總覽 · 排課與調代課系統