/
Evdik
/
Integration_System_labs4
Обзор
Документация
Войти
/
Evdik
/
Integration_System_labs4
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
init_test_data.py
286 строк
10 KB
Evdikkom
first
22 ноя 2025, 12:27
22 ноя 2025, 12:27
8ded1dc
Код
Авторство
О чём код?
""" Скрипт для инициализации тестовых данных в базе данных Запускается один раз при первом запуске системы """ import sys import os from datetime import datetime, timedelta # Добавляем текущую директорию в путь для импортов sys.path.append(os.path.dirname(os.path.abspath(__file__))) from models import init_database, User, Game, Order, OrderItem, GameKey, Review, hash_password from sqlalchemy.orm import sessionmaker def init_test_data(): """Заполнение базы данных тестовыми данными""" print("Инициализация тестовых данных...") engine = init_database() Session = sessionmaker(bind=engine) session = Session() try: # Проверяем, есть ли уже данные user_count = session.query(User).count() game_count = session.query(Game).count() if user_count > 0 or game_count > 0: print(f"В базе уже есть данные: {user_count} пользователей, {game_count} игр") response = input("Перезаписать данные? (y/N): ") if response.lower() != 'y': print("Отмена инициализации") return # Очищаем существующие данные (в правильном порядке из-за foreign keys) print("Очистка существующих данных...") session.query(Review).delete() session.query(GameKey).delete() session.query(OrderItem).delete() session.query(Order).delete() session.query(Game).delete() session.query(User).delete() # Создаем пользователей print("Создание пользователей...") users = [ User( username='testuser', email='test@example.com', password_hash=hash_password('testpass123'), balance=1000.0, role='user', last_login=datetime.utcnow() ), User( username='admin', email='admin@example.com', password_hash=hash_password('admin123'), balance=0.0, role='admin', last_login=datetime.utcnow() ), User( username='gamer123', email='gamer@example.com', password_hash=hash_password('gamerpass'), balance=500.0, role='user', last_login=datetime.utcnow() - timedelta(days=1) ) ] for user in users: session.add(user) session.flush() # Получаем ID пользователей # Создаем игры print("Создание игр...") games = [ Game( title='Cyberpunk 2077', description='Action RPG in a futuristic world', price=1999.99, developer='CD Projekt Red', publisher='CD Projekt', release_date=datetime(2020, 12, 10).date(), genre='RPG', platform='PC', is_available=True, image_url='https://example.com/cyberpunk.jpg' ), Game( title='The Witcher 3: Wild Hunt', description='Epic fantasy RPG', price=1499.99, developer='CD Projekt Red', publisher='CD Projekt', release_date=datetime(2015, 5, 19).date(), genre='RPG', platform='PC', is_available=True, image_url='https://example.com/witcher3.jpg' ), Game( title='Doom Eternal', description='First-person shooter', price=1299.99, developer='id Software', publisher='Bethesda', release_date=datetime(2020, 3, 20).date(), genre='FPS', platform='PC', is_available=True, image_url='https://example.com/doom.jpg' ), Game( title='Red Dead Redemption 2', description='Western action-adventure game', price=2299.99, developer='Rockstar Studios', publisher='Rockstar Games', release_date=datetime(2018, 10, 26).date(), genre='Action-Adventure', platform='PC', is_available=True, image_url='https://example.com/rdr2.jpg' ), Game( title='Elden Ring', description='Action RPG with open world', price=2499.99, developer='FromSoftware', publisher='Bandai Namco', release_date=datetime(2022, 2, 25).date(), genre='RPG', platform='PC', is_available=True, image_url='https://example.com/eldenring.jpg' ) ] for game in games: session.add(game) session.flush() # Получаем ID игр # Создаем ключи для игр print("Создание игровых ключей...") game_keys = [] for game in games: for i in range(10): # по 10 ключей на игру key = GameKey( game_id=game.id, key=f"{game.title.upper().replace(' ', '')}-{game.id}-KEY-{i+1:03d}" ) game_keys.append(key) session.add(key) # Создаем заказы print("Создание заказов...") orders = [ Order( user_id=users[0].id, # testuser total_amount=games[0].price + games[1].price, status='completed', created_at=datetime.utcnow() - timedelta(days=2) ), Order( user_id=users[0].id, total_amount=games[2].price, status='completed', created_at=datetime.utcnow() - timedelta(days=1) ) ] for order in orders: session.add(order) session.flush() # Создаем элементы заказов print("Создание элементов заказов...") order_items = [ OrderItem( order_id=orders[0].id, game_id=games[0].id, quantity=1, price_at_purchase=games[0].price ), OrderItem( order_id=orders[0].id, game_id=games[1].id, quantity=1, price_at_purchase=games[1].price ), OrderItem( order_id=orders[1].id, game_id=games[2].id, quantity=1, price_at_purchase=games[2].price ) ] for item in order_items: session.add(item) session.flush() # Активируем ключи для купленных игр print("Активация игровых ключей...") available_keys = {} for game in games: available_keys[game.id] = session.query(GameKey).filter_by( game_id=game.id, is_used=False ).all() # Активируем ключи для заказов key_index = 0 for order_item in order_items: if available_keys[order_item.game_id]: key_to_use = available_keys[order_item.game_id][key_index % len(available_keys[order_item.game_id])] key_to_use.is_used = True key_to_use.order_item_id = order_item.id key_index += 1 # Создаем отзывы print("Создание отзывов...") reviews = [ Review( user_id=users[0].id, game_id=games[0].id, rating=5, comment='Отличная игра! Графика на высоте.', is_verified=True ), Review( user_id=users[0].id, game_id=games[1].id, rating=4, comment='Хороший RPG, но сложновато в начале.', is_verified=True ), Review( user_id=users[2].id, game_id=games[3].id, rating=5, comment='Лучшая игра в которую я играл!', is_verified=True ) ] for review in reviews: session.add(review) # Фиксируем все изменения session.commit() print("\n" + "="*60) print("ТЕСТОВЫЕ ДАННЫЕ УСПЕШНО СОЗДАНЫ!") print("="*60) print("\nДоступные пользователи:") print(" Обычный пользователь: username='testuser', password='testpass123'") print(" Администратор: username='admin', password='admin123'") print(" Игрок: username='gamer123', password='gamerpass'") print("\nСозданные игры:") for game in games: available_count = session.query(GameKey).filter_by( game_id=game.id, is_used=False ).count() print(f" - {game.title} (${game.price}) - {available_count} ключей доступно") print(f"\nСоздано заказов: {len(orders)}") print(f"Создано отзывов: {len(reviews)}") print(f"Всего игровых ключей: {len(game_keys)}") print("\n" + "="*60) except Exception as e: session.rollback() print(f"Ошибка при создании тестовых данных: {e}") raise finally: session.close() if __name__ == '__main__': init_test_data()