Files
infoscreen/server/initialize_database.py
2025-10-10 15:20:14 +00:00

144 lines
4.5 KiB
Python
Executable File

#!/usr/bin/env python3
"""
Complete database initialization script for the infoscreen application.
This script:
1. Runs all Alembic migrations to create/update database schema
2. Creates default user groups and admin user
3. Initializes academic periods for Austrian schools
Usage:
python initialize_database.py
"""
import os
import sys
import subprocess
from pathlib import Path
# Add workspace to Python path
sys.path.insert(0, '/workspace')
def run_command(cmd, description):
"""Run a command and handle errors."""
print(f"\n🔄 {description}...")
try:
result = subprocess.run(cmd, shell=True, check=True, capture_output=True, text=True)
if result.stdout:
print(result.stdout)
print(f"{description} completed successfully")
return True
except subprocess.CalledProcessError as e:
print(f"{description} failed:")
print(f"Error: {e}")
if e.stdout:
print(f"Stdout: {e.stdout}")
if e.stderr:
print(f"Stderr: {e.stderr}")
return False
def check_database_connection():
"""Check if database is accessible."""
print("\n🔍 Checking database connection...")
try:
from dotenv import load_dotenv
from sqlalchemy import create_engine, text
load_dotenv('/workspace/.env')
DB_USER = os.getenv('DB_USER')
DB_PASSWORD = os.getenv('DB_PASSWORD')
DB_HOST = os.getenv('DB_HOST', 'db')
DB_NAME = os.getenv('DB_NAME')
DB_URL = f'mysql+pymysql://{DB_USER}:{DB_PASSWORD}@{DB_HOST}/{DB_NAME}'
engine = create_engine(DB_URL)
with engine.connect() as conn:
result = conn.execute(text('SELECT VERSION()'))
version = result.scalar()
print(f"✅ Connected to database: {version}")
return True
except Exception as e:
print(f"❌ Database connection failed: {e}")
return False
def check_current_migration():
"""Check current Alembic migration status."""
print("\n🔍 Checking current migration status...")
try:
result = subprocess.run(
"cd /workspace/server && alembic current",
shell=True,
capture_output=True,
text=True
)
if "head" in result.stdout:
print("✅ Database is up to date")
return True
elif result.stdout.strip() == "":
print("⚠️ No migrations applied yet")
return False
else:
print(f"⚠️ Current migration: {result.stdout.strip()}")
return False
except Exception as e:
print(f"❌ Migration check failed: {e}")
return False
def main():
"""Main initialization function."""
print("🚀 Starting database initialization for infoscreen application")
print("=" * 60)
# Check if we're in the right directory
if not os.path.exists('/workspace/server/alembic.ini'):
print("❌ Error: alembic.ini not found. Are you in the correct directory?")
return False
# Check database connection
if not check_database_connection():
print("\n❌ Cannot connect to database. Please ensure:")
print(" - Database container is running")
print(" - Environment variables are set correctly")
print(" - Network connectivity is available")
return False
# Check current migration status
needs_migration = not check_current_migration()
# Run migrations if needed
if needs_migration:
if not run_command(
"cd /workspace/server && alembic upgrade head",
"Running Alembic migrations"
):
return False
else:
print("⏭️ Skipping migrations (already up to date)")
# Initialize default data
if not run_command(
"cd /workspace/server && python init_defaults.py",
"Creating default groups and admin user"
):
return False
# Initialize academic periods
if not run_command(
"cd /workspace/server && python init_academic_periods.py",
"Setting up academic periods"
):
return False
print("\n" + "=" * 60)
print("🎉 Database initialization completed successfully!")
print("\nNext steps:")
print(" 1. Start the application services")
print(" 2. Access the dashboard to verify everything works")
print(" 3. Login with admin credentials if needed")
return True
if __name__ == "__main__":
success = main()
sys.exit(0 if success else 1)