add Gpslog log

This commit is contained in:
2025-09-06 02:23:25 +09:00
parent 6d001bf378
commit 93768fa4ec
4 changed files with 248 additions and 23 deletions

View File

@ -621,11 +621,15 @@ def checkin_from_rogapp(request):
logger.warning(f"[CHECKIN] Location2025 model issue - ID: {request_id}, CP: {cp_number}, Error: {e}")
# トランザクション開始
logger.info(f"[GPSLOG] 🔄 Starting database transaction - ID: {request_id}")
with transaction.atomic():
logger.info(f"[GPSLOG] 🔒 Database transaction started successfully - ID: {request_id}")
# S3に画像をアップロードし、S3 URLを取得
s3_image_url = image_url
if image_url and S3_AVAILABLE and s3_uploader:
try:
logger.info(f"[GPSLOG] 📤 Starting S3 upload - ID: {request_id}, image_size: {len(image_url)} chars")
s3_image_url = s3_uploader.upload_checkin_image(
image_data=image_url,
event_code=entry.event.event_name,
@ -633,32 +637,61 @@ def checkin_from_rogapp(request):
cp_number=cp_number
)
logger.info(f"[CHECKIN] S3 upload - Original: {image_url[:50]}..., S3: {s3_image_url}")
logger.info(f"[GPSLOG] ✅ S3 upload completed - ID: {request_id}, new_url: {s3_image_url[:50]}...")
except Exception as e:
logger.error(f"[CHECKIN] S3 upload failed, using original URL: {e}")
logger.error(f"[GPSLOG] ❌ S3 upload failed - ID: {request_id}, error: {e}")
s3_image_url = image_url
elif image_url:
logger.info(f"[CHECKIN] S3 not available, using original URL")
logger.info(f"[GPSLOG] S3 not available - ID: {request_id}, using original URL")
# serial_numberを自動生成既存の最大値+1
logger.info(f"[GPSLOG] 🔢 Calculating serial number for zekken: {entry.zekken_number}, event: {entry.event.event_name}")
max_serial = GpsLog.objects.filter(
zekken_number=entry.zekken_number,
event_code=entry.event.event_name
).aggregate(max_serial=Max('serial_number'))['max_serial'] or 0
new_serial = max_serial + 1
logger.info(f"[GPSLOG] 📊 Serial number calculation - max_existing: {max_serial}, new_serial: {new_serial}")
# GpsLogテーブルへの書き込み準備
gpslog_data = {
'serial_number': new_serial,
'zekken_number': entry.zekken_number,
'event_code': entry.event.event_name,
'cp_number': cp_number,
'image_address': s3_image_url, # S3 URLを保存
'checkin_time': timezone.now(),
'create_at': timezone.now(),
'update_at': timezone.now(),
'buy_flag': False,
'is_service_checked': False, # Location2025にはis_service_cpがないので、デフォルトでFalse
'colabo_company_memo': ""
}
logger.info(f"[GPSLOG] 📝 Preparing GpsLog record - ID: {request_id}")
logger.info(f"[GPSLOG] 🏷️ Data: serial={new_serial}, zekken={entry.zekken_number}, event={entry.event.event_name}, cp={cp_number}")
logger.info(f"[GPSLOG] 🖼️ Image: has_image={bool(s3_image_url)}, url_length={len(s3_image_url) if s3_image_url else 0}")
logger.info(f"[GPSLOG] ⏰ Timestamps: checkin_time={gpslog_data['checkin_time']}")
# チェックポイント登録S3 URLを使用
checkpoint = GpsLog.objects.create(
serial_number=max_serial + 1,
zekken_number=entry.zekken_number,
event_code=entry.event.event_name,
cp_number=cp_number,
image_address=s3_image_url, # S3 URLを保存
checkin_time=timezone.now(),
create_at=timezone.now(),
update_at=timezone.now(),
buy_flag=False,
is_service_checked=False, # Location2025にはis_service_cpがないので、デフォルトでFalse
colabo_company_memo=""
)
try:
checkpoint = GpsLog.objects.create(**gpslog_data)
logger.info(f"[GPSLOG] ✅ GpsLog record created successfully - ID: {checkpoint.id}, request_id: {request_id}")
logger.info(f"[GPSLOG] 🎯 Created record details - DB_ID: {checkpoint.id}, serial: {checkpoint.serial_number}, checkin_time: {checkpoint.checkin_time}")
# 作成されたレコードの検証
if checkpoint.id:
logger.info(f"[GPSLOG] 🔍 Verification - Record exists in database with ID: {checkpoint.id}")
else:
logger.warning(f"[GPSLOG] ⚠️ Warning - Record created but ID is None")
except Exception as create_error:
logger.error(f"[GPSLOG] ❌ Failed to create GpsLog record - ID: {request_id}, Error: {create_error}")
logger.error(f"[GPSLOG] 📊 Failed data: {gpslog_data}")
raise create_error
# 獲得ポイントの計算Location2025から取得
point_value = event_cp.checkin_point if event_cp else 0
@ -669,27 +702,34 @@ def checkin_from_rogapp(request):
"total_points": point_value
}
logger.info(f"[GPSLOG] 🎯 Point calculation - base_points: {point_value}, bonus_points: {bonus_points}")
# カメラボーナス計算
if image_url and event_cp and hasattr(event_cp, 'evaluation_value'):
if event_cp.evaluation_value == "1": # 写真撮影必須ポイント
bonus_points += 5
scoring_breakdown["camera_bonus"] = 5
scoring_breakdown["total_points"] += 5
logger.info(f"[GPSLOG] 📸 Camera bonus applied - additional_points: 5, total: {scoring_breakdown['total_points']}")
logger.info(f"[CHECKIN] ✅ SUCCESS - Team: {team_name}, Zekken: {entry.zekken_number}, CP: {cp_number}, Points: {point_value}, Bonus: {bonus_points}, Time: {checkpoint.checkin_time}, Has Image: {bool(image_url)}, Buy Flag: {buy_flag}, Client IP: {client_ip}, User: {user_info}")
logger.info(f"[GPSLOG] 🏆 FINAL RESULT - GpsLog_ID: {checkpoint.id}, Serial: {checkpoint.serial_number}, Total_Points: {scoring_breakdown['total_points']}, Request_ID: {request_id}")
# 競技状態を更新(スタート・ゴール以外のチェックイン時)
if cp_number not in ["START", "GOAL", -2, -1]:
entry.rogaining_counted = True
entry.last_checkin_time = checkpoint.checkin_time
entry.save()
logger.info(f"[CHECKIN] ✅ Competition status updated - rogaining_counted: True")
logger.info(f"[CHECKIN] ✅ Competition status updated - rogaining_counted: True, last_checkin_time: {checkpoint.checkin_time}")
logger.info(f"[GPSLOG] 🎮 Entry updated - entry_id: {entry.id}, rogaining_counted: {entry.rogaining_counted}")
else:
logger.info(f"[GPSLOG] Special checkpoint ({cp_number}) - Entry status not updated")
# 拡張情報があれば保存
if gps_coordinates or camera_metadata:
try:
from ..models import CheckinExtended
CheckinExtended.objects.create(
extended_record = CheckinExtended.objects.create(
gpslog=checkpoint,
gps_latitude=gps_coordinates.get('latitude'),
gps_longitude=gps_coordinates.get('longitude'),
@ -700,10 +740,14 @@ def checkin_from_rogapp(request):
bonus_points=bonus_points,
scoring_breakdown=scoring_breakdown
)
logger.info(f"[GPSLOG] 📋 Extended info saved - CheckinExtended_ID: {extended_record.id}")
except Exception as ext_error:
logger.warning(f"Failed to save extended checkin info: {ext_error}")
logger.warning(f"[GPSLOG] ⚠️ Failed to save extended checkin info: {ext_error}")
else:
logger.info(f"[GPSLOG] No extended GPS/camera data to save")
return Response({
# レスポンス作成
response_data = {
"status": "OK",
"message": "チェックポイントが正常に登録されました",
"team_name": team_name,
@ -722,7 +766,13 @@ def checkin_from_rogapp(request):
"ready_for_goal": entry.ready_for_goal,
"is_at_goal": entry.is_at_goal
}
})
}
logger.info(f"[GPSLOG] 📤 Creating response - ID: {request_id}")
logger.info(f"[GPSLOG] 📊 Response summary - checkpoint_id: {checkpoint.id}, total_points: {scoring_breakdown['total_points']}, status: OK")
logger.info(f"[GPSLOG] 🔄 Transaction completed successfully - ID: {request_id}")
return Response(response_data)
except Exception as e:
# より詳細なエラー情報をログに記録
@ -737,6 +787,13 @@ def checkin_from_rogapp(request):
}
logger.error(f"[CHECKIN] ❌ DETAILED ERROR: {error_details}")
logger.error(f"[GPSLOG] ❌ GpsLog creation failed - ID: {request_id if 'request_id' in locals() else 'Unknown'}, Error: {type(e).__name__}: {str(e)}")
# GpsLogトランザクション失敗の詳細
if 'checkpoint' in locals():
logger.error(f"[GPSLOG] 💾 Transaction state - checkpoint created: True, checkpoint_id: {getattr(checkpoint, 'id', 'Unknown')}")
else:
logger.error(f"[GPSLOG] 💾 Transaction state - checkpoint created: False, transaction rolled back")
# より具体的なエラーメッセージを返す
if "データベース" in str(e).lower() or "database" in str(e).lower():