from __future__ import annotations from datetime import datetime, timedelta from typing import Any class RecentDateTimeFilter: """ 最近时间范围筛选(用于 started_at/created_at 等 DateTime 列): - all / 1h / 24h / 7d / 30d SQLAdmin 自定义 ColumnFilter 约定: - 必须提供 title / parameter_name - 必须实现 lookups(request, model) 与 get_filtered_query(query, value) """ def __init__(self, column: Any, *, title: str, parameter_name: str) -> None: self.column = column self.title = title self.parameter_name = parameter_name def lookups(self, request, model) -> list[tuple[str, str]]: # noqa: ARG002 return [ ("all", "全部"), ("1h", "最近1小时"), ("24h", "最近24小时"), ("7d", "最近7天"), ("30d", "最近30天"), ] def get_filtered_query(self, query, value): # type: ignore[no-untyped-def] if not value or value == "all": return query now = datetime.utcnow() delta: timedelta | None = None if value == "1h": delta = timedelta(hours=1) elif value == "24h": delta = timedelta(hours=24) elif value == "7d": delta = timedelta(days=7) elif value == "30d": delta = timedelta(days=30) if delta is None: return query threshold = now - delta # 兼容 SQLAlchemy Query / Select 两种风格 if hasattr(query, "where"): return query.where(self.column >= threshold) if hasattr(query, "filter"): return query.filter(self.column >= threshold) return query