feat: #73 학습 결과 입력 API 연결 (progress_record) - #78
Conversation
|
실제 응답 스키마(flat JSON), 소유권+오늘날짜+ACTIVE 제한, bool/int 타입 검증, 마감된 계획 거부(409) 등 설계 방향은 다 좋습니다. 다만 머지 전에 정리할 게 있습니다.
bash Python은 같은 이름으로 두 번 정의하면 나중 정의가 조용히 앞의 것을 덮어씁니다. 실제 동작(423번째 줄)은 의도하신 그대로 맞지만, 367~419번째 줄(53줄)이 아무도 호출 못 하는 죽은 코드로 남아있습니다. 같은 문제가 테스트 파일에도 있습니다 bash 2220번째 줄 클래스(isSuccess 구조 검증하는 옛날 테스트 8개)는 모듈 네임스페이스에서 2325번째 줄 클래스에 덮어써져서, 파일엔 있지만 실제로 한 번도 실행되지 않습니다. python manage.py test planner.tests.ProgressRecordViewTests -v 2로 확인해보면 2325번째 줄 클래스의 12개만 실행됩니다. 부탁드리는 것 planner/views.py 365
python result["daily_plan_item_status"], result["updated_speed_factor"]가 있는데return JsonResponse({ PR 설명에 "실시간 반영은 범위 밖, 성공 시 reload 권장"이라고 명시하신 걸 보면 지금 당장은 프론트가 안 쓸 값들이라 문제는 아닙니다. 다만 나중에 새로고침 없는 실시간 반영으로 갈 때 다시 추가해야 할 것 같아, 미리 알아두시면 좋을 것 같아 남깁니다. 지금 같이 넣어두셔도 무방해 보입니다. 1번만 정리되면 나머지는 실제로 코드 받아서 로직(트랜잭션, select_for_update, 예외 매핑)까지 확인했고 문제없습니다. 정리 부탁드립니다! |
|
확인 감사합니다. 말씀해주신 중복 정의 문제 확인했습니다.
삭제된 테스트 클래스는 동일한 클래스명으로 덮어써져 기존에도 실행되지 않던 코드라, 정리 후에도
|
관련 이슈
Closes #73
작업 내용
result_modal.html(FE2, #64)이 학습 결과 입력 UI는 갖췄지만 제출 로직(POST URL, 필드명)이 "BE 확정 후 연결"로 남아있던 부분을 연결한다.planner:progress_record(POST): DailyPlanItem의 학습 결과(완료/일부완료/못함)를record_progress()로 저장API 계약
POST /planner/progress/<item_id>/
Request: {"status": "done"|"partial"|"not_done", "actual_minutes": number|null, "completion_percent": number|null}
Response 성공(200): {"item_id": int, "status": str, "actual_minutes": int, "completion_percent": int|null, "daily_plan_status": str}
Response 실패(400/404/409): {"message": str}
설계 결정 사항 (리뷰 과정에서 정리)
get_object_or_404()대신filter().first()+ 수동 404 JSON 응답 사용. JS가response.json()으로 파싱하는데 Django 기본 HTML 404가 오면 파싱 자체가 실패하기 때문isSuccess/code/message감싸는 구조 대신, 기존material_analysis_status처럼 평평한(flat) JSONdaily_plan__date=timezone.localdate(),daily_plan__exam_period__status=ACTIVE조건으로 제한 (URL 직접 호출로 미래/과거 계획을 임의 수정하는 것 방지)isinstance(x, int)+bool별도 배제(파이썬에서bool은int의 서브클래스라True/False가 실수로 통과하는 것 방지)로 문자열/실수/리스트 입력 시 500 대신 400 반환이번 PR 범위 밖
rmSubmit클릭 핸들러 JS 작성 (API 계약 전달 후 FE2 작업)today화면에서 결과 입력 후 실시간 반영 (성공 시window.location.reload()권장 — summary/eod 통계까지 같이 갱신되어야 하므로)테스트
python manage.py test planner→ 140개 통과 (기존 128 + 신규 12)