#!/usr/bin/env python3 """ Database initialization script for new features: - AppSettings table for dynamic app configuration - User registration bonus tracking fields Run this script after updating the models to apply database changes. Usage: python scripts/init_settings.py """ import sys import os # Add parent directory to path for imports sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) from app import create_app, db from app.models import AppSettings, User from sqlalchemy import inspect, text def table_exists(engine, table_name): """Check if a table exists in the database""" inspector = inspect(engine) return table_name in inspector.get_table_names() def column_exists(engine, table_name, column_name): """Check if a column exists in a table""" inspector = inspect(engine) columns = [col['name'] for col in inspector.get_columns(table_name)] return column_name in columns def init_database(): """Initialize database with new tables and columns""" app = create_app() with app.app_context(): print("=" * 60) print("Database Initialization Script") print("=" * 60) engine = db.engine # Create all tables (including new AppSettings table) print("\n[1/4] Creating new tables if they don't exist...") db.create_all() print(" ✓ Tables created/verified") # Check and add new columns to users table print("\n[2/4] Checking User table for new columns...") if table_exists(engine, 'users'): # Check for registration_bonus column if not column_exists(engine, 'users', 'registration_bonus'): print(" Adding 'registration_bonus' column...") with engine.connect() as conn: conn.execute(text( "ALTER TABLE users ADD COLUMN registration_bonus FLOAT DEFAULT 0.0" )) conn.commit() print(" ✓ 'registration_bonus' column added") else: print(" ✓ 'registration_bonus' column already exists") # Check for registration_bonus_unlocked column if not column_exists(engine, 'users', 'registration_bonus_unlocked'): print(" Adding 'registration_bonus_unlocked' column...") with engine.connect() as conn: conn.execute(text( "ALTER TABLE users ADD COLUMN registration_bonus_unlocked BOOLEAN DEFAULT 0" )) conn.commit() print(" ✓ 'registration_bonus_unlocked' column added") else: print(" ✓ 'registration_bonus_unlocked' column already exists") else: print(" ! Users table doesn't exist yet (will be created)") # Migrate existing users' balances to the new system print("\n[3/4] Migrating existing user data...") # For existing users who already have a balance from registration bonus, # we consider them as having unlocked bonus (since they're existing users) users_to_migrate = User.query.filter( User.registration_bonus == 0, User.balance > 0 ).all() migrated_count = 0 for user in users_to_migrate: # Mark existing users as having unlocked bonus # (they've been using the system before this feature) user.registration_bonus_unlocked = True migrated_count += 1 if migrated_count > 0: db.session.commit() print(f" ✓ Migrated {migrated_count} existing users") else: print(" ✓ No users need migration") # Initialize default app settings print("\n[4/4] Initializing default app settings...") default_settings = [ ('app_name', 'Apex Ores', 'Nom de l\'application'), ('app_logo', None, 'URL du logo de l\'application'), ] for key, default_value, description in default_settings: existing = AppSettings.query.filter_by(key=key).first() if not existing: setting = AppSettings( key=key, value=default_value, description=description ) db.session.add(setting) print(f" ✓ Created setting: {key} = {default_value}") else: print(f" ✓ Setting '{key}' already exists: {existing.value}") db.session.commit() print("\n" + "=" * 60) print("Database initialization completed successfully!") print("=" * 60) # Print current settings print("\nCurrent App Settings:") print("-" * 40) settings = AppSettings.query.all() for setting in settings: print(f" {setting.key}: {setting.value or '(not set)'}") # Print user statistics print("\nUser Statistics:") print("-" * 40) total_users = User.query.count() users_with_locked_bonus = User.query.filter( User.registration_bonus > 0, User.registration_bonus_unlocked == False ).count() users_with_unlocked_bonus = User.query.filter( User.registration_bonus_unlocked == True ).count() print(f" Total users: {total_users}") print(f" Users with locked bonus: {users_with_locked_bonus}") print(f" Users with unlocked bonus: {users_with_unlocked_bonus}") def update_app_name(new_name): """Quick function to update app name""" app = create_app() with app.app_context(): AppSettings.set_setting('app_name', new_name, 'Nom de l\'application') print(f"App name updated to: {new_name}") def update_app_logo(logo_url): """Quick function to update app logo""" app = create_app() with app.app_context(): AppSettings.set_setting('app_logo', logo_url, 'URL du logo de l\'application') print(f"App logo updated to: {logo_url}") if __name__ == '__main__': if len(sys.argv) > 1: command = sys.argv[1] if command == 'set-name' and len(sys.argv) > 2: update_app_name(sys.argv[2]) elif command == 'set-logo' and len(sys.argv) > 2: update_app_logo(sys.argv[2]) elif command == 'help': print("Usage:") print(" python init_settings.py - Initialize database") print(" python init_settings.py set-name - Set app name") print(" python init_settings.py set-logo - Set app logo URL") print(" python init_settings.py help - Show this help") else: print("Unknown command. Use 'help' for usage information.") else: init_database()