147 lines
4.3 KiB
Python
147 lines
4.3 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Create Superadmin User Script
|
|
Directly creates a superadmin user in the database for LOAF membership platform
|
|
"""
|
|
|
|
import sys
|
|
import os
|
|
from getpass import getpass
|
|
|
|
# Add the backend directory to path for imports
|
|
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
|
|
|
def main():
|
|
print("=" * 70)
|
|
print("LOAF Membership Platform - Superadmin User Creator")
|
|
print("=" * 70)
|
|
print()
|
|
|
|
# Check for DATABASE_URL
|
|
from dotenv import load_dotenv
|
|
load_dotenv()
|
|
|
|
database_url = os.getenv("DATABASE_URL")
|
|
if not database_url:
|
|
print("❌ DATABASE_URL not found in environment or .env file")
|
|
sys.exit(1)
|
|
|
|
# Get user input
|
|
email = input("Email address: ").strip()
|
|
if not email or '@' not in email:
|
|
print("❌ Invalid email address")
|
|
sys.exit(1)
|
|
|
|
first_name = input("First name: ").strip()
|
|
if not first_name:
|
|
print("❌ First name is required")
|
|
sys.exit(1)
|
|
|
|
last_name = input("Last name: ").strip()
|
|
if not last_name:
|
|
print("❌ Last name is required")
|
|
sys.exit(1)
|
|
|
|
# Get password securely
|
|
password = getpass("Password: ")
|
|
if len(password) < 8:
|
|
print("❌ Password must be at least 8 characters")
|
|
sys.exit(1)
|
|
|
|
password_confirm = getpass("Confirm password: ")
|
|
if password != password_confirm:
|
|
print("❌ Passwords do not match")
|
|
sys.exit(1)
|
|
|
|
print()
|
|
print("Creating superadmin user...")
|
|
|
|
try:
|
|
# Import database dependencies
|
|
from sqlalchemy import create_engine, text
|
|
from passlib.context import CryptContext
|
|
|
|
# Create password hash
|
|
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
|
|
password_hash = pwd_context.hash(password)
|
|
|
|
# Connect to database
|
|
engine = create_engine(database_url)
|
|
|
|
with engine.connect() as conn:
|
|
# Check if user already exists
|
|
result = conn.execute(
|
|
text("SELECT id FROM users WHERE email = :email"),
|
|
{"email": email}
|
|
)
|
|
if result.fetchone():
|
|
print(f"❌ User with email '{email}' already exists")
|
|
sys.exit(1)
|
|
|
|
# Insert superadmin user
|
|
conn.execute(
|
|
text("""
|
|
INSERT INTO users (
|
|
id, email, password_hash, first_name, last_name,
|
|
phone, address, city, state, zipcode, date_of_birth,
|
|
status, role, email_verified,
|
|
newsletter_subscribed, accepts_tos,
|
|
created_at, updated_at
|
|
) VALUES (
|
|
gen_random_uuid(),
|
|
:email,
|
|
:password_hash,
|
|
:first_name,
|
|
:last_name,
|
|
'',
|
|
'',
|
|
'',
|
|
'',
|
|
'',
|
|
'1990-01-01',
|
|
'active',
|
|
'superadmin',
|
|
true,
|
|
false,
|
|
true,
|
|
NOW(),
|
|
NOW()
|
|
)
|
|
"""),
|
|
{
|
|
"email": email,
|
|
"password_hash": password_hash,
|
|
"first_name": first_name,
|
|
"last_name": last_name
|
|
}
|
|
)
|
|
conn.commit()
|
|
|
|
print()
|
|
print("=" * 70)
|
|
print("✅ Superadmin user created successfully!")
|
|
print("=" * 70)
|
|
print()
|
|
print(f" Email: {email}")
|
|
print(f" Name: {first_name} {last_name}")
|
|
print(f" Role: superadmin")
|
|
print(f" Status: active")
|
|
print()
|
|
print("You can now log in with these credentials.")
|
|
print("=" * 70)
|
|
|
|
except ImportError as e:
|
|
print(f"❌ Missing dependency: {e}")
|
|
print(" Run: pip install sqlalchemy psycopg2-binary passlib python-dotenv")
|
|
sys.exit(1)
|
|
except Exception as e:
|
|
print(f"❌ Database error: {e}")
|
|
sys.exit(1)
|
|
|
|
if __name__ == "__main__":
|
|
try:
|
|
main()
|
|
except KeyboardInterrupt:
|
|
print("\n\n❌ Cancelled by user")
|
|
sys.exit(1)
|