/
kirffa
/
urgpu_bot
Обзор
Документация
Войти
/
kirffa
/
urgpu_bot
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
scripts/generate_test_data.py
225 строк
15 KB
kirffa
[fix] Добавляет производительность к загрузке изображения
14 фев 2026, 12:57
14 фев 2026, 12:57
c0bf112
Код
Авторство
О чём код?
""" Скрипт для генерации тестовых данных пользователей """ import asyncio import random import sys from datetime import datetime from pathlib import Path # Добавляем корневую директорию в PYTHONPATH sys.path.insert(0, str(Path(__file__).parent.parent)) from sqlalchemy import delete, select from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_async_engine from server.config import settings from server.models import BingoBoard, BingoCell, BingoMatch, GameRound, User # Тестовые данные FIRST_NAMES = [ "Александр", "Мария", "Дмитрий", "Анна", "Иван", "Екатерина", "Сергей", "Ольга", "Михаил", "Елена", "Артём", "Виктория", "Максим", "Наталья", "Андрей" ] LAST_NAMES = [ "Иванов", "Петров", "Сидоров", "Кузнецов", "Смирнов", "Попов", "Васильев", "Соколов", "Михайлов", "Новиков", "Фёдоров", "Морозов", "Волков", "Алексеев", "Лебедев" ] SQUAD_NAMES = [ "Лидеры", "Энергия", "Прогресс", "Победа", "Единство", "Горизонт", "Пульс", "Драйв", "Импульс", "Вектор" ] FACTS_TEMPLATES = [ [ "Занимаюсь спортом уже 5 лет и за это время успел попробовать больше десятка различных видов физической активности", "Умею играть на гитаре классическую и современную музыку, выступал на нескольких концертах в местном клубе", "Люблю путешествовать автостопом и за последние три года посетил более десятка городов и стран Европы", "Коллекционирую открытки" ], [ "Изучаю три иностранных языка одновременно: английский, испанский и японский язык для расширения кругозора", "Участвовал в олимпиаде по математике на региональном уровне и занял призовое место среди всех участников", "Люблю готовить итальянскую кухню и знаю рецепты более пятидесяти различных блюд от пасты до десертов", "Прыгну с парашютом" ], [ "Веду свой YouTube канал о путешествиях и интересных местах России, на который подписано более тысячи человек", "Занимаюсь волонтёрством в приюте для животных и помогаю находить новые дома для бездомных кошек и собак", "Обожаю читать фантастику от классиков вроде Брэдбери и Азимова до современных авторов жанра киберпанк", "Играю в шахматы" ], [ "Играю в театральной студии уже несколько лет и участвовал в постановках классических и современных пьес", "Увлекаюсь фотографией пейзажей и портретов, особенно люблю снимать на плёночную камеру в золотой час", "Могу решить кубик Рубика за минуту используя метод Фридриха и регулярно тренируюсь для улучшения времени", "Катаюсь на сноуборде" ], [ "Пишу стихи и рассказы в свободное время и даже публиковал несколько своих работ в литературных журналах", "Умею программировать на Python и создал несколько полезных приложений для автоматизации рутинных задач", "Занимаюсь танцами современного направления и участвую в выступлениях танцевальной студии на городских мероприятиях", "Читал книги Толкина" ], [ "Участвую в КВН команде нашего университета и мы уже несколько раз занимали призовые места на региональных играх", "Люблю рисовать портреты людей карандашом и акварелью, посещаю мастер-классы и выставки современных художников", "Изучаю астрономию и каждое лето езжу наблюдать за звёздами в места с минимальной световой загрязненностью", "Занимаюсь йогой" ], [ "Собрал коллекцию из 200 виниловых пластинок различных жанров от классического джаза до современного рока", "Умею жонглировать тремя и четырьмя предметами одновременно и учусь новым трюкам по обучающим роликам", "Веду блог о научных открытиях и достижениях, стараюсь объяснять сложные темы простым и доступным языком", "Скалолаз-любитель" ], [ "Участвовал в археологических раскопках древнего поселения и нашёл несколько интересных артефактов эпохи бронзы", "Люблю печь торты и другие кондитерские изделия, экспериментирую с рецептами и украшением готовых работ", "Изучаю историю Средневековья с акцентом на культуру рыцарства и замковую архитектуру европейских стран", "Боксёр-любитель" ], [ "Умею играть на барабанах и являюсь участником рок-группы, которая регулярно выступает на местных площадках", "Прошёл половину маршрута Камино де Сантьяго пешком и планирую закончить оставшуюся часть в следующем году", "Люблю собирать пазлы на тысячу и больше элементов, самый большой собранный мной пазл состоял из трёх тысяч", "Изучаю китайский" ], [ "Участвую в дебатах и турнирах по публичным выступлениям, где наша команда заняла второе место в этом году", "Люблю кататься на велосипеде и за прошлое лето проехал более тысячи километров по живописным маршрутам", "Смотрю по фильму каждый день и веду собственный киноблог с рецензиями на классическое и современное кино", "Практикую медитацию" ], [ "Выращиваю экзотические растения из разных уголков мира и у меня дома настоящая мини-оранжерея с тропиками", "Умею вязать крючком различные изделия от простых салфеток до сложных игрушек амигуруми для друзей и семьи", "Люблю ходить в походы в горы и уже прошёл несколько сложных маршрутов длиной более ста километров каждый", "Интересуюсь философией" ], [ "Коллекционирую монеты разных эпох и стран, включая редкие экземпляры царской России и советского периода", "Занимаюсь каллиграфией и владею несколькими стилями письма от классической до современной декоративной", "Люблю играть в настольные игры от стратегий до кооперативных приключений, регулярно посещаю игровые клубы", "Изучаю психологию" ], [ "Умею играть на пианино и занимаюсь этим с детства, сейчас разучиваю произведения классических композиторов", "Участвовал в марафоне на дистанции 42 километра и финишировал с достойным результатом среди всех участников", "Люблю смотреть документальные фильмы о природе, истории и науке, особенно работы BBC и National Geographic", "Изучаю историю искусства" ], [ "Занимаюсь 3D моделированием и создаю модели для компьютерных игр и анимации в свободное от учёбы время", "Люблю кататься на роликах в парках и специальных площадках, изучаю различные трюки и техники катания", "Собираю сложные наборы Lego, включая архитектурные серии и модели техники с несколькими тысячами деталей", "Изучаю квантовую физику" ], [ "Веду подкаст о кино и киноиндустрии, где обсуждаю новинки проката и классические фильмы с интересными гостями", "Люблю готовить десерты от классических тортов до современных муссовых пирожных с необычными вкусами и текстурами", "Занимаюсь плаванием профессионально уже много лет и имею несколько разрядов в различных стилях плавания", "Изучаю нейронауки" ] ] async def create_test_users(count: int = 10): """Создание тестовых пользователей""" # Создаём движок БД engine = create_async_engine(settings.DATABASE_URL, echo=True) # Создаём фабрику сессий async_session = async_sessionmaker( engine, class_=AsyncSession, expire_on_commit=False ) async with async_session() as session: # Проверяем, сколько уже есть пользователей result = await session.execute(select(User)) existing_users = result.scalars().all() if existing_users: print(f"⚠️ В базе уже есть {len(existing_users)} пользователей") response = input("Удалить существующих и создать новых? (y/n): ") if response.lower() == 'y': print("🗑️ Удаление связанных данных...") # Удаляем в правильном порядке (из-за внешних ключей) await session.execute(delete(BingoMatch)) print(" ✓ Удалены совпадения бинго") await session.execute(delete(BingoCell)) print(" ✓ Удалены ячейки бинго") await session.execute(delete(BingoBoard)) print(" ✓ Удалены доски бинго") await session.execute(delete(GameRound)) print(" ✓ Удалены раунды игры") await session.execute(delete(User)) print(" ✓ Удалены пользователи") await session.commit() print("✓ База данных очищена") else: print("Отменено") return # Генерируем пользователей users = [] for i in range(count): first_name = random.choice(FIRST_NAMES) last_name = random.choice(LAST_NAMES) user = User( telegram_id=1000000 + i, # Фейковые telegram_id username=f"test_user_{i+1}", first_name=first_name, last_name=last_name, full_name=f"{first_name} {last_name}", age=random.randint(18, 25), squad_name=random.choice(SQUAD_NAMES), photo_path=f"profiles/test_photo_{i+1}.jpg", photo_thumb_path=f"profiles/test_photo_{i+1}_thumb.jpg", fact_1=FACTS_TEMPLATES[i][0], fact_2=FACTS_TEMPLATES[i][1], fact_3=FACTS_TEMPLATES[i][2], fact_4=FACTS_TEMPLATES[i][3], is_registered=True, created_at=datetime.now() ) users.append(user) session.add(user) await session.commit() print(f"\n✓ Создано {count} тестовых пользователей:") for user in users: print(f" • {user.full_name} (@{user.username}) - {user.age} лет, отряд '{user.squad_name}'") if __name__ == "__main__": import argparse parser = argparse.ArgumentParser(description="Генерация тестовых данных") parser.add_argument( "--count", type=int, default=10, help="Количество пользователей для создания (по умолчанию 10)" ) args = parser.parse_args() print(f"🚀 Генерация {args.count} тестовых пользователей...\n") asyncio.run(create_test_users(args.count)) print("\n✅ Готово!")