| | |
| | """ |
| | Progress tracking via file-based status updates |
| | Allows background processing while UI stays responsive |
| | """ |
| | import json |
| | import os |
| | from pathlib import Path |
| | from typing import Optional |
| |
|
| | PROGRESS_FILE = "/tmp/processing_status.json" |
| |
|
| | def init_progress(): |
| | """Initialize progress tracking""" |
| | status = { |
| | "active": False, |
| | "message": "", |
| | "progress": 0, |
| | "stage": "", |
| | "error": None, |
| | "complete": False |
| | } |
| | with open(PROGRESS_FILE, "w") as f: |
| | json.dump(status, f) |
| |
|
| | def update_progress(message: str, progress: int = None, stage: str = None): |
| | """Update progress status""" |
| | try: |
| | if os.path.exists(PROGRESS_FILE): |
| | with open(PROGRESS_FILE, "r") as f: |
| | status = json.load(f) |
| | else: |
| | status = {"active": True, "message": "", "progress": 0, "stage": "", "error": None, "complete": False} |
| | |
| | status["message"] = message |
| | status["active"] = True |
| | if progress is not None: |
| | status["progress"] = progress |
| | if stage is not None: |
| | status["stage"] = stage |
| | |
| | with open(PROGRESS_FILE, "w") as f: |
| | json.dump(status, f) |
| | except Exception: |
| | pass |
| |
|
| | def mark_complete(success: bool = True, error: str = None): |
| | """Mark processing as complete""" |
| | try: |
| | if os.path.exists(PROGRESS_FILE): |
| | with open(PROGRESS_FILE, "r") as f: |
| | status = json.load(f) |
| | else: |
| | status = {} |
| | |
| | status["active"] = False |
| | status["complete"] = True |
| | status["progress"] = 100 if success else status.get("progress", 0) |
| | if error: |
| | status["error"] = error |
| | |
| | with open(PROGRESS_FILE, "w") as f: |
| | json.dump(status, f) |
| | except Exception: |
| | pass |
| |
|
| | def get_progress() -> dict: |
| | """Read current progress status""" |
| | try: |
| | if os.path.exists(PROGRESS_FILE): |
| | with open(PROGRESS_FILE, "r") as f: |
| | return json.load(f) |
| | except Exception: |
| | pass |
| | return {"active": False, "message": "", "progress": 0, "stage": "", "error": None, "complete": False} |