update APIs
This commit is contained in:
@ -5,7 +5,7 @@ from django.utils import 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, GpsCheckin
|
||||
import logging
|
||||
import uuid
|
||||
import os
|
||||
@ -1089,18 +1089,19 @@ def get_checkin_list(request):
|
||||
logger.info("get_checkin_list called")
|
||||
|
||||
# リクエストからパラメータを取得(GET/POSTの両方に対応)
|
||||
# 両方のパラメータ名に対応
|
||||
if request.method == 'GET':
|
||||
zekken_number = request.GET.get('zekken')
|
||||
event_code = request.GET.get('event')
|
||||
zekken_number = request.GET.get('zekken_number') or request.GET.get('zekken')
|
||||
event_code = request.GET.get('event_code') or request.GET.get('event')
|
||||
else: # POST
|
||||
try:
|
||||
data = json.loads(request.body)
|
||||
zekken_number = data.get('zekken')
|
||||
event_code = data.get('event')
|
||||
zekken_number = data.get('zekken_number') or data.get('zekken')
|
||||
event_code = data.get('event_code') or data.get('event')
|
||||
except:
|
||||
data = request.POST
|
||||
zekken_number = data.get('zekken')
|
||||
event_code = data.get('event')
|
||||
zekken_number = data.get('zekken_number') or data.get('zekken')
|
||||
event_code = data.get('event_code') or data.get('event')
|
||||
|
||||
logger.info(f"[GET_CHECKIN_LIST] Request method: {request.method}")
|
||||
logger.info(f"[GET_CHECKIN_LIST] Parameters received - zekken: {zekken_number}, event: {event_code}")
|
||||
@ -1134,24 +1135,83 @@ def get_checkin_list(request):
|
||||
}, status=status.HTTP_404_NOT_FOUND)
|
||||
|
||||
# チームの存在確認
|
||||
logger.info(f"[GET_CHECKIN_LIST] Searching for event: {event.event_name} (ID: {event.id})")
|
||||
logger.info(f"[GET_CHECKIN_LIST] Searching for zekken_number: {zekken_number}")
|
||||
|
||||
# まず、このイベントのすべてのEntryを確認
|
||||
all_entries = Entry.objects.filter(event=event)
|
||||
logger.info(f"[GET_CHECKIN_LIST] Total entries in event: {all_entries.count()}")
|
||||
|
||||
# ゼッケン番号でのチーム検索(複数の方法で試す)
|
||||
entry = Entry.objects.filter(
|
||||
event=event,
|
||||
team__zekken_number=zekken_number
|
||||
zekken_number=zekken_number
|
||||
).first()
|
||||
|
||||
if not entry:
|
||||
# team__zekken_numberでも試してみる
|
||||
entry = Entry.objects.filter(
|
||||
event=event,
|
||||
team__zekken_number=zekken_number
|
||||
).first()
|
||||
|
||||
if not entry:
|
||||
logger.warning(f"Team with zekken number {zekken_number} not found in event: {event_code}")
|
||||
# デバッグ用:存在するゼッケン番号を表示
|
||||
existing_zekkens = list(Entry.objects.filter(event=event).values_list('zekken_number', flat=True))
|
||||
logger.info(f"[GET_CHECKIN_LIST] Existing zekken numbers: {existing_zekkens[:10]}") # 最初の10件のみ
|
||||
return Response({
|
||||
"status": "ERROR",
|
||||
"message": "指定されたゼッケン番号のチームが見つかりません"
|
||||
}, status=status.HTTP_404_NOT_FOUND)
|
||||
|
||||
# チェックイン記録を取得
|
||||
checkpoints = GpsLog.objects.filter(
|
||||
zekken_number=entry.team.zekken_number,
|
||||
logger.info(f"[GET_CHECKIN_LIST] Found entry: {entry.team.team_name} (zekken: {entry.zekken_number})")
|
||||
|
||||
# 複数のテーブルからチェックイン記録を取得
|
||||
# GpsLogテーブルから
|
||||
gps_checkpoints = GpsLog.objects.filter(
|
||||
zekken_number=str(entry.zekken_number),
|
||||
event_code=event_code
|
||||
).order_by('checkin_time')
|
||||
|
||||
# GpsCheckinテーブルからも取得
|
||||
gps_checkins = GpsCheckin.objects.filter(
|
||||
zekken=str(entry.zekken_number),
|
||||
event_code=event_code
|
||||
).order_by('checkin_time')
|
||||
|
||||
logger.info(f"[GET_CHECKIN_LIST] Found {gps_checkpoints.count()} records in GpsLog")
|
||||
logger.info(f"[GET_CHECKIN_LIST] Found {gps_checkins.count()} records in GpsCheckin")
|
||||
|
||||
# すべてのチェックイン記録を統合
|
||||
all_checkpoints = []
|
||||
|
||||
# GpsLogからの記録を追加
|
||||
for cp in gps_checkpoints:
|
||||
all_checkpoints.append({
|
||||
'source': 'GpsLog',
|
||||
'id': cp.id,
|
||||
'cp_number': cp.cp_number,
|
||||
'checkin_time': cp.checkin_time,
|
||||
'image_address': getattr(cp, 'image_address', None),
|
||||
'is_service_checked': getattr(cp, 'is_service_checked', False)
|
||||
})
|
||||
|
||||
# GpsCheckinからの記録を追加
|
||||
for cp in gps_checkins:
|
||||
all_checkpoints.append({
|
||||
'source': 'GpsCheckin',
|
||||
'id': cp.id,
|
||||
'cp_number': cp.cp_number,
|
||||
'checkin_time': cp.checkin_time,
|
||||
'image_address': None, # GpsCheckinには画像URLがない
|
||||
'is_service_checked': False
|
||||
})
|
||||
|
||||
# 時間順にソート
|
||||
all_checkpoints.sort(key=lambda x: x['checkin_time'] or timezone.now())
|
||||
|
||||
# スタート情報を取得
|
||||
start_info = None
|
||||
if hasattr(entry, 'start_info'):
|
||||
@ -1170,20 +1230,21 @@ def get_checkin_list(request):
|
||||
|
||||
# チェックイン記録をシリアライズ
|
||||
checkpoint_list = []
|
||||
for cp in checkpoints:
|
||||
for cp in all_checkpoints:
|
||||
checkpoint_data = {
|
||||
"id": cp.id,
|
||||
"cp_number": cp.cp_number,
|
||||
"checkin_time": cp.checkin_time.strftime("%Y-%m-%d %H:%M:%S") if cp.checkin_time else None,
|
||||
"image_url": cp.image_address,
|
||||
"is_service_checked": cp.is_service_checked if hasattr(cp, 'is_service_checked') else False
|
||||
"id": cp['id'],
|
||||
"cp_number": cp['cp_number'],
|
||||
"checkin_time": cp['checkin_time'].strftime("%Y-%m-%d %H:%M:%S") if cp['checkin_time'] else None,
|
||||
"image_url": cp['image_address'],
|
||||
"is_service_checked": cp['is_service_checked'],
|
||||
"source": cp['source']
|
||||
}
|
||||
|
||||
# チェックポイントの得点情報を取得( Location2025 モデルがある場合)
|
||||
try:
|
||||
event_cp = Location2025.objects.filter(
|
||||
event_id=event.id,
|
||||
cp_number=cp.cp_number
|
||||
cp_number=cp['cp_number']
|
||||
).first()
|
||||
|
||||
if event_cp:
|
||||
|
||||
Reference in New Issue
Block a user