fix(M02): 쓰는 양식(구조물집계표 · B07 도각 · 방위표 · 표지) 지우기 막음

- 서버 delete 가 409 「쓰는 양식이라 못 지움」 · 이름은 B07 엔진 상수와 시험으로 맞춤

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011vX53nJGC8ucBRFJns2n7B
This commit is contained in:
2026-09-28 21:35:24 +09:00
co-authored by Claude Opus 5.5
parent 527e68db85
commit 6606ef167a
2 changed files with 25 additions and 0 deletions
@@ -27,6 +27,13 @@ KINDS = layers.KINDS # 시험은 FOLDER 를 사본으로 바꿈
# (제목행 = 열 `머리` 네 층 · 없는 층 00) — 한 열의 세 번호는 같은 8자리 ·
# 한 번 준 번호는 파일에 남아 안 바뀜(PLAN 13장)
STRUCTURE_TABLE = "구조물집계표"
# 프로그램이 이름으로 부르는 양식 — 지우면 그 기능이 죽음(B07 이름은 `B07_DesignDetail_Engine_*`)
IN_USE = {
("table", STRUCTURE_TABLE): "구조물 도면 · 면적산출 · 재료산출 · 조합 장부가 씀",
("drawing", "00_template_A1"): "B07 도면 도각",
("drawing", "00_template_compass"): "B07 방위표",
("drawing", "00_template_cover"): "B07 표지",
}
# (종류, 문서 번호 칸, 머리 글자, 시트 이름) — 시트 이름이 None 이면 구조물 도면
PARTS = (
("structure", "도번", "SD", None),
@@ -138,6 +145,8 @@ def write(kind: str, name: str, version: str, doc: Any) -> dict[str, Any]:
def delete(kind: str, name: str, version: str | None = None) -> None:
path = _path(kind, name)
if (kind, name) in IN_USE:
raise StoreError(409, f"쓰는 양식이라 못 지움 「{name}」 — {IN_USE[(kind, name)]}")
with _LOCK:
if not path.is_file():
raise StoreError(404, f"없는 양식 「{name}」")
+16
View File
@@ -86,6 +86,22 @@ def test_copy_is_independent_and_seeds_new_project(client, tmp_path, monkeypatch
assert [r["이름"] for r in client.get("/api/m02/templates").json()] == ["원본"]
def test_in_use_templates_not_deleted(client):
"""프로그램이 이름으로 부르는 양식은 못 지움 — 이름은 B07 엔진 상수와 같음."""
from B07_DesignDetail import B07_DesignDetail_Engine_Cad_Cover as cover
from B07_DesignDetail import B07_DesignDetail_Engine_Template as tpl
names = {tpl.A1_TEMPLATE, tpl.COMPASS_TEMPLATE, cover.COVER_TEMPLATE}
assert {n for k, n in store.IN_USE if k == "drawing"} == names
doc = {"format": 6, "entities": [{"type": "line"}]}
for kind, name in store.IN_USE:
body = doc if kind == "drawing" else {"열": []}
client.put(f"/api/m02/templates/{kind}/{name}", json={"판": "", "문서": body})
got = client.delete(f"/api/m02/templates/{kind}/{name}")
assert got.status_code == 409 and "쓰는 양식" in got.json()["detail"]
assert client.get(f"/api/m02/templates/{kind}/{name}").status_code == 200
def test_empty_doc_rejected_and_file_untouched(client):
good = {"format": 6, "entities": [{"type": "line"}]}
made = client.put("/api/m02/templates/drawing/도", json={"판": "", "문서": good})