Vastai-ConnectHub/app/admin/filters.py

58 lines
1.7 KiB
Python

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