checkin status tool

This commit is contained in:
2025-09-06 06:15:35 +09:00
parent 290a5a8c2f
commit e65da5fd8f
9 changed files with 1328 additions and 13 deletions

319
check_checkin_status.py Normal file
View File

@ -0,0 +1,319 @@
#!/usr/bin/env python3
"""
チェックイン機能確認ツール: 総合的にチェックイン機能の状態を調査
"""
import subprocess
import requests
import json
from datetime import datetime
import time
def check_checkin_api_status():
"""
チェックインAPIの基本動作確認
"""
print("🔍 チェックインAPI動作確認")
print("=" * 50)
# 基本的な接続確認
test_urls = [
"http://localhost:8100/gifuroge/checkin_from_rogapp",
"http://localhost:8100/api/checkin_from_rogapp"
]
for url in test_urls:
try:
# GETリクエストでエンドポイントの存在確認
response = requests.get(url, timeout=5)
print(f"{url} → HTTP {response.status_code}")
if response.status_code == 405:
print(f" 💡 405 Method Not Allowed は正常POSTのみ許可")
elif response.status_code == 404:
print(f" ❌ 404 Not Found - エンドポイントが見つからない")
except requests.exceptions.ConnectionError:
print(f"{url} → 接続エラー")
except Exception as e:
print(f"{url} → エラー: {e}")
print()
def test_checkin_with_real_data():
"""
実際のデータでチェックインテスト
"""
print("🎯 実際のデータでチェックインテスト")
print("-" * 50)
# 実際のイベントとチームを取得
try:
result = subprocess.run([
'docker', 'compose', 'exec', 'app', 'python', 'manage.py', 'shell', '-c',
"""
from rog.models import NewEvent2, Entry, Team
# 最新のイベント取得
event = NewEvent2.objects.first()
if event:
print(f"EVENT:{event.event_name}")
# そのイベントのエントリー取得
entry = Entry.objects.filter(event=event).first()
if entry and entry.team:
print(f"TEAM:{entry.team.team_name}")
print(f"ZEKKEN:{entry.zekken_number}")
# スタート済みかチェック
from rog.models import GpsLog
start_log = GpsLog.objects.filter(
zekken_number=entry.zekken_number,
event_code=event.event_name,
cp_number='START'
).first()
print(f"STARTED:{bool(start_log)}")
else:
print("TEAM:None")
else:
print("EVENT:None")
"""
], capture_output=True, text=True)
lines = result.stdout.strip().split('\n')
event_name = None
team_name = None
zekken_number = None
is_started = False
for line in lines:
if line.startswith('EVENT:'):
event_name = line.split(':', 1)[1]
elif line.startswith('TEAM:'):
team_name = line.split(':', 1)[1]
elif line.startswith('ZEKKEN:'):
zekken_number = line.split(':', 1)[1]
elif line.startswith('STARTED:'):
is_started = line.split(':', 1)[1] == 'True'
print(f"📊 取得したテストデータ:")
print(f" イベント: {event_name}")
print(f" チーム: {team_name}")
print(f" ゼッケン: {zekken_number}")
print(f" スタート済み: {is_started}")
if event_name and team_name and event_name != 'None' and team_name != 'None':
# チェックインテスト実行
test_data = {
"event_code": event_name,
"team_name": team_name,
"cp_number": "1",
"image": "data:image/jpeg;base64,test",
"buy_flag": False
}
print(f"\n🚀 チェックインテスト実行:")
print(f" URL: http://localhost:8100/api/checkin_from_rogapp")
print(f" データ: {json.dumps(test_data, ensure_ascii=False, indent=2)}")
try:
response = requests.post(
"http://localhost:8100/api/checkin_from_rogapp",
json=test_data,
headers={'Content-Type': 'application/json'},
timeout=10
)
print(f"\n📥 レスポンス:")
print(f" ステータス: HTTP {response.status_code}")
print(f" 内容: {response.text}")
if response.status_code == 400:
response_data = response.json()
if "スタートしていません" in response_data.get('message', ''):
print(f"\n💡 スタート処理が必要です。start_from_rogapp APIを先に実行してください。")
return test_start_api(event_name, team_name)
except Exception as e:
print(f"❌ チェックインテストエラー: {e}")
else:
print(f"❌ テストデータが不足しています")
except Exception as e:
print(f"❌ データ取得エラー: {e}")
def test_start_api(event_name, team_name):
"""
スタートAPIのテスト
"""
print(f"\n🏁 スタートAPIテスト")
print("-" * 30)
start_data = {
"event_code": event_name,
"team_name": team_name,
"image": "data:image/jpeg;base64,start_test"
}
try:
response = requests.post(
"http://localhost:8100/gifuroge/start_from_rogapp",
json=start_data,
headers={'Content-Type': 'application/json'},
timeout=10
)
print(f"📥 スタートAPIレスポンス:")
print(f" ステータス: HTTP {response.status_code}")
print(f" 内容: {response.text}")
if response.status_code == 200:
print(f"✅ スタート成功!チェックインを再試行します...")
time.sleep(1)
# チェックインを再試行
test_checkin_after_start(event_name, team_name)
except Exception as e:
print(f"❌ スタートAPIエラー: {e}")
def test_checkin_after_start(event_name, team_name):
"""
スタート後のチェックインテスト
"""
print(f"\n🎯 スタート後チェックインテスト")
print("-" * 30)
checkin_data = {
"event_code": event_name,
"team_name": team_name,
"cp_number": "1",
"image": "data:image/jpeg;base64,checkin_test",
"buy_flag": False
}
try:
response = requests.post(
"http://localhost:8100/api/checkin_from_rogapp",
json=checkin_data,
headers={'Content-Type': 'application/json'},
timeout=10
)
print(f"📥 チェックインレスポンス:")
print(f" ステータス: HTTP {response.status_code}")
print(f" 内容: {response.text}")
if response.status_code == 200:
print(f"🎉 チェックイン成功!")
elif response.status_code == 400:
print(f"⚠️ チェックイン失敗400")
except Exception as e:
print(f"❌ チェックインエラー: {e}")
def check_recent_logs():
"""
最近のログを確認
"""
print(f"\n📋 最近のチェックイン関連ログ")
print("-" * 50)
try:
result = subprocess.run([
'docker', 'compose', 'logs', '--tail=30', 'app'
], capture_output=True, text=True)
lines = result.stdout.split('\n')
checkin_logs = []
for line in lines:
if any(keyword in line.lower() for keyword in ['checkin', 'start', 'gpslog', '502', '400', '405']):
checkin_logs.append(line)
if checkin_logs:
print("🔍 関連ログ:")
for log in checkin_logs[-10:]: # 最新10件
print(f" {log}")
else:
print(" 📝 チェックイン関連のログが見つかりませんでした")
except Exception as e:
print(f"❌ ログ確認エラー: {e}")
def check_database_status():
"""
データベースの状態確認
"""
print(f"\n💾 データベース状態確認")
print("-" * 50)
try:
result = subprocess.run([
'docker', 'compose', 'exec', 'app', 'python', 'manage.py', 'shell', '-c',
"""
from rog.models import GpsLog, NewEvent2, Entry
import datetime
# 最近のGpsLogエントリー
recent_logs = GpsLog.objects.order_by('-id')[:5]
print(f"RECENT_LOGS:{len(recent_logs)}")
for log in recent_logs:
print(f"LOG:{log.id}|{log.event_code}|{log.zekken_number}|{log.cp_number}|{log.checkin_time}")
# イベント数
event_count = NewEvent2.objects.count()
print(f"EVENTS:{event_count}")
# エントリー数
entry_count = Entry.objects.count()
print(f"ENTRIES:{entry_count}")
"""
], capture_output=True, text=True)
lines = result.stdout.strip().split('\n')
for line in lines:
if line.startswith('RECENT_LOGS:'):
count = line.split(':', 1)[1]
print(f" 最近のGpsLogエントリー: {count}")
elif line.startswith('LOG:'):
parts = line.split(':', 1)[1].split('|')
if len(parts) >= 5:
print(f" ID:{parts[0]} イベント:{parts[1]} ゼッケン:{parts[2]} CP:{parts[3]} 時刻:{parts[4]}")
elif line.startswith('EVENTS:'):
count = line.split(':', 1)[1]
print(f" 総イベント数: {count}")
elif line.startswith('ENTRIES:'):
count = line.split(':', 1)[1]
print(f" 総エントリー数: {count}")
except Exception as e:
print(f"❌ データベース確認エラー: {e}")
def main():
"""
メイン実行関数
"""
print("🚀 チェックイン機能 総合確認ツール")
print(f"実行時刻: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
print("=" * 60)
# 1. API基本動作確認
check_checkin_api_status()
# 2. データベース状態確認
check_database_status()
# 3. 実際のデータでテスト
test_checkin_with_real_data()
# 4. 最近のログ確認
check_recent_logs()
print(f"\n📊 確認完了")
print("=" * 60)
print("💡 次のステップ:")
print(" 1. 502エラーが出る場合 → nginx設定確認")
print(" 2. 405エラーが出る場合 → URLパス確認")
print(" 3. 400エラーが出る場合 → データ確認")
print(" 4. スタート前エラー → start_from_rogapp API実行")
if __name__ == "__main__":
main()