Files
Aislo/B07_DesignDetail/B07_DesignDetail_Router_Reset.py
T
eomsangdonandClaude Opus 5.5 17e6500cf6 fix(506-3 B07 · CAD 작은 흠): 저장 길 · 죽은 길 걷음 · CAD 되돌리기 · B09 인쇄 미리보기 · M02 도움말
- 1-A 도면 GET · 저장 PUT 한도 60 s · 저장 중 미리받기 쉼 · 끊긴 저장 = 목록 confirmed 로 판정
- 2 CAD 자동백업 열쇠 = b07:{프로젝트}:{도면} · 도각 편집 = b07-frame:{프로젝트} · [초기화] 같은 열쇠
- 3-1 [초기화] 물음 글 = 프로젝트 도각 그대로 · [도각 편집] → [기본 도각 복원] 안내
- 3-2 풀린 장 저장본 json · 수량표 찌꺼기 걷음(_write_manifest 한 곳)
- 5-1 확정 풀기 · 배치 · 축척 = mark_stage(save)
- 7-3 start_stage 가 DEV_UNLOCK 표식 남김
- 6-a navigateDrawing · onNavigate · hasPrev · hasNext 걷음 · 6-b cad-host-save 토글 걷음 · 4-2 B08 안 쓰는 글 11 걷음
- 6-f 특성 판 색 끌기 = 되돌리기 한 칸(paintNowCommitLater 한 벌) · 6-g LAYMRG 사본 길
- 4-1 B09 [인쇄 미리보기] = 저장 뒤 이동 · 단계 그대로 · 6-e M02 카드 도움말 DWG 한 줄
- 시험 test_506_3_* 둘 · cad/undo-506-3 · test_298_2_b07_buttons 열쇠 맞춤

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 12:48:36 +09:00

103 lines
4.3 KiB
Python

"""B07 [초기화](요구 298-2 · 300 C1 · C3) — 그 페이지 사용자 값 · 설정을 지움.
POST /api/projects/{id}/design-drawings/reset 본문 없음
기준 = 저장본 없이 지금 B06 정본으로 그린 원본(떠 두지 않음 · 앞 단계 저장 = 저절로 새 기준).
지움 = 모든 저장본 확정 풂(`confirmed=False` · 도면번호 남김 · json 걷음 = [원본에서 다시 그리기] 꼴) ·
B07 이 확정으로 올린 측점 설계 → 잠정 · 설정 파일(축척 · 횡단 배치 · 표 배율 · 평면도 종류 · 표식).
M02 층(도각 · 표지)은 안 건드림. 단계 = [저장]과 같음(`mark_stage` save).
"""
import asyncio
import logging
import shutil
from pathlib import Path
from typing import Any
from uuid import UUID
from fastapi import APIRouter
from fastapi.responses import JSONResponse
from B06_Section.B06_Section_Repository import merge_cross_section_design_by_round
from B07_DesignDetail.B07_DesignDetail_Engine_Template import drawing_scales_path
from B07_DesignDetail.B07_DesignDetail_Router import _confirmed_source, _designs_by_chainage
from B07_DesignDetail.B07_DesignDetail_Router_Support import CROSS_LAYOUT_FILE
from B07_DesignDetail.B07_DesignDetail_Router_Support_Io import (
_design_root,
_read_manifest,
_write_manifest,
)
from B07_DesignDetail.B07_DesignDetail_Router_Support_Plan import _kinds_dir, _marks_path
from common_util.common_util_workflow_state import mark_stage
from config.config_db import get_db_pool
logger = logging.getLogger(__name__)
router = APIRouter(prefix="/api/projects", tags=["B07 Design Detail"])
def reset_design_files(project_root: Path) -> dict[str, Any]:
"""저장본 풂 + 설정 파일 지움 → {released: 풀린 장 수, cleared: 지운 설정 이름}."""
manifest = _read_manifest(project_root)
released = 0
for entry in manifest["drawings"].values():
if entry.get("confirmed"):
entry["confirmed"] = False
released += 1
if released:
_write_manifest(project_root, manifest)
cleared = []
for path in (
drawing_scales_path(project_root),
_design_root(project_root) / CROSS_LAYOUT_FILE,
_marks_path(project_root),
):
if path.is_file():
path.unlink()
cleared.append(path.name)
if _kinds_dir(project_root).is_dir():
shutil.rmtree(_kinds_dir(project_root))
cleared.append(_kinds_dir(project_root).name)
return {"released": released, "cleared": cleared}
@router.post("/{project_id}/design-drawings/reset")
async def reset_design_drawings(project_id: UUID) -> Any:
try:
route_id, project_root, _longitudinal_path, _bypass = await _confirmed_source(project_id)
result = await asyncio.to_thread(reset_design_files, project_root)
designs = await _designs_by_chainage(route_id)
confirmed = [chainage for chainage, d in designs.items() if d.get("status") == "confirmed"]
pool = get_db_pool()
async with pool.acquire() as connection:
await connection.begin()
try:
for chainage in confirmed:
await merge_cross_section_design_by_round(
connection,
route_id=route_id,
chainage=chainage,
patch={"status": "provisional"},
)
async with connection.cursor() as cursor:
await mark_stage(str(project_id), 4, "save", cursor)
await connection.commit()
except Exception:
await connection.rollback()
raise
return {
"status": "success",
"project_id": str(project_id),
**result,
"provisional": len(confirmed),
}
except FileNotFoundError as exc:
return JSONResponse(status_code=404, content={"status": "error", "message": str(exc)})
except PermissionError as exc:
return JSONResponse(status_code=409, content={"status": "error", "message": str(exc)})
except Exception:
logger.exception("B07 초기화 실패: project_id=%s", project_id)
return JSONResponse(
status_code=500,
content={"status": "error", "message": "상세 설계를 초기화하지 못했습니다."},
)