Fix some APIs

This commit is contained in:
2025-09-02 23:14:14 +09:00
parent 9f27357a3b
commit 8ffedc177f
11 changed files with 974 additions and 287 deletions

View File

@ -1,5 +1,6 @@
# 既存のインポート部分に追加
from datetime import datetime, timezone
from datetime import datetime
from django.utils import timezone
# from sqlalchemy import Transaction # 削除 - SQLAlchemy 2.0では利用不可
from rest_framework.decorators import api_view
from rest_framework.response import Response
@ -80,7 +81,7 @@ def remove_checkin_from_rogapp(request):
# チームの存在確認
entry = Entry.objects.filter(
event=event,
team_name=team_name
team__team_name=team_name
).first()
if not entry:
@ -90,16 +91,17 @@ def remove_checkin_from_rogapp(request):
"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}")
logger.info(f"[REMOVE_CHECKIN] ✅ Team found - ID: {request_id}, team_name: '{team_name}', zekken: {entry.team.zekken_number}, entry_id: {entry.id}")
# 対象のチェックポイント記録を検索
checkpoint = GpsLog.objects.filter(
entry=entry,
zekken_number=entry.team.zekken_number,
event_code=event_code,
cp_number=cp_number
).first()
if not checkpoint:
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}")
logger.warning(f"[REMOVE_CHECKIN] ⚠️ Checkpoint not found - ID: {request_id}, team_name: '{team_name}', zekken: {entry.team.zekken_number}, cp_number: {cp_number}, Client IP: {client_ip}")
return Response({
"status": "ERROR",
"message": "指定されたチェックポイント記録が見つかりません"
@ -125,7 +127,7 @@ def remove_checkin_from_rogapp(request):
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}")
logger.success(f"[REMOVE_CHECKIN] 🎉 Successfully removed checkpoint - ID: {request_id}, team_name: '{team_name}', zekken: {entry.team.zekken_number}, cp_number: {cp_number}, checkpoint_id: {checkpoint_id}, had_image: {bool(image_address)}, Client IP: {client_ip}")
return Response({
"status": "OK",
@ -220,7 +222,8 @@ def start_checkin(request):
# 既にスタート済みかチェックGpsLogでSTARTレコードを確認
existing_start = GpsLog.objects.filter(
entry=entry,
zekken_number=zekken_number,
event_code=event_code,
cp_number="START",
serial_number=0
).first()
@ -238,7 +241,8 @@ def start_checkin(request):
with transaction.atomic():
# スタート情報をGpsLogとして登録
start_info = GpsLog.objects.create(
entry=entry,
zekken_number=zekken_number,
event_code=event_code,
cp_number="START",
serial_number=0,
latitude=0.0,
@ -343,7 +347,8 @@ def add_checkin(request):
# チームがスタートしているか確認(オプション)
start_record = GpsLog.objects.filter(
entry=entry,
zekken_number=zekken_number,
event_code=event_code,
cp_number="START",
serial_number=0
).first()
@ -352,7 +357,8 @@ def add_checkin(request):
# スタート情報がない場合は自動的にスタートさせる
# 注意: 管理画面からの操作なので、自動スタートを許可
GpsLog.objects.create(
entry=entry,
zekken_number=zekken_number,
event_code=event_code,
cp_number="START",
serial_number=0,
latitude=0.0,
@ -383,7 +389,8 @@ def add_checkin(request):
for cp_number in cp_list:
# 既に同じCPを登録済みかチェック
existing_checkpoint = GpsLog.objects.filter(
entry=entry,
zekken_number=zekken_number,
event_code=event_code,
cp_number=cp_number
).first()
@ -404,7 +411,8 @@ def add_checkin(request):
# チェックポイント登録
checkpoint = GpsLog.objects.create(
entry=entry,
zekken_number=zekken_number,
event_code=event_code,
cp_number=cp_number,
checkin_time=timezone.now(),
is_service_checked=event_cp.is_service_cp if event_cp else False
@ -892,7 +900,10 @@ def goal_checkin(request):
def calculate_team_score(entry):
"""チームのスコアを計算する補助関数"""
# チームが通過したチェックポイントを取得
checkpoints = GpsLog.objects.filter(entry=entry)
checkpoints = GpsLog.objects.filter(
zekken_number=entry.team.zekken_number,
event_code=entry.event.event_code
)
total_score = 0
@ -1103,7 +1114,7 @@ def get_checkin_list(request):
# チームの存在確認
entry = Entry.objects.filter(
event=event,
zekken_number=zekken_number
team__zekken_number=zekken_number
).first()
if not entry:
@ -1115,7 +1126,8 @@ def get_checkin_list(request):
# チェックイン記録を取得
checkpoints = GpsLog.objects.filter(
entry=entry
zekken_number=entry.team.zekken_number,
event_code=event_code
).order_by('checkin_time')
# スタート情報を取得