from decimal import Decimal import secrets from sqlalchemy import select from sqlalchemy.orm import Session from app.models import Category, Product, ProductKey CATEGORIES = [ { "slug": "keys", "name": "Игровые ключи", "description": "Steam, Epic, Origin и другие платформы", "sort_order": 1, }, { "slug": "software", "name": "Софт", "description": "Лицензии и подписки для работы", "sort_order": 2, }, { "slug": "accounts", "name": "Аккаунты", "description": "Готовые профили с контентом", "sort_order": 3, }, { "slug": "giftcards", "name": "Подарочные карты", "description": "Цифровые коды пополнения", "sort_order": 4, }, ] PRODUCTS = [ { "slug": "steam-wallet-1000", "title": "Steam Wallet 1000 ₽", "short_description": "Код пополнения кошелька Steam на 1000 рублей", "description": "Цифровой код активируется в клиенте Steam. Доставка сразу после оплаты.", "price": Decimal("1049.00"), "category_slug": "giftcards", "image_gradient": "mint", "is_featured": True, "delivery_note": "Код сразу после оплаты", }, { "slug": "adobe-cc-1m", "title": "Adobe Creative Cloud — 1 месяц", "short_description": "Полный доступ к Photoshop, Premiere, Illustrator", "description": "Официальная подписка на месяц. Данные для входа приходят автоматически.", "price": Decimal("1890.00"), "category_slug": "software", "image_gradient": "coral", "is_featured": True, "delivery_note": "Доступ сразу после оплаты", }, { "slug": "cyberpunk-steam", "title": "Cyberpunk 2077 — Steam Key", "short_description": "Полная версия с обновлениями для Steam", "description": "Ключ активации для региона RU/CIS. Работает с аккаунтом Steam.", "price": Decimal("1299.00"), "category_slug": "keys", "image_gradient": "ink", "is_featured": True, "delivery_note": "Ключ сразу после оплаты", }, { "slug": "spotify-premium-3m", "title": "Spotify Premium — 3 месяца", "short_description": "Музыка без рекламы и офлайн-режим", "description": "Подписка активируется на ваш аккаунт или выдаётся новый профиль.", "price": Decimal("799.00"), "category_slug": "accounts", "image_gradient": "sand", "is_featured": True, "delivery_note": "Данные сразу после оплаты", }, { "slug": "windows-11-pro", "title": "Windows 11 Pro Key", "short_description": "Розничный ключ активации Windows 11 Pro", "description": "Подходит для чистой установки и апгрейда. Инструкция в письме.", "price": Decimal("2490.00"), "category_slug": "software", "image_gradient": "mint", "is_featured": False, "delivery_note": "Ключ сразу после оплаты", }, { "slug": "playstation-1500", "title": "PlayStation Store 1500 ₽", "short_description": "Карта пополнения аккаунта PSN", "description": "Цифровой ваучер для российского региона PlayStation Network.", "price": Decimal("1549.00"), "category_slug": "giftcards", "image_gradient": "coral", "is_featured": False, "delivery_note": "Код сразу после оплаты", }, ] def _demo_code(prefix: str) -> str: return f"{prefix}-{secrets.token_hex(4).upper()}-{secrets.token_hex(3).upper()}" def seed_if_empty(db: Session) -> None: has_categories = db.scalar(select(Category.id).limit(1)) is not None if not has_categories: for item in CATEGORIES: db.add(Category(**item)) db.commit() has_products = db.scalar(select(Product.id).limit(1)) is not None if not has_products: for item in PRODUCTS: product = Product(**item) db.add(product) db.flush() for _ in range(8): db.add( ProductKey( product_id=product.id, code=_demo_code(product.slug[:8].upper()), ) ) db.commit() else: # Ensure demo stock exists for products without keys products = db.scalars(select(Product)).all() for product in products: has_keys = ( db.scalar( select(ProductKey.id).where(ProductKey.product_id == product.id).limit(1) ) is not None ) if not has_keys: for _ in range(5): db.add( ProductKey( product_id=product.id, code=_demo_code(product.slug[:8].upper()), ) ) db.commit()