|
|
|
|
|
""" |
|
|
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} |