fix: sanitize import job summaries
Some checks failed
CD Pipeline / deploy (push) Has been cancelled
Some checks failed
CD Pipeline / deploy (push) Has been cancelled
This commit is contained in:
@@ -73,11 +73,50 @@ def humanize_import_error(message: Any) -> str:
|
||||
return compact[:180] + ("…" if len(compact) > 180 else "")
|
||||
|
||||
|
||||
def _public_import_summary(raw_summary: Any) -> Optional[Dict[str, Any]]:
|
||||
"""Return an operator-facing import summary without table names or SQL sync internals."""
|
||||
if not raw_summary:
|
||||
return None
|
||||
|
||||
summary = raw_summary
|
||||
if isinstance(raw_summary, str):
|
||||
try:
|
||||
summary = json.loads(raw_summary)
|
||||
except Exception:
|
||||
return {"message": "匯入摘要暫時無法解析,請以任務狀態為準。"}
|
||||
|
||||
if not isinstance(summary, dict):
|
||||
return None
|
||||
|
||||
sync_success = summary.get("sync_success")
|
||||
public = {
|
||||
"message": summary.get("message") or "匯入任務已完成。",
|
||||
"imported_count": summary.get("imported_count"),
|
||||
"verified": bool(summary.get("verified")),
|
||||
"date_min": summary.get("date_min"),
|
||||
"date_max": summary.get("date_max"),
|
||||
"source_sheet": summary.get("source_sheet"),
|
||||
"source_header_row": summary.get("source_header_row"),
|
||||
}
|
||||
if sync_success is True:
|
||||
public["sync_status"] = "已更新業績分析儀表板"
|
||||
elif sync_success is False:
|
||||
public["sync_status"] = "業績分析儀表板同步未完成"
|
||||
public["sync_error_message"] = humanize_import_error(summary.get("sync_error"))
|
||||
else:
|
||||
public["sync_status"] = ""
|
||||
|
||||
return {key: value for key, value in public.items() if value not in (None, "")}
|
||||
|
||||
|
||||
def _public_import_job_payload(job: ImportJob) -> Dict[str, Any]:
|
||||
payload = job.to_dict()
|
||||
display_error = humanize_import_error(payload.get("error_message"))
|
||||
payload["error_message"] = display_error
|
||||
payload["display_error_message"] = display_error
|
||||
payload["import_summary"] = _public_import_summary(payload.get("import_summary"))
|
||||
payload.pop("drive_file_id", None)
|
||||
payload.pop("local_file_path", None)
|
||||
return payload
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user