Fix start/goal processes
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, TeamStart, TeamGoal
|
||||
from rog.models import Location2025, NewEvent2, Entry, GpsLog
|
||||
import logging
|
||||
import uuid
|
||||
import os
|
||||
@ -218,25 +218,36 @@ def start_checkin(request):
|
||||
"message": "指定されたゼッケン番号のチームが見つかりません"
|
||||
}, status=status.HTTP_404_NOT_FOUND)
|
||||
|
||||
# 既にスタート済みかチェック
|
||||
if hasattr(entry, 'start_info'):
|
||||
logger.warning(f"Team {entry.team_name} (zekken: {zekken_number}) already started at {entry.start_info.start_time}")
|
||||
# 既にスタート済みかチェック(GpsLogでSTARTレコードを確認)
|
||||
existing_start = GpsLog.objects.filter(
|
||||
entry=entry,
|
||||
cp_number="START",
|
||||
serial_number=0
|
||||
).first()
|
||||
|
||||
if existing_start:
|
||||
logger.warning(f"Team {entry.team_name} (zekken: {zekken_number}) already started at {existing_start.checkin_time}")
|
||||
return Response({
|
||||
"status": "WARNING",
|
||||
"message": "このチームは既にスタートしています",
|
||||
"start_time": entry.start_info.start_time.strftime("%Y-%m-%d %H:%M:%S"),
|
||||
"start_time": existing_start.checkin_time.strftime("%Y-%m-%d %H:%M:%S"),
|
||||
"team_name": entry.team_name
|
||||
})
|
||||
|
||||
# トランザクション開始
|
||||
with transaction.atomic():
|
||||
# スタート情報を登録
|
||||
start_info = TeamStart.objects.create(
|
||||
# スタート情報をGpsLogとして登録
|
||||
start_info = GpsLog.objects.create(
|
||||
entry=entry,
|
||||
start_time=timezone.now()
|
||||
cp_number="START",
|
||||
serial_number=0,
|
||||
latitude=0.0,
|
||||
longitude=0.0,
|
||||
checkin_time=timezone.now(),
|
||||
extra_data={"source": "admin_start"}
|
||||
)
|
||||
|
||||
logger.info(f"Team {entry.team_name} (zekken: {zekken_number}) started at {start_info.start_time}")
|
||||
logger.info(f"Team {entry.team_name} (zekken: {zekken_number}) started at {start_info.checkin_time}")
|
||||
|
||||
return Response({
|
||||
"status": "OK",
|
||||
@ -244,7 +255,7 @@ def start_checkin(request):
|
||||
"team_name": entry.team_name,
|
||||
"zekken_number": zekken_number,
|
||||
"event_code": event_code,
|
||||
"start_time": start_info.start_time.strftime("%Y-%m-%d %H:%M:%S")
|
||||
"start_time": start_info.checkin_time.strftime("%Y-%m-%d %H:%M:%S")
|
||||
})
|
||||
|
||||
except Exception as e:
|
||||
@ -331,11 +342,24 @@ def add_checkin(request):
|
||||
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'):
|
||||
start_record = GpsLog.objects.filter(
|
||||
entry=entry,
|
||||
cp_number="START",
|
||||
serial_number=0
|
||||
).first()
|
||||
|
||||
if not start_record:
|
||||
# スタート情報がない場合は自動的にスタートさせる
|
||||
# 注意: 管理画面からの操作なので、自動スタートを許可
|
||||
from rog.models import TeamStart
|
||||
TeamStart.objects.create(entry=entry, start_time=timezone.now())
|
||||
GpsLog.objects.create(
|
||||
entry=entry,
|
||||
cp_number="START",
|
||||
serial_number=0,
|
||||
latitude=0.0,
|
||||
longitude=0.0,
|
||||
checkin_time=timezone.now(),
|
||||
extra_data={"auto_start": True, "source": "admin_bulk_checkin"}
|
||||
)
|
||||
logger.info(f"[ADMIN_CHECKIN] ✅ Auto-started team - ID: {request_id}, team_name: '{entry.team_name}', zekken: {zekken_number}")
|
||||
|
||||
# チェックポイントリストを解析
|
||||
@ -764,22 +788,41 @@ def goal_checkin(request):
|
||||
"message": "指定されたゼッケン番号のチームが見つかりません"
|
||||
}, status=status.HTTP_404_NOT_FOUND)
|
||||
|
||||
# チームがスタートしているか確認
|
||||
if not hasattr(entry, 'start_info'):
|
||||
# チームがスタートしているか確認(GpsLogでSTARTレコードを確認)
|
||||
start_record = GpsLog.objects.filter(
|
||||
entry=entry,
|
||||
cp_number="START",
|
||||
serial_number=0
|
||||
).first()
|
||||
|
||||
if not start_record:
|
||||
# 管理画面からの操作なので、自動的にスタートさせる
|
||||
from rog.models import TeamStart
|
||||
TeamStart.objects.create(entry=entry, start_time=timezone.now())
|
||||
GpsLog.objects.create(
|
||||
entry=entry,
|
||||
cp_number="START",
|
||||
serial_number=0,
|
||||
latitude=0.0,
|
||||
longitude=0.0,
|
||||
checkin_time=timezone.now(),
|
||||
extra_data={"auto_start": True, "source": "admin_goal"}
|
||||
)
|
||||
logger.info(f"Auto-started team {entry.team_name} (zekken: {zekken_number})")
|
||||
|
||||
# 既にゴールしているかチェック
|
||||
if hasattr(entry, 'goal_info'):
|
||||
logger.warning(f"Team {entry.team_name} (zekken: {zekken_number}) already reached goal at {entry.goal_info.goal_time}")
|
||||
# 既にゴールしているかチェック(GpsLogでGOALレコードを確認)
|
||||
existing_goal = GpsLog.objects.filter(
|
||||
entry=entry,
|
||||
cp_number="GOAL",
|
||||
serial_number=9999
|
||||
).first()
|
||||
|
||||
if existing_goal:
|
||||
logger.warning(f"Team {entry.team_name} (zekken: {zekken_number}) already reached goal at {existing_goal.checkin_time}")
|
||||
return Response({
|
||||
"status": "WARNING",
|
||||
"message": "このチームは既にゴールしています",
|
||||
"goal_time": entry.goal_info.goal_time.strftime("%Y-%m-%d %H:%M:%S"),
|
||||
"goal_time": existing_goal.checkin_time.strftime("%Y-%m-%d %H:%M:%S"),
|
||||
"team_name": entry.team_name,
|
||||
"scoreboard_url": entry.goal_info.scoreboard_url
|
||||
"scoreboard_url": existing_goal.extra_data.get('scoreboard_url', '') if existing_goal.extra_data else ''
|
||||
})
|
||||
|
||||
# ゴール時間の処理
|
||||
@ -812,12 +855,18 @@ def goal_checkin(request):
|
||||
# スコアボードへのURL
|
||||
scoreboard_url = f"{settings.MEDIA_URL}scoreboards/{scoreboard_filename}"
|
||||
|
||||
# ゴール情報を登録
|
||||
goal_info = TeamGoal.objects.create(
|
||||
# ゴール情報をGpsLogとして登録
|
||||
goal_info = GpsLog.objects.create(
|
||||
entry=entry,
|
||||
goal_time=goal_time,
|
||||
score=score,
|
||||
scoreboard_url=scoreboard_url
|
||||
cp_number="GOAL",
|
||||
serial_number=9999,
|
||||
latitude=0.0,
|
||||
longitude=0.0,
|
||||
checkin_time=goal_time,
|
||||
extra_data={
|
||||
"score": score,
|
||||
"scoreboard_url": scoreboard_url
|
||||
}
|
||||
)
|
||||
|
||||
logger.info(f"Team {entry.team_name} (zekken: {zekken_number}) reached goal at {goal_time} with score {score}")
|
||||
|
||||
Reference in New Issue
Block a user