#!/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()