Merge remote-tracking branch 'origin/sub_laptop_7' into sub_laptop_6

- 충돌 Router_Items 갈라 내기 권한 — sub6 쪽(층 쓰기 권한 · 시스템 관리자 한정 뺌 · PLAN 27-2c)
- Router_Combos 가 M02_Layer_Access(own_owner) 로

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BU9gbNE3aWFUvE61pS2WGt
This commit is contained in:
2026-09-30 13:25:26 +09:00
co-authored by Claude Opus 5.5
22 changed files with 757 additions and 202 deletions
@@ -1,6 +1,6 @@
"""M02 일위대가 조합 층 API(PLAN 27-2a) — `/api/m02/layers/{layer}/combos`(옛 `/api/m01/combo*`).
⚠ 등록은 `main.py`(로그인만) · 층 권한은 `Router_Items._root` 한 규칙:
⚠ 등록은 `main.py`(로그인만) · 층 권한은 `M02_Layer_Access`(`Router_Items._root`) 한 규칙:
system 읽기 = 로그인 누구나 · 쓰기 = 시스템 관리자(마스터 조합 · 키 UA)
company 읽기 = 같은 회사 · 쓰기 = 회사 관리자(키 UC{회사}-######)
personal 읽기 · 쓰기 = 본인(키 UP{사용자}-######)
@@ -18,14 +18,9 @@ from pydantic import BaseModel
from common_util.common_util_auth import verify_session
from M01_MasterData import M01_MasterData_Store as m01
from M02_MasterTemplete import M02_Layer_Access as access
from M02_MasterTemplete import M02_MasterTemplete_Combo_Store as combos
from M02_MasterTemplete.M02_MasterTemplete_Router_Items import (
Layer,
Session,
_call,
_owner,
_root,
)
from M02_MasterTemplete.M02_MasterTemplete_Router_Items import Layer, Session, _call, _root
router = APIRouter(prefix="/api/m02", tags=["M02 MasterTemplete Combos"])
@@ -58,7 +53,7 @@ def get_all(session: Session = Depends(verify_session)) -> list[dict]:
"""고르기(use-combo · 갈라 내기) — 세 층 `[{layer, owner, 판, 폴더, 줄}]` · 회사 없음 빈 층."""
out = []
for layer in ("system", "company", "personal"):
who = None if layer == "system" else _owner(session, layer, None)
who = None if layer == "system" else access.own_owner(session, layer)
if layer != "system" and who is None:
out.append({"layer": layer, "owner": None, "판": "", "폴더": [], "줄": []})
continue