Spaces:
Sleeping
Sleeping
| """ | |
| Скрипт для добавления тестового пользователя-администратора в БД. | |
| Подключается к PostgreSQL на Render и создает пользователя с ролью ADMIN. | |
| """ | |
| import psycopg2 | |
| import bcrypt | |
| from uuid import uuid4 | |
| # Параметры подключения к БД на Render | |
| DB_CONFIG = { | |
| 'host': 'dpg-d5ht8vi4d50c739akh2g-a.virginia-postgres.render.com', | |
| 'port': 5432, | |
| 'database': 'lead_exchange_bk', | |
| 'user': 'lead_exchange_bk_user', | |
| 'password': '8m2gtTRBW0iAr7nY2Aadzz0VcZBEVKYM' | |
| } | |
| # Данные администратора | |
| ADMIN_USER = { | |
| 'user_id': str(uuid4()), | |
| 'email': 'admin@leadexchange.com', | |
| 'password': 'admin123', # Будет захеширован | |
| 'first_name': 'Админ', | |
| 'last_name': 'Администраторов', | |
| 'phone': '+79999999999', | |
| 'agency_name': 'Lead Exchange Administration', | |
| 'avatar_url': 'https://cdn.pixabay.com/photo/2015/10/05/22/37/blank-profile-picture-973460_1280.png', | |
| 'role': 'ADMIN' | |
| } | |
| def hash_password(password: str) -> str: | |
| """Хеширование пароля с помощью bcrypt.""" | |
| salt = bcrypt.gensalt() | |
| hashed = bcrypt.hashpw(password.encode('utf-8'), salt) | |
| return hashed.decode('utf-8') | |
| def create_admin_user(): | |
| """Создание пользователя-администратора в БД.""" | |
| try: | |
| # Подключение к БД | |
| print(f"Подключение к базе данных {DB_CONFIG['database']}...") | |
| conn = psycopg2.connect(**DB_CONFIG) | |
| cursor = conn.cursor() | |
| # Проверяем, существует ли таблица users | |
| cursor.execute(""" | |
| SELECT EXISTS ( | |
| SELECT FROM information_schema.tables | |
| WHERE table_name = 'users' | |
| ); | |
| """) | |
| table_exists = cursor.fetchone()[0] | |
| if not table_exists: | |
| print("⚠️ Таблица 'users' не существует. Создаем...") | |
| cursor.execute(""" | |
| CREATE TABLE IF NOT EXISTS users ( | |
| user_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), | |
| email TEXT NOT NULL UNIQUE, | |
| password_hash TEXT NOT NULL, | |
| first_name TEXT NOT NULL, | |
| last_name TEXT NOT NULL, | |
| phone TEXT UNIQUE, | |
| agency_name TEXT, | |
| avatar_url TEXT, | |
| role TEXT NOT NULL, | |
| created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() | |
| ); | |
| """) | |
| conn.commit() | |
| print("✅ Таблица 'users' создана") | |
| # Проверяем, существует ли уже пользователь с таким email | |
| cursor.execute("SELECT email FROM users WHERE email = %s", (ADMIN_USER['email'],)) | |
| existing_user = cursor.fetchone() | |
| if existing_user: | |
| print(f"⚠️ Пользователь с email {ADMIN_USER['email']} уже существует") | |
| # Спрашиваем, обновить ли пароль | |
| update = input("Обновить пароль? (y/n): ").lower().strip() | |
| if update == 'y': | |
| password_hash = hash_password(ADMIN_USER['password']) | |
| cursor.execute( | |
| "UPDATE users SET password_hash = %s WHERE email = %s", | |
| (password_hash, ADMIN_USER['email']) | |
| ) | |
| conn.commit() | |
| print("✅ Пароль обновлен") | |
| else: | |
| print("❌ Операция отменена") | |
| return | |
| # Хешируем пароль | |
| print("Хеширование пароля...") | |
| password_hash = hash_password(ADMIN_USER['password']) | |
| # Вставляем пользователя | |
| print(f"Создание администратора {ADMIN_USER['email']}...") | |
| cursor.execute(""" | |
| INSERT INTO users ( | |
| user_id, email, password_hash, first_name, last_name, | |
| phone, agency_name, avatar_url, role | |
| ) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s) | |
| """, ( | |
| ADMIN_USER['user_id'], | |
| ADMIN_USER['email'], | |
| password_hash, | |
| ADMIN_USER['first_name'], | |
| ADMIN_USER['last_name'], | |
| ADMIN_USER['phone'], | |
| ADMIN_USER['agency_name'], | |
| ADMIN_USER['avatar_url'], | |
| ADMIN_USER['role'] | |
| )) | |
| conn.commit() | |
| print("\n" + "="*60) | |
| print("✅ Администратор успешно создан!") | |
| print("="*60) | |
| print(f"ID: {ADMIN_USER['user_id']}") | |
| print(f"Email: {ADMIN_USER['email']}") | |
| print(f"Пароль: {ADMIN_USER['password']}") | |
| print(f"Роль: {ADMIN_USER['role']}") | |
| print(f"Имя: {ADMIN_USER['first_name']} {ADMIN_USER['last_name']}") | |
| print(f"Телефон: {ADMIN_USER['phone']}") | |
| print("="*60) | |
| cursor.close() | |
| conn.close() | |
| except psycopg2.Error as e: | |
| print(f"❌ Ошибка PostgreSQL: {e}") | |
| raise | |
| except Exception as e: | |
| print(f"❌ Ошибка: {e}") | |
| raise | |
| def verify_admin_user(): | |
| """Проверка, что администратор успешно создан.""" | |
| try: | |
| conn = psycopg2.connect(**DB_CONFIG) | |
| cursor = conn.cursor() | |
| cursor.execute(""" | |
| SELECT user_id, email, first_name, last_name, role, created_at | |
| FROM users | |
| WHERE email = %s | |
| """, (ADMIN_USER['email'],)) | |
| user = cursor.fetchone() | |
| if user: | |
| print("\n📋 Информация о пользователе в БД:") | |
| print(f" ID: {user[0]}") | |
| print(f" Email: {user[1]}") | |
| print(f" Имя: {user[2]} {user[3]}") | |
| print(f" Роль: {user[4]}") | |
| print(f" Создан: {user[5]}") | |
| else: | |
| print("❌ Пользователь не найден в БД") | |
| cursor.close() | |
| conn.close() | |
| except Exception as e: | |
| print(f"❌ Ошибка при проверке: {e}") | |
| if __name__ == "__main__": | |
| print("🚀 Скрипт создания администратора Lead Exchange") | |
| print("-" * 60) | |
| try: | |
| create_admin_user() | |
| verify_admin_user() | |
| except KeyboardInterrupt: | |
| print("\n\n⚠️ Операция прервана пользователем") | |
| except Exception as e: | |
| print(f"\n❌ Критическая ошибка: {e}") | |
| exit(1) | |