Add log on APIs
This commit is contained in:
@ -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()]
|
||||
|
||||
Reference in New Issue
Block a user