From 1435653b0bc6dddc3276cc508aadff0dbb8f8593 Mon Sep 17 00:00:00 2001 From: Marsway Date: Tue, 13 Jan 2026 09:58:34 +0800 Subject: [PATCH] update --- app/admin/filters.py | 57 -------------------------------------------- app/admin/views.py | 31 ------------------------ app/tasks/execute.py | 42 ++++++++++++++++---------------- 3 files changed, 21 insertions(+), 109 deletions(-) delete mode 100644 app/admin/filters.py diff --git a/app/admin/filters.py b/app/admin/filters.py deleted file mode 100644 index ef2e564..0000000 --- a/app/admin/filters.py +++ /dev/null @@ -1,57 +0,0 @@ -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 - diff --git a/app/admin/views.py b/app/admin/views.py index e27a4ac..9cc6158 100644 --- a/app/admin/views.py +++ b/app/admin/views.py @@ -8,11 +8,9 @@ from zoneinfo import ZoneInfo from croniter import croniter from markupsafe import Markup from sqladmin import ModelView, action -from sqladmin.filters import BooleanFilter, OperationColumnFilter, StaticValuesFilter from sqladmin.models import Request from starlette.responses import RedirectResponse -from app.admin.filters import RecentDateTimeFilter from app.db.models import Job, JobLog from app.plugins.manager import load_job_class from app.security.fernet import encrypt_json @@ -77,16 +75,6 @@ class JobAdmin(ModelView, model=Job): # 列表页模板:加入每行 Run Now list_template = "job_list.html" - # 搜索 - column_searchable_list = [Job.id, Job.handler_path, Job.cron_expr] - - # 筛选 - column_filters = [ - BooleanFilter(Job.enabled), - OperationColumnFilter(Job.handler_path), - RecentDateTimeFilter(Job.created_at, title="创建时间", parameter_name="created_at_recent"), - ] - # 编辑页排除 secret_cfg,避免回显密文;由自定义模板额外渲染一个空输入框 # 注意:SQLAdmin 这里需要字段名字符串(不是 SQLAlchemy Column 对象) form_edit_rules = ["id", "enabled", "cron_expr", "handler_path", "public_cfg"] @@ -226,25 +214,6 @@ class JobLogAdmin(ModelView, model=JobLog): # 为 JobLog 详情页单独指定模板(用于加入 Retry 按钮) details_template = "joblog_details.html" - # 搜索 - column_searchable_list = [JobLog.job_id, JobLog.message, JobLog.celery_task_id] - - # 筛选 - column_filters = [ - StaticValuesFilter( - JobLog.status, - values=[ - ("RUNNING", "运行中"), - ("SUCCESS", "成功"), - ("FAILURE", "失败"), - ("RETRY", "重试"), - ], - title="状态", - ), - OperationColumnFilter(JobLog.attempt), - RecentDateTimeFilter(JobLog.started_at, title="开始时间", parameter_name="started_at_recent"), - ] - column_labels = { "id": "日志ID", "job_id": "任务ID", diff --git a/app/tasks/execute.py b/app/tasks/execute.py index 74f8ecb..44217eb 100644 --- a/app/tasks/execute.py +++ b/app/tasks/execute.py @@ -169,30 +169,30 @@ def execute_job(self, job_id: str | None = None, snapshot_params: dict[str, Any] ) else: if not snapshot: - snapshot = snapshot_params or { - "job_id": job_id, - "handler_path": handler_path if "handler_path" in locals() else "", - "public_cfg": public_cfg if "public_cfg" in locals() else {}, - "secret_cfg": secret_token if "secret_token" in locals() else "", - "meta": { - "trigger": "celery", + snapshot = snapshot_params or { + "job_id": job_id, + "handler_path": handler_path if "handler_path" in locals() else "", + "public_cfg": public_cfg if "public_cfg" in locals() else {}, + "secret_cfg": secret_token if "secret_token" in locals() else "", + "meta": { + "trigger": "celery", "celery_task_id": celery_task_id, - "started_at": started_at.isoformat(), - }, - } - crud.create_job_log( - session, - job_id=str(job_id or ""), - status=status, - snapshot_params=snapshot, - message=message, - traceback=traceback, - run_log=run_log_text, + "started_at": started_at.isoformat(), + }, + } + crud.create_job_log( + session, + job_id=str(job_id or ""), + status=status, + snapshot_params=snapshot, + message=message, + traceback=traceback, + run_log=run_log_text, celery_task_id=celery_task_id, attempt=attempt, - started_at=started_at, - finished_at=finished_at, - ) + started_at=started_at, + finished_at=finished_at, + ) session.close() return {"status": status.value, "job_id": job_id, "result": result, "message": message}