feat(732-1): M02 실무문서 칸 · 복사 탭 · 서버 길 걷음

- 왼쪽 「실무문서」 칸(Practice.ts) · 일위대가 가져오기 「실무문서」 탭 · 복사 원본 고르기 · 낱 CSS · locale 열쇠 걷음
- 서버 `from_layer=practice`(_copy_practice) · `DELETE /api/m02/practice`(drop_practice) · 조합 목록 · 키 하나 읽기 길 걷음 · 조합 길 시스템 관리자 문 걷음(담을 로직 읽기는 그대로)
- 옛 마스터 조합 파일 `일위대가조합.json`(UA 37) = 쓰는 곳 있음(구조물집계표 일위대가 칸 · labor 본뜬키 · 프로젝트 초기값 사본 · 불러오기 맞춤 씨앗) → 파일 · 읽기 길 유지 · 지우지 않음
- 낡은 시험: test_m02_practice 지움(화면 · 길 없음) · 조합 길 읽던 시험(combo · combo_inputs · combo_layers)은 저장소 함수로 · 실무문서 복사 시험(labor_copy · pair_copy) 줄 지움 · 탭 · 차례 단정(layer_screen · structure_options · structure_panel · 720 · precombo_scope · ui_loading) 고침

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-11-02 13:17:24 +09:00
co-authored by Claude Sonnet 5.5
parent 23b9757cea
commit e1b17a523c
27 changed files with 79 additions and 701 deletions
@@ -301,15 +301,6 @@ def post_structure(
return _call(_root(session, layer, owner, write=True), store.create_structure, column)
def _copy_practice(column: str, key: str) -> dict[str, Any]:
"""실무문서 조합(마스터 UA) → 이 열 일위대가 문서(입력값 빈 값 · 39-1b)."""
from M02_MasterTemplete import M02_Labor_Doc as labor
if not key.startswith("UA"):
raise store.StoreError(400, f"실무문서 조합 키가 아님 「{key}」")
return store.copy_from("labor", column, key, body=labor.from_combo(key))
class AreaTableBody(BaseModel):
"""면적산출 범위 → 도면 표(41-1) — `시트` = 시트 id · 이름 · `범위` · `이름`(104-1) 이 있으면
그 이름이 지금 가리키는 범위로 품(연결표 다시 읽을 때) · `글자크기` 기본 2.5."""
@@ -358,23 +349,16 @@ def post_copy(
column: str,
source: str = Query(alias="from"),
owner: str | None = None,
from_layer: Literal["system", "company", "personal", "practice"] | None = None,
from_layer: Literal["system", "company", "personal"] | None = None,
from_owner: str | None = None,
pair: bool = False,
session: Session = Depends(verify_session),
):
"""항목 하나 복사해 가져오기(덮어씀 · 번호 · 열 그대로) — 원본 = 같은 층(`from_layer` 없음) ·
다른 층(원본 읽기 권한) · 실무문서 조합(`practice` · 일위대가만 · 시스템 관리자만) ·
`pair` = 일위대가 · 면적산출 함께(43-9a · 답 `{area?, labor}` · 실무문서는 일위대가만)."""
다른 층(원본 읽기 권한) ·
`pair` = 일위대가 · 면적산출 함께(43-9a · 답 `{area?, labor}`)."""
folder = _root(session, layer, owner, write=True)
part = "structure" if kind == "structures" else kind
if from_layer == "practice":
if part not in (("labor", "area") if pair else ("labor",)) or not access.is_system_admin(
session
):
raise HTTPException(status_code=403, detail="실무문서는 시스템 관리자가 일위대가로만")
got = _call(folder, _copy_practice, column, source)
return {"labor": got} if pair else got
origin = _root(session, from_layer, from_owner) if from_layer else None
if pair and part != "structure":
return _call(folder, store.copy_pair, column, source, origin)