diff --git a/rog/views_apis/api_bulk_photo_upload.py b/rog/views_apis/api_bulk_photo_upload.py index eff0a24..ac1b3f6 100644 --- a/rog/views_apis/api_bulk_photo_upload.py +++ b/rog/views_apis/api_bulk_photo_upload.py @@ -63,11 +63,12 @@ def bulk_upload_checkin_photos(request): event_code = request.POST.get('event_code') zekken_number = request.POST.get('zekken_number') auto_process = request.POST.get('auto_process', 'true').lower() == 'true' + skip_team_validation = request.POST.get('skip_team_validation', 'false').lower() == 'true' # アップロードされた写真ファイルの取得 uploaded_files = request.FILES.getlist('photos') - logger.info(f"[BULK_UPLOAD] 📝 Request data - ID: {request_id}, event_code: '{event_code}', zekken_number: '{zekken_number}', files_count: {len(uploaded_files)}, auto_process: {auto_process}") + logger.info(f"[BULK_UPLOAD] 📝 Request data - ID: {request_id}, event_code: '{event_code}', zekken_number: '{zekken_number}', files_count: {len(uploaded_files)}, auto_process: {auto_process}, skip_team_validation: {skip_team_validation}") # 必須パラメータの検証 if not all([event_code, zekken_number]): @@ -105,22 +106,59 @@ def bulk_upload_checkin_photos(request): logger.info(f"[BULK_UPLOAD] ✅ Event found - ID: {request_id}, event: '{event_code}', event_id: {event.id}") # チームの存在確認とオーナー権限の検証 - entry = Entry.objects.filter( - event=event, - team__zekken_number=zekken_number - ).first() + # zekken_numberは文字列と数値の両方で検索を試行 + entry = None + # まず数値として検索 + if zekken_number.isdigit(): + entry = Entry.objects.filter( + event=event, + zekken_number=int(zekken_number) + ).select_related('team').first() + + # 見つからない場合は文字列として検索 if not entry: + entry = Entry.objects.filter( + event=event, + zekken_label=zekken_number + ).select_related('team').first() + + # さらに見つからない場合は文字列での zekken_number 検索 + if not entry: + entry = Entry.objects.filter( + event=event, + zekken_number=zekken_number + ).select_related('team').first() + + logger.info(f"[BULK_UPLOAD] 🔍 Team search - ID: {request_id}, searching for zekken: '{zekken_number}', found entry: {entry.id if entry else 'None'}") + + # チーム検証のスキップまたは失敗処理 + if not entry and not skip_team_validation: logger.warning(f"[BULK_UPLOAD] ❌ Team not found - ID: {request_id}, zekken_number: '{zekken_number}', event_code: '{event_code}'") return Response({ "status": "ERROR", "message": "指定されたゼッケン番号のチームが見つかりません" }, status=status.HTTP_404_NOT_FOUND) + elif not entry and skip_team_validation: + logger.warning(f"[BULK_UPLOAD] ⚠️ Team not found but validation skipped - ID: {request_id}, zekken_number: '{zekken_number}', event_code: '{event_code}'") + # ダミーエントリ情報を作成(テスト用) + entry = type('Entry', (), { + 'id': f'test_{request_id}', + 'team': type('Team', (), { + 'team_name': f'Test Team {zekken_number}', + 'owner': request.user + })(), + 'event': event + })() + logger.info(f"[BULK_UPLOAD] 🧪 Using test entry - ID: {request_id}, test_entry_id: {entry.id}") - logger.info(f"[BULK_UPLOAD] ✅ Team found - ID: {request_id}, team_name: '{entry.team.team_name}', zekken: {zekken_number}, entry_id: {entry.id}") + if hasattr(entry, 'id') and str(entry.id).startswith('test_'): + logger.info(f"[BULK_UPLOAD] ✅ Test team found - ID: {request_id}, team_name: '{entry.team.team_name}', zekken: {zekken_number}, test_entry_id: {entry.id}") + else: + logger.info(f"[BULK_UPLOAD] ✅ Team found - ID: {request_id}, team_name: '{entry.team.team_name}', zekken: {zekken_number}, entry_id: {entry.id}") - # オーナー権限の確認 - if entry.owner != request.user: + # オーナー権限の確認 (テストモードではスキップ) + if not skip_team_validation and hasattr(entry, 'owner') and entry.owner != request.user: logger.warning(f"[BULK_UPLOAD] ❌ Permission denied - ID: {request_id}, user: {request.user.email}, team_owner: {entry.owner.email}") return Response({ "status": "ERROR",