Add admin panel, cart, checkout, and digital key delivery
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
+40
-7
@@ -1,9 +1,10 @@
|
||||
from decimal import Decimal
|
||||
import secrets
|
||||
|
||||
from sqlalchemy import select
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from app.models import Category, Product
|
||||
from app.models import Category, Product, ProductKey
|
||||
|
||||
|
||||
CATEGORIES = [
|
||||
@@ -44,7 +45,7 @@ PRODUCTS = [
|
||||
"category_slug": "giftcards",
|
||||
"image_gradient": "mint",
|
||||
"is_featured": True,
|
||||
"delivery_note": "Код на email за 1–3 минуты",
|
||||
"delivery_note": "Код сразу после оплаты",
|
||||
},
|
||||
{
|
||||
"slug": "adobe-cc-1m",
|
||||
@@ -55,7 +56,7 @@ PRODUCTS = [
|
||||
"category_slug": "software",
|
||||
"image_gradient": "coral",
|
||||
"is_featured": True,
|
||||
"delivery_note": "Доступ в личном кабинете",
|
||||
"delivery_note": "Доступ сразу после оплаты",
|
||||
},
|
||||
{
|
||||
"slug": "cyberpunk-steam",
|
||||
@@ -77,7 +78,7 @@ PRODUCTS = [
|
||||
"category_slug": "accounts",
|
||||
"image_gradient": "sand",
|
||||
"is_featured": True,
|
||||
"delivery_note": "Активация до 15 минут",
|
||||
"delivery_note": "Данные сразу после оплаты",
|
||||
},
|
||||
{
|
||||
"slug": "windows-11-pro",
|
||||
@@ -88,7 +89,7 @@ PRODUCTS = [
|
||||
"category_slug": "software",
|
||||
"image_gradient": "mint",
|
||||
"is_featured": False,
|
||||
"delivery_note": "Ключ на email",
|
||||
"delivery_note": "Ключ сразу после оплаты",
|
||||
},
|
||||
{
|
||||
"slug": "playstation-1500",
|
||||
@@ -99,11 +100,15 @@ PRODUCTS = [
|
||||
"category_slug": "giftcards",
|
||||
"image_gradient": "coral",
|
||||
"is_featured": False,
|
||||
"delivery_note": "Код за несколько минут",
|
||||
"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:
|
||||
@@ -114,5 +119,33 @@ def seed_if_empty(db: Session) -> None:
|
||||
has_products = db.scalar(select(Product.id).limit(1)) is not None
|
||||
if not has_products:
|
||||
for item in PRODUCTS:
|
||||
db.add(Product(**item))
|
||||
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()
|
||||
|
||||
Reference in New Issue
Block a user