From 59c3dfb91062f2f5b1a8cd6c35625eebf2a82f8c Mon Sep 17 00:00:00 2001 From: OG T Date: Mon, 6 Apr 2026 12:19:23 +0800 Subject: [PATCH] =?UTF-8?q?fix(models):=20approval.py=20=E6=94=B9=E7=94=A8?= =?UTF-8?q?=20timezone.utc=20=E7=9B=B8=E5=AE=B9=20Python=203.10?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CI runner 用 Python 3.10,datetime.UTC 是 3.11 才加入。 改用 datetime.timezone.utc 全版本相容,修復 CI type-sync 全量失敗。 # 2026-04-06 ogt: root cause — CI Python 3.10 無法 import UTC Co-Authored-By: Claude Sonnet 4.6 --- apps/api/src/models/approval.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/api/src/models/approval.py b/apps/api/src/models/approval.py index 8a37abc5..182cf4b6 100644 --- a/apps/api/src/models/approval.py +++ b/apps/api/src/models/approval.py @@ -10,7 +10,7 @@ Features: - Pydantic 強型別驗證 """ -from datetime import UTC, datetime +from datetime import datetime, timezone from enum import Enum from uuid import UUID, uuid4 @@ -106,7 +106,7 @@ class Signature(BaseModel): id: UUID = Field(default_factory=uuid4) signer_id: str = Field(..., description="簽核者 ID") signer_name: str = Field(..., description="簽核者名稱") - signed_at: datetime = Field(default_factory=lambda: datetime.now(UTC)) + signed_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc)) comment: str | None = None # Phase 5.4.5: Telegram 審計軌跡 @@ -153,14 +153,14 @@ class ApprovalRequest(ApprovalRequestBase): status: ApprovalStatus = Field(default=ApprovalStatus.PENDING) required_signatures: int = Field(..., description="所需簽核數") signatures: list[Signature] = Field(default_factory=list) - created_at: datetime = Field(default_factory=lambda: datetime.now(UTC)) - updated_at: datetime = Field(default_factory=lambda: datetime.now(UTC)) + created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc)) + updated_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc)) resolved_at: datetime | None = Field(default=None, description="解決時間") rejection_reason: str | None = Field(default=None) # 戰略 B: 告警風暴收斂 fingerprint: str | None = Field(default=None, description="告警指紋 Hash") hit_count: int = Field(default=1, description="聚合觸發次數") - last_seen_at: datetime = Field(default_factory=lambda: datetime.now(UTC), description="最後觸發時間") + last_seen_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc), description="最後觸發時間") # 2026-04-06 ogt: 關聯 Incident — 萃取 Playbook 與 KM 寫入必須知道 incident_id incident_id: str | None = Field(default=None, description="關聯的 Incident ID")