1877fc0000
- Move `import os` to top-level in app/views/backup.py - Fix docstring in BackupRecord model to remove non-existent 'location' field - Replace browser confirm() dialogs with accessible modal dialog (role=dialog, aria-modal, aria-labelledby) - Add csrfToken() helper that validates token presence instead of silently falling back to empty string - Fix aria-live region to remain in DOM (screen-reader friendly) rather than using x-show - Add Backup & Restore section to docs/ConfigurationGuide.md with retention table - Add backup env vars to .env.demo with comments Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com>
58 lines
2.0 KiB
Python
58 lines
2.0 KiB
Python
"""
|
||
Backup management dashboard view – admin only.
|
||
"""
|
||
|
||
import logging
|
||
import os
|
||
|
||
from fastapi import Depends, HTTPException, Request, status
|
||
from sqlalchemy.orm import Session
|
||
|
||
from app.config import settings
|
||
from app.models import BackupRecord
|
||
from app.views.base import APIRouter, get_db, require_login, templates
|
||
from app.views.settings import require_admin_access
|
||
|
||
logger = logging.getLogger(__name__)
|
||
router = APIRouter()
|
||
|
||
|
||
@router.get("/admin/backup")
|
||
@require_login
|
||
@require_admin_access
|
||
async def backup_dashboard(request: Request, db: Session = Depends(get_db)):
|
||
"""Backup management dashboard – admin only."""
|
||
try:
|
||
records = db.query(BackupRecord).order_by(BackupRecord.created_at.desc()).limit(500).all()
|
||
|
||
# Summarise counts per tier
|
||
counts: dict[str, int] = {"hourly": 0, "daily": 0, "weekly": 0}
|
||
for r in records:
|
||
if r.backup_type in counts:
|
||
counts[r.backup_type] += 1
|
||
|
||
# Compute total local size
|
||
total_size = sum(r.size_bytes for r in records if r.local_path and os.path.exists(r.local_path))
|
||
|
||
return templates.TemplateResponse(
|
||
"backup.html",
|
||
{
|
||
"request": request,
|
||
"records": records,
|
||
"counts": counts,
|
||
"total_size": total_size,
|
||
"backup_enabled": getattr(settings, "backup_enabled", True),
|
||
"backup_remote_destination": getattr(settings, "backup_remote_destination", None),
|
||
"backup_retain_hourly": getattr(settings, "backup_retain_hourly", 96),
|
||
"backup_retain_daily": getattr(settings, "backup_retain_daily", 21),
|
||
"backup_retain_weekly": getattr(settings, "backup_retain_weekly", 13),
|
||
"app_version": settings.version,
|
||
},
|
||
)
|
||
except Exception as e:
|
||
logger.error(f"Error loading backup dashboard: {e}")
|
||
raise HTTPException(
|
||
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
||
detail="Failed to load backup dashboard",
|
||
)
|