feat(448 B05 페이지 설정): [저장] · [확정] 영구저장 — 세션 초안 · settings 차례 · 경고 기준 갈아 끼움
- 세션 칸 pagesettings(설계속도 · 지형 · 기준값 · 최소고 강제 · 시작 측점) · 열 때 최신 응답 위에 얹음 - 저장 차례 settings = 노선 뒤 · 관 앞(기본 창구 · 노선 바꾼 [저장]에도 돎) - PUT /route/page-settings — stage 2 params 에 사용자 값만 병합(상태 · STALE 그대로) · 종단 정책 · criteria 갱신 뒤 위반 · 요약 다시 셈(기하 그대로) - 시 · 종점 계획고 조정 = 첫 · 끝 측점 계획고 편집(끝점 ▲▼ 와 같은 길) · 샘플 간격 두 칸 읽기 전용 - E1 재설계 요청이 설계속도 · 최소고 강제 · 시작 측점 옮김 · E2 B06 재생성 지형 기본 특수 · E3 초기값 스냅샷 stage 2 params 뜸 · 되돌림 - 노선 추천 · 평면 R 설정 읽기가 params.options 를 봄(옛 맨 위 칸 폴백) - 시험 test_442_2_page_settings · test_442_2_grade_limit_mirror · design_store_save 차례 갱신 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -88,6 +88,37 @@ async def start_stage(
|
||||
)
|
||||
|
||||
|
||||
def merged_params(params: Dict[str, Any] | None, patch: Dict[str, Any]) -> Dict[str, Any]:
|
||||
"""params 에 patch 를 얹는다 — `options` 는 칸끼리 합침 · 나머지는 갈음(448)."""
|
||||
merged = dict(params or {})
|
||||
for key, value in patch.items():
|
||||
if key == "options" and isinstance(value, dict):
|
||||
merged["options"] = {**(merged.get("options") or {}), **value}
|
||||
else:
|
||||
merged[key] = value
|
||||
return merged
|
||||
|
||||
|
||||
async def merge_stage_params(
|
||||
cursor: aiomysql.DictCursor, project_id: str, stage_no: int, patch: Dict[str, Any]
|
||||
) -> Dict[str, Any]:
|
||||
"""단계 params 에 patch 만 얹는다 — 상태 · 이후 단계(STALE)는 그대로(448 페이지 설정)."""
|
||||
await cursor.execute(
|
||||
"SELECT params FROM project_workflow_stages "
|
||||
"WHERE project_id = %s AND stage_no = %s FOR UPDATE",
|
||||
(project_id, stage_no),
|
||||
)
|
||||
row = await cursor.fetchone()
|
||||
raw = (row["params"] if isinstance(row, dict) else row[0]) if row else None
|
||||
params = json.loads(raw) if isinstance(raw, str) else raw
|
||||
merged = merged_params(params if isinstance(params, dict) else None, patch)
|
||||
await cursor.execute(
|
||||
"UPDATE project_workflow_stages SET params = %s WHERE project_id = %s AND stage_no = %s",
|
||||
(json.dumps(merged, ensure_ascii=False), project_id, stage_no),
|
||||
)
|
||||
return merged
|
||||
|
||||
|
||||
async def complete_stage(cursor: aiomysql.DictCursor, project_id: str, stage_no: int) -> None:
|
||||
"""단계를 완료 상태로 전환한다."""
|
||||
now = datetime.utcnow()
|
||||
|
||||
Reference in New Issue
Block a user