init commit

This commit is contained in:
2025-11-12 20:57:36 +09:00
commit e0075d91b6
40 changed files with 8544 additions and 0 deletions

197
db_setup.py Normal file
View File

@@ -0,0 +1,197 @@
#!/usr/bin/env python3
"""
Скрипт для очистки и инициализации БД с тестовыми данными
"""
import asyncio
import random
from database import async_session_maker, Base, engine
from models import User, Lottery, Participation, Winner
from services import LotteryService, UserService, ParticipationService
from datetime import datetime, timedelta
from sqlalchemy import delete, update, select, func
async def clear_database():
"""Очистка всех таблиц"""
print("🗑️ Очистка базы данных...")
async with async_session_maker() as session:
# Удаляем все данные в правильном порядке (учитывая внешние ключи)
await session.execute(delete(Winner))
await session.execute(delete(Participation))
await session.execute(delete(Lottery))
await session.execute(delete(User))
await session.commit()
print("✅ База данных очищена")
def generate_account_numbers(user_id: int, count: int = 10) -> list:
"""Генерация номеров счетов для пользователя"""
base = user_id * 1000
return [f"{base + i:06d}" for i in range(1, count + 1)]
async def create_test_users():
"""Создание тестовых пользователей"""
print("👥 Создание тестовых пользователей...")
users_data = [
{"telegram_id": 111111111, "username": "alice_winner", "first_name": "Alice", "last_name": "Johnson"},
{"telegram_id": 222222222, "username": "bob_player", "first_name": "Bob", "last_name": "Smith"},
{"telegram_id": 333333333, "username": "charlie_test", "first_name": "Charlie", "last_name": "Brown"},
{"telegram_id": 444444444, "username": "diana_luck", "first_name": "Diana", "last_name": "Wilson"},
{"telegram_id": 555555555, "username": "eve_gamer", "first_name": "Eve", "last_name": "Davis"},
{"telegram_id": 666666666, "username": "frank_player", "first_name": "Frank", "last_name": "Miller"},
{"telegram_id": 777777777, "username": "grace_lucky", "first_name": "Grace", "last_name": "Taylor"},
{"telegram_id": 888888888, "username": "henry_bet", "first_name": "Henry", "last_name": "Anderson"},
{"telegram_id": 999999999, "username": "iris_game", "first_name": "Iris", "last_name": "Thomas"},
{"telegram_id": 101010101, "username": "jack_chance", "first_name": "Jack", "last_name": "Jackson"},
]
created_users = []
async with async_session_maker() as session:
for i, user_data in enumerate(users_data, 1):
# Создаем пользователя
user = await UserService.get_or_create_user(
session=session,
telegram_id=user_data["telegram_id"],
username=user_data["username"],
first_name=user_data["first_name"],
last_name=user_data.get("last_name", None)
)
# Генерируем и присваиваем номера счетов
account_numbers = generate_account_numbers(i, 10)
# Обновляем счета
await session.execute(
update(User)
.where(User.id == user.id)
.values(account_number=",".join(account_numbers))
)
await session.commit()
created_users.append((user, account_numbers))
print(f"✅ Создан пользователь {user.first_name} ({user.username}) с {len(account_numbers)} счетами")
return created_users
async def create_test_lotteries(users_data):
"""Создание тестовых розыгрышей"""
print("🎲 Создание тестовых розыгрышей...")
async with async_session_maker() as session:
# Первый розыгрыш - активный
lottery1 = await LotteryService.create_lottery(
session=session,
title="🎯 Супер Розыгрыш #1",
description="Розыгрыш крутых призов! Участвуют все желающие.",
prizes=[
"iPhone 15 Pro - Новейший флагман Apple",
"AirPods Pro - Беспроводные наушники премиум класса",
"Apple Watch - Умные часы последней модели"
],
creator_id=users_data[0][0].id
)
# Второй розыгрыш - тоже активный
lottery2 = await LotteryService.create_lottery(
session=session,
title="🚀 Мега Розыгрыш #2",
description="Еще больше призов! Еще больше возможностей!",
prizes=[
"MacBook Pro - Мощный ноутбук для профессионалов",
"iPad Air - Планшет для творчества и работы",
"Денежный приз 50,000 рублей"
],
creator_id=users_data[0][0].id
)
await session.commit()
print(f"✅ Создан розыгрыш: {lottery1.title} (ID: {lottery1.id})")
print(f"✅ Создан розыгрыш: {lottery2.title} (ID: {lottery2.id})")
return [lottery1, lottery2]
async def populate_participants(users_data, lotteries):
"""Заполнение участников розыгрышей"""
print("🎫 Добавление участников в розыгрыши...")
async with async_session_maker() as session:
# Добавляем всех пользователей в первый розыгрыш
lottery1 = lotteries[0]
for user, account_numbers in users_data:
# Добавляем каждого пользователя как участника
success = await ParticipationService.add_participant(
session=session,
lottery_id=lottery1.id,
user_id=user.id
)
if success:
print(f"✅ Пользователь {user.first_name}: добавлен в розыгрыш №1")
else:
print(f"⚠️ Пользователь {user.first_name}: уже участвует в розыгрыше №1")
# Добавляем первых 5 пользователей во второй розыгрыш
lottery2 = lotteries[1]
for user, account_numbers in users_data[:5]: # Первые 5 пользователей
success = await ParticipationService.add_participant(
session=session,
lottery_id=lottery2.id,
user_id=user.id
)
if success:
print(f"✅ Пользователь {user.first_name}: добавлен в розыгрыш №2")
else:
print(f"⚠️ Пользователь {user.first_name}: уже участвует в розыгрыше №2")
async def show_statistics():
"""Показ статистики созданных данных"""
print("\n📊 Статистика созданных данных:")
async with async_session_maker() as session:
# Пользователи
users = await UserService.get_all_users(session)
print(f"👥 Пользователей: {len(users)}")
# Розыгрыши
lotteries = await LotteryService.get_active_lotteries(session)
print(f"🎲 Активных розыгрышей: {len(lotteries)}")
# Участия
for lottery in lotteries:
# Простой подсчет через SQL
result = await session.execute(
select(func.count(Participation.id))
.where(Participation.lottery_id == lottery.id)
)
participation_count = result.scalar()
print(f"🎫 Розыгрыш '{lottery.title}': {participation_count} участий")
print("\n✅ Тестовые данные успешно созданы!")
async def main():
"""Главная функция"""
print("🚀 Инициализация тестовой базы данных")
print("=" * 50)
# Очищаем БД
await clear_database()
# Создаем тестовых пользователей
users_data = await create_test_users()
# Создаем розыгрыши
lotteries = await create_test_lotteries(users_data)
# Заполняем участников
await populate_participants(users_data, lotteries)
# Показываем статистику
await show_statistics()
print("\n🎉 Инициализация завершена!")
if __name__ == "__main__":
asyncio.run(main())