85 lines
2.5 KiB
Python
85 lines
2.5 KiB
Python
"""Setup wizard state in data/wesp_install_state.json."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import json
|
|
from datetime import datetime, timezone
|
|
from typing import Any, Dict, List, Optional
|
|
|
|
from flask import Flask
|
|
|
|
from app.services.admin_dashboard_service import get_install_and_warranty, install_state_path
|
|
|
|
SETUP_VERSION = 1
|
|
|
|
|
|
def read_install_state(app: Flask) -> Dict[str, Any]:
|
|
get_install_and_warranty(app)
|
|
path = install_state_path(app)
|
|
if not path.is_file():
|
|
return {}
|
|
try:
|
|
data = json.loads(path.read_text(encoding="utf-8"))
|
|
return data if isinstance(data, dict) else {}
|
|
except (OSError, ValueError, TypeError, json.JSONDecodeError):
|
|
return {}
|
|
|
|
|
|
def write_install_state(app: Flask, partial: Dict[str, Any]) -> Dict[str, Any]:
|
|
current = read_install_state(app)
|
|
current.update(partial)
|
|
path = install_state_path(app)
|
|
path.parent.mkdir(parents=True, exist_ok=True)
|
|
path.write_text(json.dumps(current, indent=2, ensure_ascii=False), encoding="utf-8")
|
|
return current
|
|
|
|
|
|
def is_setup_completed(app: Flask) -> bool:
|
|
return bool(read_install_state(app).get("setup_completed"))
|
|
|
|
|
|
def mark_step_completed(app: Flask, step: str) -> List[str]:
|
|
data = read_install_state(app)
|
|
steps = list(data.get("completed_steps") or [])
|
|
if step and step not in steps:
|
|
steps.append(step)
|
|
write_install_state(app, {"completed_steps": steps})
|
|
return steps
|
|
|
|
|
|
def mark_setup_complete(app: Flask) -> Dict[str, Any]:
|
|
return write_install_state(
|
|
app,
|
|
{
|
|
"setup_completed": True,
|
|
"completed_at": datetime.now(timezone.utc).isoformat(),
|
|
"setup_version": SETUP_VERSION,
|
|
},
|
|
)
|
|
|
|
|
|
def reset_setup(app: Flask) -> Dict[str, Any]:
|
|
return write_install_state(
|
|
app,
|
|
{
|
|
"setup_completed": False,
|
|
"completed_at": None,
|
|
"completed_steps": [],
|
|
"device_role": None,
|
|
"sync_server_connected": False,
|
|
},
|
|
)
|
|
|
|
|
|
def setup_snapshot(app: Flask) -> Dict[str, Any]:
|
|
data = read_install_state(app)
|
|
return {
|
|
"setup_completed": bool(data.get("setup_completed")),
|
|
"setup_version": int(data.get("setup_version") or SETUP_VERSION),
|
|
"device_role": data.get("device_role"),
|
|
"completed_steps": list(data.get("completed_steps") or []),
|
|
"completed_at": data.get("completed_at"),
|
|
"first_launch_at": data.get("first_launch_at"),
|
|
"sync_server_connected": bool(data.get("sync_server_connected")),
|
|
}
|