Files
GostGenerator/web/backend/app/services/espd/state.py
T
2026-09-08 10:10:30 +03:00

49 lines
1.3 KiB
Python

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