Fix some APIs
This commit is contained in:
@ -5,7 +5,7 @@ from rest_framework import status
|
||||
from rog.models import NewEvent2, Entry, Location2025, GpsLog
|
||||
from rog.models import GpsLog
|
||||
import logging
|
||||
from django.db.models import F, Q
|
||||
from django.db.models import F, Q, Max
|
||||
from django.conf import settings
|
||||
import os
|
||||
from urllib.parse import urljoin
|
||||
@ -88,12 +88,13 @@ def input_cp(request):
|
||||
|
||||
# 既に同じCPを登録済みかチェック
|
||||
existing_checkpoint = GpsLog.objects.filter(
|
||||
entry=entry,
|
||||
zekken_number=entry.zekken_number,
|
||||
event_code=entry.event.event_name,
|
||||
cp_number=cp_number
|
||||
).first()
|
||||
|
||||
if existing_checkpoint:
|
||||
logger.warning(f"Checkpoint {cp_number} already registered for team: {entry.team_name}")
|
||||
logger.warning(f"Checkpoint {cp_number} already registered for team: {entry.team.team_name}")
|
||||
return Response({
|
||||
"status": "WARNING",
|
||||
"message": "このチェックポイントは既に登録されています",
|
||||
@ -103,14 +104,26 @@ def input_cp(request):
|
||||
# トランザクション開始
|
||||
with transaction.atomic():
|
||||
# チェックポイント登録
|
||||
# serial_numberを自動生成(既存の最大値+1)
|
||||
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
|
||||
|
||||
checkpoint = GpsLog.objects.create(
|
||||
entry=entry,
|
||||
serial_number=max_serial + 1,
|
||||
zekken_number=entry.zekken_number,
|
||||
event_code=entry.event.event_name,
|
||||
cp_number=cp_number,
|
||||
image_address=image_address,
|
||||
checkin_time=timezone.now()
|
||||
checkin_time=timezone.now(),
|
||||
create_at=timezone.now(),
|
||||
update_at=timezone.now(),
|
||||
buy_flag=False,
|
||||
colabo_company_memo=""
|
||||
)
|
||||
|
||||
logger.info(f"Successfully registered CP {cp_number} for team: {entry.team_name} "
|
||||
logger.info(f"Successfully registered CP {cp_number} for team: {entry.team.team_name} "
|
||||
f"with zekken: {zekken_number}")
|
||||
|
||||
return Response({
|
||||
@ -302,7 +315,7 @@ def start_from_rogapp(request):
|
||||
logger.info(f"[START_API] Searching for team: '{team_name}' in event: '{event_code}' - ID: {request_id}")
|
||||
entry = Entry.objects.filter(
|
||||
event=event,
|
||||
team_name=team_name
|
||||
team__team_name=team_name
|
||||
).first()
|
||||
|
||||
if not entry:
|
||||
@ -318,7 +331,8 @@ def start_from_rogapp(request):
|
||||
# 既にスタート済みかチェック
|
||||
logger.info(f"[START_API] Checking if team already started - ID: {request_id}")
|
||||
existing_start = GpsLog.objects.filter(
|
||||
entry=entry,
|
||||
zekken_number=entry.zekken_number,
|
||||
event_code=event.event_name,
|
||||
cp_number="START",
|
||||
serial_number=0
|
||||
).first()
|
||||
@ -339,13 +353,15 @@ def start_from_rogapp(request):
|
||||
# スタート情報をGpsLogとして登録
|
||||
logger.info(f"[START_API] Creating start record - ID: {request_id}")
|
||||
start_info = GpsLog.objects.create(
|
||||
entry=entry,
|
||||
zekken_number=entry.zekken_number,
|
||||
event_code=event.event_name,
|
||||
cp_number="START",
|
||||
serial_number=0,
|
||||
latitude=float(latitude) if latitude else 0.0,
|
||||
longitude=float(longitude) if longitude else 0.0,
|
||||
checkin_time=timezone.now(),
|
||||
extra_data=extra_data
|
||||
create_at=timezone.now(),
|
||||
update_at=timezone.now(),
|
||||
buy_flag=False,
|
||||
colabo_company_memo=""
|
||||
)
|
||||
|
||||
logger.info(f"[START_API] ✅ Start record created - ID: {request_id}, GpsLog ID: {start_info.id}")
|
||||
@ -493,7 +509,7 @@ def checkin_from_rogapp(request):
|
||||
# チームの存在確認
|
||||
entry = Entry.objects.filter(
|
||||
event=event,
|
||||
team_name=team_name
|
||||
team__team_name=team_name
|
||||
).first()
|
||||
|
||||
if not entry:
|
||||
@ -506,16 +522,26 @@ def checkin_from_rogapp(request):
|
||||
logger.info(f"[CHECKIN] ✅ Team found - ID: {request_id}, Entry ID: {entry.id}, Team: '{team_name}', Zekken: {entry.zekken_number}, Category: '{entry.category.category_name if entry.category else 'N/A'}'")
|
||||
|
||||
# チームがスタートしているか確認
|
||||
if not hasattr(entry, 'start_info'):
|
||||
start_record = GpsLog.objects.filter(
|
||||
zekken_number=entry.zekken_number,
|
||||
event_code=entry.event.event_name,
|
||||
cp_number="START",
|
||||
serial_number=0
|
||||
).first()
|
||||
|
||||
if not start_record:
|
||||
logger.warning(f"[CHECKIN] ❌ Team has not started yet - 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_400_BAD_REQUEST)
|
||||
|
||||
logger.info(f"[CHECKIN] ✅ Team has started - ID: {request_id}, start_time: {start_record.checkin_time}")
|
||||
|
||||
# 既に同じCPを登録済みかチェック
|
||||
existing_checkpoint = GpsLog.objects.filter(
|
||||
entry=entry,
|
||||
zekken_number=entry.zekken_number,
|
||||
event_code=entry.event.event_name,
|
||||
cp_number=cp_number
|
||||
).first()
|
||||
|
||||
@ -544,13 +570,25 @@ def checkin_from_rogapp(request):
|
||||
|
||||
# トランザクション開始
|
||||
with transaction.atomic():
|
||||
# serial_numberを自動生成(既存の最大値+1)
|
||||
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
|
||||
|
||||
# チェックポイント登録
|
||||
checkpoint = GpsLog.objects.create(
|
||||
entry=entry,
|
||||
serial_number=max_serial + 1,
|
||||
zekken_number=entry.zekken_number,
|
||||
event_code=entry.event.event_name,
|
||||
cp_number=cp_number,
|
||||
image_address=image_url,
|
||||
checkin_time=timezone.now(),
|
||||
is_service_checked=event_cp.is_service_cp if event_cp else False
|
||||
create_at=timezone.now(),
|
||||
update_at=timezone.now(),
|
||||
buy_flag=False,
|
||||
is_service_checked=event_cp.is_service_cp if event_cp else False,
|
||||
colabo_company_memo=""
|
||||
)
|
||||
|
||||
# 獲得ポイントの計算(イベントCPが定義されている場合)
|
||||
@ -681,7 +719,7 @@ def goal_from_rogapp(request):
|
||||
# チームの存在確認
|
||||
entry = Entry.objects.filter(
|
||||
event=event,
|
||||
team_name=team_name
|
||||
team__team_name=team_name
|
||||
).first()
|
||||
|
||||
if not entry:
|
||||
@ -695,7 +733,8 @@ def goal_from_rogapp(request):
|
||||
|
||||
# チームがスタートしているか確認(GpsLogでSTARTレコードを確認)
|
||||
start_record = GpsLog.objects.filter(
|
||||
entry=entry,
|
||||
zekken_number=entry.zekken_number,
|
||||
event_code=entry.event.event_name,
|
||||
cp_number="START",
|
||||
serial_number=0
|
||||
).first()
|
||||
@ -709,7 +748,8 @@ def goal_from_rogapp(request):
|
||||
|
||||
# 既にゴールしているかチェック(GpsLogでGOALレコードを確認)
|
||||
existing_goal = GpsLog.objects.filter(
|
||||
entry=entry,
|
||||
zekken_number=entry.zekken_number,
|
||||
event_code=entry.event.event_name,
|
||||
cp_number="GOAL",
|
||||
serial_number=9999
|
||||
).first()
|
||||
@ -751,17 +791,18 @@ def goal_from_rogapp(request):
|
||||
|
||||
# ゴール情報をGpsLogとして登録
|
||||
goal_info = GpsLog.objects.create(
|
||||
entry=entry,
|
||||
zekken_number=entry.zekken_number,
|
||||
event_code=entry.event.event_name,
|
||||
cp_number="GOAL",
|
||||
serial_number=9999, # ゴール記録の固定シリアル番号
|
||||
latitude=0.0, # ゴールポイントの座標(固定)
|
||||
longitude=0.0,
|
||||
checkin_time=goal_time,
|
||||
image_address=image_url,
|
||||
extra_data={
|
||||
"score": score,
|
||||
"scoreboard_url": scoreboard_url
|
||||
}
|
||||
create_at=timezone.now(),
|
||||
update_at=timezone.now(),
|
||||
buy_flag=False,
|
||||
score=score,
|
||||
scoreboard_url=scoreboard_url,
|
||||
colabo_company_memo=""
|
||||
)
|
||||
|
||||
logger.info(f"[GOAL] ✅ SUCCESS - Team: {team_name}, Zekken: {entry.zekken_number}, Event: {event_code}, Goal Time: {goal_time}, Score: {score}, Has Image: {bool(image_url)}, Client IP: {client_ip}, User: {user_info}")
|
||||
@ -770,7 +811,7 @@ def goal_from_rogapp(request):
|
||||
"status": "OK",
|
||||
"message": "ゴール処理が正常に完了しました",
|
||||
"team_name": team_name,
|
||||
"goal_time": goal_info.goal_time.strftime("%Y-%m-%d %H:%M:%S"),
|
||||
"goal_time": goal_info.checkin_time.strftime("%Y-%m-%d %H:%M:%S"),
|
||||
"score": score,
|
||||
"scoreboard_url": scoreboard_url
|
||||
})
|
||||
@ -785,7 +826,10 @@ def goal_from_rogapp(request):
|
||||
def calculate_team_score(entry):
|
||||
"""チームのスコアを計算する補助関数"""
|
||||
# チームが通過したチェックポイントを取得
|
||||
checkpoints = GpsLog.objects.filter(entry=entry)
|
||||
checkpoints = GpsLog.objects.filter(
|
||||
zekken_number=entry.zekken_number,
|
||||
event_code=entry.event.event_name
|
||||
)
|
||||
|
||||
total_score = 0
|
||||
|
||||
|
||||
Reference in New Issue
Block a user