feat: audit log time-range filter + script execution schedules
Audit log time-range filter:
- audit_log_repo.py: unified query() with action/admin_username/date_from/date_to
filters + total count; _build_filters() helper for date parsing
- settings.py GET /audit/: add date_from, date_to, admin_username query params
- audit.html: date range inputs (YYYY-MM-DD), admin filter input, action filter
expanded with optgroups (服务器/推送/脚本/认证/设置); clear filter button
Script execution schedules:
- domain/models: PushSchedule extended with schedule_type('push'|'script'),
script_id FK, script_content Text, exec_timeout int, long_task bool;
source_path made nullable
- migrations.py: 6 new ALTER TABLE statements (idempotent)
- schedule_runner.py: detect schedule_type; for 'script' type use ScriptService;
for 'push' type keep original SyncEngineV2 sync_files behaviour
- schemas.py: ScheduleCreate/Update add all new fields
- schedules.html: full UI rewrite
- type selector radio: 📁 文件推送 / ⚡ 脚本执行
- script fields: script library dropdown + textarea + timeout + long_task
- schedule list shows type badge + detail preview
- saveSched() validates required fields per type
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
+12
-6
@@ -288,18 +288,24 @@ audit_router = APIRouter(prefix="/api/audit", tags=["audit"])
|
||||
@audit_router.get("/", response_model=dict)
|
||||
async def list_audit_logs(
|
||||
action: Optional[str] = None,
|
||||
admin_username: Optional[str] = None,
|
||||
date_from: Optional[str] = None, # ISO date: YYYY-MM-DD or YYYY-MM-DDTHH:MM:SS
|
||||
date_to: Optional[str] = None,
|
||||
limit: int = 50,
|
||||
offset: int = 0,
|
||||
admin: Admin = Depends(get_current_admin),
|
||||
db: AsyncSession = Depends(get_db),
|
||||
):
|
||||
"""List audit logs with pagination"""
|
||||
"""List audit logs with pagination, action filter, admin filter, and date range."""
|
||||
repo = AuditLogRepositoryImpl(db)
|
||||
total = await repo.count(action)
|
||||
if action:
|
||||
logs = await repo.get_by_action(action, limit, offset)
|
||||
else:
|
||||
logs = await repo.get_recent(limit, offset)
|
||||
logs, total = await repo.query(
|
||||
action=action,
|
||||
admin_username=admin_username,
|
||||
date_from=date_from,
|
||||
date_to=date_to,
|
||||
limit=limit,
|
||||
offset=offset,
|
||||
)
|
||||
return {
|
||||
"total": total,
|
||||
"limit": limit,
|
||||
|
||||
Reference in New Issue
Block a user