Files
site/WESP_REL/app/services/setup_state.py
T
2026-07-17 12:57:18 +03:00

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