Add log on APIs

This commit is contained in:
2025-09-02 17:01:40 +09:00
parent c95c8713d4
commit d6b40bd0f8
2 changed files with 136 additions and 48 deletions

View File

@ -4,7 +4,7 @@ from datetime import datetime, timezone
from rest_framework.decorators import api_view
from rest_framework.response import Response
from rest_framework import status
from rog.models import Location2025, NewEvent2, Entry, GpsLog
from rog.models import Location2025, NewEvent2, Entry, GpsLog, TeamStart, TeamGoal
import logging
import uuid
import os
@ -42,18 +42,24 @@ def remove_checkin_from_rogapp(request):
- team_name: チーム名
- cp_number: チェックポイント番号
"""
logger.info("remove_checkin_from_rogapp called")
# ログ用のリクエストID生成
request_id = uuid.uuid4().hex[:8]
request_time = timezone.now()
client_ip = request.META.get('HTTP_X_FORWARDED_FOR', request.META.get('REMOTE_ADDR', 'Unknown'))
user_info = f"{request.user.username}({request.user.id})" if request.user.is_authenticated else "Anonymous"
# リクエストからパラメータを取得
event_code = request.data.get('event_code')
team_name = request.data.get('team_name')
cp_number = request.data.get('cp_number')
logger.info(f"[REMOVE_CHECKIN] 🗑️ API call started - ID: {request_id}, event_code: '{event_code}', team_name: '{team_name}', cp_number: {cp_number}, Client IP: {client_ip}, User: {user_info}")
logger.debug(f"Parameters: event_code={event_code}, team_name={team_name}, cp_number={cp_number}")
# パラメータ検証
if not all([event_code, team_name, cp_number]):
logger.warning("Missing required parameters")
logger.error(f"[REMOVE_CHECKIN] ❌ Missing required parameters - ID: {request_id}, event_code: '{event_code}', team_name: '{team_name}', cp_number: {cp_number}, Client IP: {client_ip}")
return Response({
"status": "ERROR",
"message": "イベントコード、チーム名、チェックポイント番号が必要です"
@ -63,12 +69,14 @@ def remove_checkin_from_rogapp(request):
# イベントの存在確認
event = NewEvent2.objects.filter(event_name=event_code).first()
if not event:
logger.warning(f"Event not found: {event_code}")
logger.error(f"[REMOVE_CHECKIN] ❌ Event not found - ID: {request_id}, event_code: '{event_code}', Client IP: {client_ip}")
return Response({
"status": "ERROR",
"message": "指定されたイベントが見つかりません"
}, status=status.HTTP_404_NOT_FOUND)
logger.info(f"[REMOVE_CHECKIN] ✅ Event found - ID: {request_id}, event: '{event.event_name}', event_id: {event.id}")
# チームの存在確認
entry = Entry.objects.filter(
event=event,
@ -76,12 +84,14 @@ def remove_checkin_from_rogapp(request):
).first()
if not entry:
logger.warning(f"Team not found: {team_name} in event: {event_code}")
logger.error(f"[REMOVE_CHECKIN] ❌ Team not found - ID: {request_id}, team_name: '{team_name}', event_code: '{event_code}', Client IP: {client_ip}")
return Response({
"status": "ERROR",
"message": "指定されたチームが見つかりません"
}, status=status.HTTP_404_NOT_FOUND)
logger.info(f"[REMOVE_CHECKIN] ✅ Team found - ID: {request_id}, team_name: '{team_name}', zekken: {entry.zekken_number}, entry_id: {entry.id}")
# 対象のチェックポイント記録を検索
checkpoint = GpsLog.objects.filter(
entry=entry,
@ -89,18 +99,33 @@ def remove_checkin_from_rogapp(request):
).first()
if not checkpoint:
logger.warning(f"Checkpoint {cp_number} not found for team: {team_name}")
logger.warning(f"[REMOVE_CHECKIN] ⚠️ Checkpoint not found - ID: {request_id}, team_name: '{team_name}', zekken: {entry.zekken_number}, cp_number: {cp_number}, Client IP: {client_ip}")
return Response({
"status": "ERROR",
"message": "指定されたチェックポイント記録が見つかりません"
}, status=status.HTTP_404_NOT_FOUND)
logger.info(f"[REMOVE_CHECKIN] ✅ Checkpoint found for removal - ID: {request_id}, checkpoint_id: {checkpoint.id}, checkin_time: {checkpoint.checkin_time}, has_image: {bool(checkpoint.image_address)}")
# チェックポイント記録を削除
checkin_time = checkpoint.checkin_time
checkpoint_id = checkpoint.id
checkpoint.delete()
image_address = checkpoint.image_address
logger.info(f"Successfully removed CP {cp_number} for team: {team_name} in event: {event_code}")
with transaction.atomic():
# 拡張情報も一緒に削除(存在する場合)
try:
from ..models import CheckinExtended
extended_info = CheckinExtended.objects.filter(gpslog=checkpoint).first()
if extended_info:
extended_info.delete()
logger.info(f"[REMOVE_CHECKIN] ✅ Extended info also removed - ID: {request_id}, checkpoint_id: {checkpoint_id}")
except Exception as ext_error:
logger.warning(f"[REMOVE_CHECKIN] ⚠️ Failed to remove extended info - ID: {request_id}, Error: {ext_error}")
checkpoint.delete()
logger.success(f"[REMOVE_CHECKIN] 🎉 Successfully removed checkpoint - ID: {request_id}, team_name: '{team_name}', zekken: {entry.zekken_number}, cp_number: {cp_number}, checkpoint_id: {checkpoint_id}, had_image: {bool(image_address)}, Client IP: {client_ip}")
return Response({
"status": "OK",
@ -112,7 +137,7 @@ def remove_checkin_from_rogapp(request):
})
except Exception as e:
logger.error(f"Error in remove_checkin_from_rogapp: {str(e)}")
logger.error(f"[REMOVE_CHECKIN] 💥 ERROR - ID: {request_id}, team_name: '{team_name}', cp_number: {cp_number}, Client IP: {client_ip}, Error: {str(e)}", exc_info=True)
return Response({
"status": "ERROR",
"message": "サーバーエラーが発生しました"
@ -149,17 +174,22 @@ def start_checkin(request):
- event: イベントコード
- zekken: ゼッケン番号
"""
logger.info("start_checkin called")
# リクエスト詳細情報を取得
client_ip = request.META.get('REMOTE_ADDR', 'Unknown')
user_agent = request.META.get('HTTP_USER_AGENT', 'Unknown')
user_info = request.user.email if request.user.is_authenticated else 'Anonymous'
logger.info(f"[ADMIN_START] API called - Client IP: {client_ip}, User: {user_info}")
# リクエストからパラメータを取得
event_code = request.query_params.get('event')
zekken_number = request.query_params.get('zekken')
logger.debug(f"Parameters: event={event_code}, zekken={zekken_number}")
logger.info(f"[ADMIN_START] Request parameters - event_code: {event_code}, zekken_number: {zekken_number}, user_agent: {user_agent[:100]}")
# パラメータ検証
if not all([event_code, zekken_number]):
logger.warning("Missing required parameters")
logger.warning(f"[ADMIN_START] Missing required parameters - event_code: {event_code}, zekken_number: {zekken_number}, Client IP: {client_ip}")
return Response({
"status": "ERROR",
"message": "イベントコードとゼッケン番号が必要です"
@ -251,18 +281,23 @@ def add_checkin(request):
- zekken: ゼッケン番号
- list: カンマ区切りのチェックポイント番号リスト
"""
logger.info("add_checkin called")
# ログ用のリクエストID生成
request_id = uuid.uuid4().hex[:8]
request_time = timezone.now()
client_ip = request.META.get('HTTP_X_FORWARDED_FOR', request.META.get('REMOTE_ADDR', 'Unknown'))
user_agent = request.META.get('HTTP_USER_AGENT', 'Unknown')
user_info = f"{request.user.username}({request.user.id})" if request.user.is_authenticated else "Anonymous"
# リクエストからパラメータを取得
event_code = request.query_params.get('event')
zekken_number = request.query_params.get('zekken')
cp_list_string = request.query_params.get('list')
logger.debug(f"Parameters: event={event_code}, zekken={zekken_number}, list={cp_list_string}")
logger.info(f"[ADMIN_CHECKIN] 📝 Bulk checkin API call started - ID: {request_id}, event_code: '{event_code}', zekken_number: {zekken_number}, cp_list: '{cp_list_string}', Client IP: {client_ip}, User: {user_info}, User-Agent: {user_agent[:100]}")
# パラメータ検証
if not all([event_code, zekken_number, cp_list_string]):
logger.warning("Missing required parameters")
logger.error(f"[ADMIN_CHECKIN] ❌ Missing required parameters - ID: {request_id}, event_code: '{event_code}', zekken_number: {zekken_number}, cp_list: '{cp_list_string}', Client IP: {client_ip}")
return Response({
"status": "ERROR",
"message": "イベントコード、ゼッケン番号、チェックポイントリストが必要です"
@ -272,12 +307,14 @@ def add_checkin(request):
# イベントの存在確認
event = NewEvent2.objects.filter(event_name=event_code).first()
if not event:
logger.warning(f"Event not found: {event_code}")
logger.error(f"[ADMIN_CHECKIN] ❌ Event not found - ID: {request_id}, event_code: '{event_code}', Client IP: {client_ip}")
return Response({
"status": "ERROR",
"message": "指定されたイベントが見つかりません"
}, status=status.HTTP_404_NOT_FOUND)
logger.info(f"[ADMIN_CHECKIN] ✅ Event found - ID: {request_id}, event: '{event.event_name}', event_id: {event.id}")
# チームの存在確認
entry = Entry.objects.filter(
event=event,
@ -285,19 +322,21 @@ def add_checkin(request):
).first()
if not entry:
logger.warning(f"Team with zekken number {zekken_number} not found in event: {event_code}")
logger.error(f"[ADMIN_CHECKIN] ❌ Team not found - ID: {request_id}, zekken: {zekken_number}, event_code: '{event_code}', Client IP: {client_ip}")
return Response({
"status": "ERROR",
"message": "指定されたゼッケン番号のチームが見つかりません"
}, status=status.HTTP_404_NOT_FOUND)
logger.info(f"[ADMIN_CHECKIN] ✅ Team found - ID: {request_id}, team_name: '{entry.team_name}', zekken: {zekken_number}, entry_id: {entry.id}")
# チームがスタートしているか確認(オプション)
if not hasattr(entry, 'start_info'):
# スタート情報がない場合は自動的にスタートさせる
# 注意: 管理画面からの操作なので、自動スタートを許可
from rog.models import TeamStart
TeamStart.objects.create(entry=entry, start_time=timezone.now())
logger.info(f"Auto-started team {entry.team_name} (zekken: {zekken_number})")
logger.info(f"[ADMIN_CHECKIN] ✅ Auto-started team - ID: {request_id}, team_name: '{entry.team_name}', zekken: {zekken_number}")
# チェックポイントリストを解析
cp_list = [cp.strip() for cp in cp_list_string.split(',') if cp.strip()]