Skip to content

fix: 수정 심사 승인 시 승인자 언어로 잘못된 번역 컬럼이 덮어써지는 문제 수정 - #59

Merged
JaeHyuckSa merged 4 commits into
mainfrom
fix/modification-audit-locale-dependent-apply
Jul 26, 2026
Merged

JaeHyuckSa merged 4 commits into
mainfrom
fix/modification-audit-locale-dependent-apply

Conversation

@JaeHyuckSa

@JaeHyuckSa JaeHyuckSa commented Jul 26, 2026 •

Copy link
Copy Markdown
Member

배경

  • 참가자 포탈의 수정 심사(ModificationAudit)를 어드민에서 승인하면, 요청한 언어가 아닌 반대쪽 언어 컬럼이 덮어써지는 문제가 있습니다.
  • modeltranslation의 원본 필드(nickname, title, summary, description, biography)는 현재 활성 언어로 라우팅되는 descriptor입니다. 수정 요청 시 저장되는 diff에는 원본 필드와 언어별 컬럼이 함께 담기는데, apply_diff_to_model이 원본 필드까지 setattr 하면서 diff를 만든 시점의 언어가 아니라 승인 시점의 언어로 값이 적용되고 있었습니다.
  • 어드민 클라이언트(useAdminAPI.ts의 useBackendAdminClient)는 language를 넘기지 않아 Accept-Language가 항상 ko이고, 참가자 포탈(useParticipantPortalAPI.ts)은 사용자가 선택한 언어(ko/en)를 보냅니다. 따라서 영문 UI로 수정을 요청한 참가자의 심사를 승인할 때 상시 발생합니다.

재현 절차

  1. 참가자 포탈 언어를 영문(en)으로 전환 후 영문 닉네임만 수정 요청
  2. 어드민에서 해당 수정 심사 승인
  3. nickname_en은 정상 반영되지만 nickname_ko까지 영문 값으로 덮어써짐

영향 범위

프로필(UserExt.nickname)뿐 아니라 발표 심사 전체에 해당합니다 — Presentation.title/summary/description, PresentationSpeaker.biography 모두 번역 등록 필드입니다.

참고: 본 PR은 위와 같이 재현·검증된 로케일 의존 버그를 수정합니다. Slack으로 제보된 특정 심사 건이 이 원인인지는 프로덕션 데이터 확인 전까지 미확정이며, 해당 건은 별도로 확인이 필요합니다.

AS-IS

apply_diff_to_model이 diff의 모든 필드를 그대로 setattr 하여, 번역 원본 필드가 승인자의 활성 언어 컬럼에 기록됩니다.

시나리오 nickname_ko nickname_en
영문 닉네임만 수정 → ko로 승인 한글이름 → NewEnglish ❌ NewEnglish ✅
한글 닉네임만 수정 → en으로 승인 새한글이름 ✅ EnglishName → 새한글이름 ❌

또한 승인 처리에 트랜잭션이 없어, 발표+발표자처럼 여러 모델에 걸친 수정이 중간에 실패하면 일부만 반영된 채 심사 상태가 requested로 남습니다.

TO-BE

  • 저장된 diff를 적용할 때 요청 로케일에 의존하지 않습니다. 번역 원본 필드는 건너뛰고 언어별 실제 컬럼(nickname_ko/nickname_en 등)만 적용합니다.
  • 승인 처리(적용 + 상태 변경)를 transaction.atomic으로 묶어 부분 반영을 방지합니다.
  • diff 스냅샷 자체는 그대로 두어 심사 미리보기(fake_original_instance / fake_modified_instance) 동작에는 영향이 없습니다.

modeltranslation의 원본 필드(nickname, title, summary, description, biography)는
현재 활성 언어로 라우팅되는 descriptor다. 수정 요청 시 저장되는 diff에는 원본 필드와
언어별 컬럼이 함께 담기는데, apply_diff_to_model이 원본 필드까지 setattr 하면서
'승인 시점의 언어'로 값이 적용되고 있었다.

어드민 클라이언트는 language를 넘기지 않아 Accept-Language가 항상 ko이고
(useAdminAPI.ts의 useBackendAdminClient), 참가자 포탈은 사용자가 선택한 언어를 보낸다.
그래서 영문 UI로 수정을 요청한 참가자의 심사를 승인하면 영문 값이 한글 컬럼을 덮어썼다.

- apply_diff_to_model이 modeltranslation 원본 필드를 건너뛰고 언어별 실제 컬럼
  (nickname_ko/nickname_en 등)만 적용하도록 수정
- 승인 처리를 transaction.atomic으로 묶어, 여러 모델에 걸친 수정이 중간에 실패했을 때
  일부만 반영된 채 심사 상태가 requested로 남는 문제 방지

diff 스냅샷 자체는 그대로 두어 심사 미리보기(fake_modified_instance) 동작에는 영향이 없다.

Signed-off-by: JaehyuckSa <jaehyuck.sa.dev@gmail.com>
@JaeHyuckSa
JaeHyuckSa requested a review from MU-Software July 26, 2026 07:35
- 자명한 주석 제거, 핵심 근거 주석만 한 줄로 축약
- participant_portal_api/test에 누락된 __init__.py 추가
- 테스트 내 지역 import를 상위로 이동, 불필요한 db fixture 제거

Signed-off-by: JaehyuckSa <jaehyuck.sa.dev@gmail.com>
수정 전에도 통과하던(= 이 버그를 잡지 못하는) 테스트 6건 제거하고,
회귀 감지에 필요한 4건만 남긴다.

- 헬퍼 반환값만 단언하던 테스트 2건 제거
- 승인 후 상태 전이/타 언어 무관 반영 등 기존 동작 테스트 4건 제거
- 테스트 및 헬퍼 docstring 전부 제거

Signed-off-by: JaehyuckSa <jaehyuck.sa.dev@gmail.com>
Signed-off-by: JaehyuckSa <jaehyuck.sa.dev@gmail.com>

@earthyoung earthyoung left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고생하셨습니다!

@JaeHyuckSa
JaeHyuckSa merged commit b3a8c74 into main Jul 26, 2026
3 checks passed
@JaeHyuckSa
JaeHyuckSa deleted the fix/modification-audit-locale-dependent-apply branch July 26, 2026 14:16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants