Files
rogaining_srv/fix_fc_gifu_zekken_numbers.py
2025-08-29 09:11:20 +09:00

147 lines
5.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
import os
import sys
import django
# プロジェクト設定
sys.path.append('/app')
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings')
django.setup()
from django.db import connection, transaction
import logging
# ログ設定
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
def assign_zekken_numbers_to_fc_gifu():
"""FC岐阜イベントID:10のチームにゼッケン番号を割り当て"""
print("=== FC岐阜イベントチームゼッケン番号割り当て ===")
with connection.cursor() as cursor:
# 1. FC岐阜イベントの現状確認
print("\n1. FC岐阜イベントID:10現状確認:")
cursor.execute("""
SELECT t.id, t.team_name, t.zekken_number, t.event_id
FROM rog_team t
JOIN rog_entry e ON t.id = e.team_id
WHERE e.event_id = 10
ORDER BY t.id;
""")
fc_teams = cursor.fetchall()
print(f" FC岐阜関連チーム数: {len(fc_teams)}")
print(" 現在の状況:")
for team in fc_teams[:5]: # 最初の5件のみ表示
print(f" Team ID:{team[0]}, Name:{team[1]}, Zekken:{team[2]}, Event:{team[3]}")
# 2. ゼッケン番号が未設定のチームを特定
teams_without_zekken = [team for team in fc_teams if not team[2]]
print(f"\n ゼッケン番号未設定チーム数: {len(teams_without_zekken)}")
if not teams_without_zekken:
print(" 🎉 すべてのチームにゼッケン番号が設定済み")
return
# 3. 既存のゼッケン番号を確認(競合回避)
print("\n2. 既存ゼッケン番号確認:")
cursor.execute("""
SELECT zekken_number
FROM rog_team
WHERE zekken_number IS NOT NULL AND zekken_number != ''
ORDER BY zekken_number;
""")
existing_zekkens = [row[0] for row in cursor.fetchall()]
print(f" 既存ゼッケン番号: {existing_zekkens}")
# 4. ユーザー確認
print(f"\n3. ゼッケン番号割り当て準備:")
print(f" 対象チーム数: {len(teams_without_zekken)}")
print(f" 割り当て予定ゼッケン番号: FC001-FC{len(teams_without_zekken):03d}")
confirm = input("\n ゼッケン番号を割り当てますか? (y/N): ")
if confirm.lower() != 'y':
print(" 処理をキャンセルしました")
return
# 5. ゼッケン番号割り当て実行
print("\n4. ゼッケン番号割り当て実行:")
with transaction.atomic():
for i, team in enumerate(teams_without_zekken, 1):
team_id = team[0]
team_name = team[1]
zekken_number = f"FC{i:03d}"
cursor.execute("""
UPDATE rog_team
SET zekken_number = %s, updated_at = NOW()
WHERE id = %s;
""", [zekken_number, team_id])
print(f" Team ID:{team_id} ({team_name}) → ゼッケン番号: {zekken_number}")
print(f"\n{len(teams_without_zekken)}チームにゼッケン番号を割り当てました")
# 6. 結果確認
print("\n5. 割り当て結果確認:")
cursor.execute("""
SELECT t.id, t.team_name, t.zekken_number
FROM rog_team t
JOIN rog_entry e ON t.id = e.team_id
WHERE e.event_id = 10 AND t.zekken_number IS NOT NULL
ORDER BY t.zekken_number;
""")
updated_teams = cursor.fetchall()
print(f" ゼッケン番号付きチーム数: {len(updated_teams)}")
print(" 割り当て結果(サンプル):")
for team in updated_teams[:10]:
print(f" {team[2]}: {team[1]} (ID:{team[0]})")
# 7. 通過審査管理画面での影響確認
print("\n6. 通過審査管理画面への影響:")
print(" これで通過審査管理画面で以下が表示されるはずです:")
print(" - ALL全参加者")
for team in updated_teams[:5]:
print(f" - {team[2]}{team[1]}")
print(" - ...")
def reset_zekken_numbers():
"""FC岐阜イベントのゼッケン番号をリセットテスト用"""
print("\n=== ゼッケン番号リセット(テスト用) ===")
with connection.cursor() as cursor:
confirm = input("FC岐阜イベントのゼッケン番号をリセットしますか (y/N): ")
if confirm.lower() != 'y':
print("リセットをキャンセルしました")
return
with transaction.atomic():
cursor.execute("""
UPDATE rog_team
SET zekken_number = NULL, updated_at = NOW()
WHERE id IN (
SELECT DISTINCT t.id
FROM rog_team t
JOIN rog_entry e ON t.id = e.team_id
WHERE e.event_id = 10
);
""")
affected_rows = cursor.rowcount
print(f"{affected_rows}チームのゼッケン番号をリセットしました")
if __name__ == "__main__":
try:
import sys
if len(sys.argv) > 1 and sys.argv[1] == '--reset':
reset_zekken_numbers()
else:
assign_zekken_numbers_to_fc_gifu()
except Exception as e:
print(f"❌ エラーが発生しました: {e}")
import traceback
traceback.print_exc()