feat(cafe24): 품목 추가·삭제 + 옵션 재생성
- 추가(「+ 행 추가」/불러오기의 새 이름): 저장 시 옵션값을 끝에 덧붙여
PUT options(allow_append — 앞 위치는 그대로라 기존 이름이 밀리지 않음).
카페24가 품목을 자동 생성하면 wait_for_variants 로 새 코드를 받아
자체코드·추가금액·진열/판매를 이어서 PUT. 거부 시 오류 그대로 표시.
- 삭제(행 ✕): DELETE /variants/{code}. 지연 중 GET 에 남는 삭제 품목은
스냅샷 {"_deleted": true} 로 걸러냄. 품목 없는 옵션값은 하단 안내로 분리.
- 옵션값 줄이기(개수 감소)는 서버가 거부 — 위치 짝맞춤으로 이름이 밀림.
- 옵션 재생성: 전체 삭제 → 현재 행으로 생성 → 코드/금액/썸네일 재반영
(품목코드 새로 부여, 강한 확인창).
- 유닛 91 통과, 통합 하네스(덧붙이기·삭제·지연 필터) 통과, 헤드리스 렌더 확인.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
@@ -691,13 +691,20 @@ def build_create_options_request(
|
||||
|
||||
|
||||
def build_update_options_request(
|
||||
original: list[dict], edited: list[dict], *, option_list_type: str = ""
|
||||
original: list[dict],
|
||||
edited: list[dict],
|
||||
*,
|
||||
option_list_type: str = "",
|
||||
allow_append: bool = False,
|
||||
) -> dict:
|
||||
"""옵션명/옵션값(이름·이미지·색상·표시방식) 수정 요청.
|
||||
|
||||
카페24 PUT options 는 `original_options`(수정 전) 와 `options`(수정 후) 를
|
||||
**같은 순서·같은 개수**로 받아 짝을 맞춘다. 옵션 항목 추가/삭제는 이 API 로
|
||||
할 수 없으므로 개수가 다르면 거부한다.
|
||||
**위치**로 짝지어 이름을 바꾼다. 그래서
|
||||
- 옵션값을 **뒤에 덧붙이는** 것(`allow_append`)만 허용한다 — 앞쪽 위치는 그대로라
|
||||
기존 이름이 밀리지 않는다(카페24가 추가를 거부하면 그 오류가 그대로 올라온다).
|
||||
- 옵션값 **삭제**(개수 감소)는 거부한다 — 중간을 빼면 뒤 값들이 한 칸씩 당겨져
|
||||
엉뚱한 품목의 이름이 바뀐다. 정리는 옵션 재생성(삭제 후 생성)으로 한다.
|
||||
original: GET 응답의 options 그대로. edited: 화면에서 보낸 같은 모양의 목록.
|
||||
"""
|
||||
if len(original) != len(edited):
|
||||
@@ -707,10 +714,15 @@ def build_update_options_request(
|
||||
for o, e in zip(original, edited):
|
||||
o_vals = list(o.get("option_value") or [])
|
||||
e_vals = list(e.get("option_value") or [])
|
||||
if len(o_vals) != len(e_vals):
|
||||
if len(e_vals) < len(o_vals):
|
||||
raise ValueError(
|
||||
f"옵션 「{o.get('option_name')}」 의 옵션값을 줄일 수 없습니다. "
|
||||
"옵션값 삭제는 카페24 API 가 지원하지 않습니다 — 옵션 재생성으로 정리하세요."
|
||||
)
|
||||
if len(e_vals) > len(o_vals) and not allow_append:
|
||||
raise ValueError(
|
||||
f"옵션 「{o.get('option_name')}」 의 옵션값 개수가 카페24와 다릅니다. "
|
||||
"옵션값 추가/삭제는 이 API 로 할 수 없습니다."
|
||||
"다시 읽은 뒤 수정하세요."
|
||||
)
|
||||
name = str(e.get("option_name") or "").strip()
|
||||
if not name:
|
||||
@@ -746,6 +758,17 @@ def build_update_options_request(
|
||||
n_item[key] = value
|
||||
orig_entry["option_value"].append(o_item)
|
||||
new_entry["option_value"].append(n_item)
|
||||
# 덧붙이는 새 옵션값 — 수정 전 목록에는 없고 수정 후 목록 끝에만 있다.
|
||||
for ev in e_vals[len(o_vals):]:
|
||||
text = str(ev.get("option_text") or "").strip()
|
||||
if not text:
|
||||
raise ValueError("추가할 옵션값 이름은 비울 수 없습니다.")
|
||||
n_item = {"option_text": text}
|
||||
for key in ("option_image_file", "option_link_image", "option_color"):
|
||||
value = str(ev.get(key) or "").strip()
|
||||
if value:
|
||||
n_item[key] = value
|
||||
new_entry["option_value"].append(n_item)
|
||||
orig_out.append(orig_entry)
|
||||
new_out.append(new_entry)
|
||||
request: dict = {"original_options": orig_out, "options": new_out}
|
||||
|
||||
Reference in New Issue
Block a user