49 lines
1.3 KiB
Python
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)
|