checkin status tool
This commit is contained in:
319
check_checkin_status.py
Normal file
319
check_checkin_status.py
Normal 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()
|
||||
Reference in New Issue
Block a user