"""Persist ESPD form state in ProjectSetting.""" from __future__ import annotations import json from sqlalchemy import select from sqlalchemy.orm import Session from app.models import ProjectSetting from app.services.espd.models import EspdState ESPD_STATE_KEY = "espd_state" def get_espd_state(db: Session, project_id: int) -> EspdState: row = db.scalar( select(ProjectSetting).where( ProjectSetting.project_id == project_id, ProjectSetting.key == ESPD_STATE_KEY, ) ) if not row or not row.value: return EspdState() try: return EspdState.model_validate_json(row.value) except Exception: try: return EspdState.model_validate(json.loads(row.value)) except Exception: return EspdState() def save_espd_state(db: Session, project_id: int, state: EspdState) -> EspdState: row = db.scalar( select(ProjectSetting).where( ProjectSetting.project_id == project_id, ProjectSetting.key == ESPD_STATE_KEY, ) ) payload = state.model_dump(by_alias=True, mode="json") text = json.dumps(payload, ensure_ascii=False) if row: row.value = text else: db.add(ProjectSetting(project_id=project_id, key=ESPD_STATE_KEY, value=text)) db.commit() return get_espd_state(db, project_id)