fix: db.get_or_404 -> query.get_or_404 + rename to Palladium Monitor

- 修复删除快照时 AttributeError: SQLAlchemy.get_or_404 (低版本兼容)
- UI/标题/邮件主题从 'Palladium Z1 Monitor' 改为 'Palladium Monitor'
This commit is contained in:
Your Name
2026-07-08 14:46:18 +08:00
parent 89dc6b4449
commit 6726524c50
17 changed files with 46 additions and 46 deletions
+10 -10
View File
@@ -1,6 +1,6 @@
from typing import List, Dict, Tuple, Set, Any, Optional, Union
"""
mailer.py — Palladium Z1 每日报告邮件发送
mailer.py — Palladium 每日报告邮件发送
通过 SMTP 把"今日快照 + 24h 趋势"汇总发送到指定邮箱。
所有配置都从环境变量读 (生产建议用 systemd EnvironmentFile 或 .env)。
@@ -79,7 +79,7 @@ def _build_config_from_env() -> dict:
"smtp_use_tls": _bool("SMTP_USE_TLS", True),
"smtp_use_ssl": _bool("SMTP_USE_SSL", False),
"from_addr": os.environ.get("MAIL_FROM", "").strip(),
"from_name": os.environ.get("MAIL_FROM_NAME", "Palladium Z1 Monitor").strip(),
"from_name": os.environ.get("MAIL_FROM_NAME", "Palladium Monitor").strip(),
"to_addrs": [a.strip() for a in os.environ.get("MAIL_TO", "").split(",") if a.strip()],
"send_hour": _int_env("MAIL_SEND_HOUR", 9),
"send_minute": _int_env("MAIL_SEND_MINUTE", 0),
@@ -109,7 +109,7 @@ def _build_config_from_dict(raw: Dict[str, str]) -> dict:
"smtp_use_tls": _b("smtp_use_tls", True),
"smtp_use_ssl": _b("smtp_use_ssl", False),
"from_addr": _s("from_addr"),
"from_name": _s("from_name") or "Palladium Z1 Monitor",
"from_name": _s("from_name") or "Palladium Monitor",
"to_addrs": [a.strip() for a in _s("to_addrs").split(",") if a.strip()],
"send_hour": _i("send_hour", 9),
"send_minute": _i("send_minute", 0),
@@ -138,7 +138,7 @@ def save_config(data: dict) -> int:
"smtp_use_tls": str(data.get("smtp_use_tls", True)).lower(),
"smtp_use_ssl": str(data.get("smtp_use_ssl", False)).lower(),
"from_addr": str(data.get("from_addr", "")).strip(),
"from_name": str(data.get("from_name", "Palladium Z1 Monitor")).strip(),
"from_name": str(data.get("from_name", "Palladium Monitor")).strip(),
"to_addrs": to_addrs_str.strip(),
"send_hour": str(data.get("send_hour", 9)),
"send_minute": str(data.get("send_minute", 0)),
@@ -310,11 +310,11 @@ def _render_text(data: dict, base_url: str) -> str:
"""纯文本版本 (HTML 不支持时回退)。"""
latest = data["latest"]
if not latest:
return "Palladium Z1 Monitor — 当前无快照数据, 无法生成报告。\n"
return "Palladium Monitor — 当前无快照数据, 无法生成报告。\n"
lines = []
title_date = _fmt_ts(latest.timestamp, "%Y-%m-%d")
lines.append(f"Palladium Z1 每日报告 — {title_date}")
lines.append(f"Palladium 每日报告 — {title_date}")
lines.append("=" * 60)
lines.append(f"生成时间: {_fmt_ts(data['now_utc'])} UTC")
lines.append(f"快照时间: {_fmt_ts(latest.timestamp)}")
@@ -381,7 +381,7 @@ def _render_html(data: dict, base_url: str) -> str:
if not latest:
return (
'<html><body style="font-family:sans-serif;padding:20px">'
'<h2>Palladium Z1 Monitor</h2>'
'<h2>Palladium Monitor</h2>'
'<p>当前无快照数据, 无法生成报告。</p>'
'</body></html>'
)
@@ -475,7 +475,7 @@ def _render_html(data: dict, base_url: str) -> str:
<!-- Header -->
<div style="background:linear-gradient(135deg,#007bff,#0056b3);color:#fff;padding:24px 28px">
<h1 style="margin:0;font-size:22px">⚡ Palladium Z1 每日报告</h1>
<h1 style="margin:0;font-size:22px">⚡ Palladium 每日报告</h1>
<div style="margin-top:6px;opacity:0.9;font-size:14px">{title_date}</div>
</div>
@@ -532,7 +532,7 @@ def _render_html(data: dict, base_url: str) -> str:
<!-- Footer -->
<div style="background:#f8f9fa;padding:16px 28px;border-top:1px solid #e0e0e0;
font-size:12px;color:#888;text-align:center">
由 <a href="{base_url}/" style="color:#007bff;text-decoration:none">Palladium Z1 Monitor</a> 自动生成 ·
由 <a href="{base_url}/" style="color:#007bff;text-decoration:none">Palladium Monitor</a> 自动生成 ·
{_fmt_ts(data['now_utc'], '%Y-%m-%d %H:%M:%S')} UTC
</div>
@@ -552,7 +552,7 @@ def render_report(data: dict, cfg: dict) -> Tuple[str, str, str]:
else:
title_date = _fmt_ts(data["now_utc"], "%Y-%m-%d")
util = f"{latest.utilization:.1f}%" if latest else ""
subject = f"[Palladium Z1] 每日报告 {title_date} — 利用率 {util}"
subject = f"[Palladium] 每日报告 {title_date} — 利用率 {util}"
html = _render_html(data, cfg["monitor_base_url"])
text = _render_text(data, cfg["monitor_base_url"])
return subject, html, text