Add admin panel, cart, checkout, and digital key delivery

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
orohi
2026-07-25 05:32:05 +03:00
co-authored by Cursor
parent 08cc4b0f1b
commit 54eaff4c70
32 changed files with 1982 additions and 105 deletions
+40 -7
View File
@@ -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()