Actualizacion la compra con logs logs correspondientes
This commit is contained in:
+241
-78
@@ -6,8 +6,9 @@ from django.db import connections
|
||||
from django.contrib import messages
|
||||
from django.contrib.auth import logout
|
||||
from django import forms
|
||||
import stripe
|
||||
from .pagos_stripe import create_checkout_session
|
||||
from .models import Noticia, ClienteCategoria, ServerSelection, RecruitAFriend, DownloadClientPage, ContentCreator, RecruitReward, ClaimedReward, AccountActivation, SecurityToken, GuildRenameSettings, VoteSite, VoteLog, HomeApiPoints, UnstuckHistory, ReviveHistory, RenamePrice, CustomizePrice, ChangeRacePrice, ChangeFactionPrice, LevelUpPrice, GoldPrice, TransferPrice, Category, Item
|
||||
from .models import Noticia, ClienteCategoria, ServerSelection, RecruitAFriend, DownloadClientPage, ContentCreator, RecruitReward, ClaimedReward, AccountActivation, SecurityToken, GuildRenameSettings, VoteSite, VoteLog, HomeApiPoints, UnstuckHistory, ReviveHistory, RenamePrice, CustomizePrice, ChangeRacePrice, ChangeFactionPrice, LevelUpPrice, GoldPrice, TransferPrice, Category, Item, StripeLog
|
||||
from django.views.decorators.csrf import csrf_exempt
|
||||
from datetime import datetime, timedelta
|
||||
from .zone_definitions import get_zone_name
|
||||
@@ -22,6 +23,27 @@ from decimal import Decimal, ROUND_HALF_UP
|
||||
# Configuración del logger
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@csrf_exempt
|
||||
def stripe_webhook(request):
|
||||
payload = request.body
|
||||
sig_header = request.META.get("HTTP_STRIPE_SIGNATURE")
|
||||
|
||||
try:
|
||||
event = stripe.Webhook.construct_event(payload, sig_header, settings.STRIPE_WEBHOOK_SECRET)
|
||||
|
||||
if event["type"] == "checkout.session.completed":
|
||||
session = event["data"]["object"]
|
||||
session_id = session["id"]
|
||||
stripe_ip = request.META.get("REMOTE_ADDR") # IP detectada
|
||||
|
||||
# 🔹 Actualizar la IP de Stripe en el log
|
||||
StripeLog.objects.filter(session_id=session_id).update(stripe_ip=stripe_ip, timestamp=now())
|
||||
|
||||
return JsonResponse({"success": True})
|
||||
|
||||
except stripe.error.SignatureVerificationError:
|
||||
return JsonResponse({"success": False, "message": "Firma de webhook no válida."}, status=400)
|
||||
|
||||
def get_class_css(class_id):
|
||||
class_map = {
|
||||
1: 'warrior',
|
||||
@@ -1141,45 +1163,60 @@ def rename_character_view(request):
|
||||
if not username:
|
||||
return redirect('login')
|
||||
|
||||
# Obtener personajes del usuario desde la base de datos `acore_characters`
|
||||
# 🔹 Obtener información de la cuenta desde acore_auth
|
||||
with connections['acore_auth'].cursor() as cursor:
|
||||
cursor.execute("""
|
||||
SELECT id, email, last_ip FROM account WHERE username = %s
|
||||
""", [username])
|
||||
account_info = cursor.fetchone()
|
||||
|
||||
if not account_info:
|
||||
return JsonResponse({'success': False, 'message': '<span class="red-form-response">Error: Cuenta no encontrada.</span>'})
|
||||
|
||||
account_id, email, acore_ip = account_info
|
||||
client_ip = request.META.get('REMOTE_ADDR', '')
|
||||
|
||||
# 🔹 Obtener personajes del usuario desde la base de datos `acore_characters`
|
||||
with connections['acore_characters'].cursor() as cursor:
|
||||
cursor.execute("""
|
||||
SELECT name
|
||||
FROM characters
|
||||
WHERE account = (
|
||||
SELECT id
|
||||
FROM acore_auth.account
|
||||
WHERE username = %s
|
||||
)
|
||||
""", [username])
|
||||
SELECT name FROM characters WHERE account = %s
|
||||
""", [account_id])
|
||||
characters = [row[0] for row in cursor.fetchall()]
|
||||
|
||||
# Obtener el precio del renombrado
|
||||
# 🔹 Obtener el precio del renombrado
|
||||
price_obj = RenamePrice.objects.first()
|
||||
price = price_obj.price if price_obj else 2.00
|
||||
|
||||
# Ejecutar el comando SOAP De prueba haber si el servidor funciona antes de proceder al pago
|
||||
|
||||
# 🔹 Ejecutar el comando SOAP para verificar el servidor
|
||||
command = f".server info"
|
||||
response = execute_soap_command(command)
|
||||
|
||||
if request.method == 'POST':
|
||||
character_name = request.POST.get('character')
|
||||
|
||||
|
||||
if response is None:
|
||||
return JsonResponse({'success': False, 'message': '<span class="red-form-response">Error de comunicación con el servidor. Intente nuevamente más tarde.</span>'})
|
||||
|
||||
# Validar si el personaje fue seleccionado
|
||||
if not character_name:
|
||||
return JsonResponse({'success': False, 'message': '<span class="red-form-response">Por favor, seleccione un personaje.</span>'})
|
||||
|
||||
# Verificar si el personaje pertenece al usuario
|
||||
if character_name not in characters:
|
||||
return JsonResponse({'success': False, 'message': '<span class="red-form-response">No tienes permiso para renombrar este personaje.</span>'})
|
||||
|
||||
# Crear sesión de pago con Stripe
|
||||
# 🔹 Crear sesión de pago con Stripe
|
||||
success_url = request.build_absolute_uri(reverse('rename-success'))
|
||||
cancel_url = request.build_absolute_uri(reverse('rename-cancel'))
|
||||
stripe_response = create_checkout_session(price, success_url=success_url, cancel_url=cancel_url, product_name=f"Renombrar personaje: {character_name}")
|
||||
stripe_response = create_checkout_session(
|
||||
account_id=account_id,
|
||||
username=username,
|
||||
email=email,
|
||||
acore_ip=acore_ip,
|
||||
amount=price,
|
||||
character_name=character_name,
|
||||
success_url=success_url,
|
||||
cancel_url=cancel_url,
|
||||
product_name=f"Renombrar personaje: {character_name}"
|
||||
)
|
||||
|
||||
if stripe_response["success"]:
|
||||
request.session['rename_character'] = character_name
|
||||
@@ -1244,17 +1281,25 @@ def customize_character_view(request):
|
||||
if not username:
|
||||
return redirect('login')
|
||||
|
||||
# Obtener personajes del usuario desde la base de datos `acore_characters`
|
||||
# ?? Obtener informaci��n de la cuenta desde acore_auth
|
||||
with connections['acore_auth'].cursor() as cursor:
|
||||
cursor.execute("""
|
||||
SELECT id, email, last_ip FROM account WHERE username = %s
|
||||
""", [username])
|
||||
account_info = cursor.fetchone()
|
||||
|
||||
if not account_info:
|
||||
return JsonResponse({'success': False, 'message': '<span class="red-form-response">Error: Cuenta no encontrada.</span>'})
|
||||
|
||||
account_id, email, acore_ip = account_info
|
||||
client_ip = request.META.get('REMOTE_ADDR', '')
|
||||
|
||||
# ?? Obtener personajes del usuario desde la base de datos `acore_characters`
|
||||
with connections['acore_characters'].cursor() as cursor:
|
||||
cursor.execute("""
|
||||
SELECT name
|
||||
FROM characters
|
||||
WHERE account = (
|
||||
SELECT id
|
||||
FROM acore_auth.account
|
||||
WHERE username = %s
|
||||
)
|
||||
""", [username])
|
||||
SELECT name FROM characters WHERE account = %s
|
||||
""", [account_id])
|
||||
|
||||
characters = [row[0] for row in cursor.fetchall()]
|
||||
|
||||
# Obtener el precio de la personalización (si se gestiona desde el admin)
|
||||
@@ -1275,7 +1320,17 @@ def customize_character_view(request):
|
||||
# Crear sesión de pago con Stripe
|
||||
success_url = request.build_absolute_uri(reverse('customize-success'))
|
||||
cancel_url = request.build_absolute_uri(reverse('customize-cancel'))
|
||||
stripe_response = create_checkout_session(price, success_url=success_url, cancel_url=cancel_url, product_name=f"Personalizar personaje: {character_name}")
|
||||
stripe_response = create_checkout_session(
|
||||
account_id=account_id,
|
||||
username=username,
|
||||
email=email,
|
||||
acore_ip=acore_ip,
|
||||
amount=price,
|
||||
character_name=character_name,
|
||||
success_url=success_url,
|
||||
cancel_url=cancel_url,
|
||||
product_name=f"Personalizar personaje: {character_name}"
|
||||
)
|
||||
|
||||
|
||||
if stripe_response["success"]:
|
||||
@@ -1319,16 +1374,23 @@ def change_race_character_view(request):
|
||||
return redirect('login')
|
||||
|
||||
# Obtener personajes del usuario desde la base de datos `acore_characters`
|
||||
with connections['acore_auth'].cursor() as cursor:
|
||||
cursor.execute("""
|
||||
SELECT id, email, last_ip FROM account WHERE username = %s
|
||||
""", [username])
|
||||
account_info = cursor.fetchone()
|
||||
|
||||
if not account_info:
|
||||
return JsonResponse({'success': False, 'message': '<span class="red-form-response">Error: Cuenta no encontrada.</span>'})
|
||||
|
||||
account_id, email, acore_ip = account_info
|
||||
client_ip = request.META.get('REMOTE_ADDR', '')
|
||||
|
||||
# ?? Obtener personajes del usuario desde la base de datos `acore_characters`
|
||||
with connections['acore_characters'].cursor() as cursor:
|
||||
cursor.execute("""
|
||||
SELECT name
|
||||
FROM characters
|
||||
WHERE account = (
|
||||
SELECT id
|
||||
FROM acore_auth.account
|
||||
WHERE username = %s
|
||||
)
|
||||
""", [username])
|
||||
SELECT name FROM characters WHERE account = %s
|
||||
""", [account_id])
|
||||
characters = [row[0] for row in cursor.fetchall()]
|
||||
|
||||
# Obtener el precio del cambio de raza
|
||||
@@ -1349,7 +1411,17 @@ def change_race_character_view(request):
|
||||
# Crear sesión de pago con Stripe
|
||||
success_url = request.build_absolute_uri(reverse('change-race-success'))
|
||||
cancel_url = request.build_absolute_uri(reverse('change-race-cancel'))
|
||||
stripe_response = create_checkout_session(price, success_url=success_url, cancel_url=cancel_url, product_name=f"Cambio de Raza del personaje: {character_name}")
|
||||
stripe_response = create_checkout_session(
|
||||
account_id=account_id,
|
||||
username=username,
|
||||
email=email,
|
||||
acore_ip=acore_ip,
|
||||
amount=price,
|
||||
character_name=character_name,
|
||||
success_url=success_url,
|
||||
cancel_url=cancel_url,
|
||||
product_name=f"Cambio de Raza del personaje: {character_name}"
|
||||
)
|
||||
|
||||
if stripe_response["success"]:
|
||||
# Guardar el personaje en la sesión para el cambio
|
||||
@@ -1392,16 +1464,23 @@ def change_faction_character_view(request):
|
||||
return redirect('login')
|
||||
|
||||
# Obtener personajes del usuario desde la base de datos `acore_characters`
|
||||
with connections['acore_auth'].cursor() as cursor:
|
||||
cursor.execute("""
|
||||
SELECT id, email, last_ip FROM account WHERE username = %s
|
||||
""", [username])
|
||||
account_info = cursor.fetchone()
|
||||
|
||||
if not account_info:
|
||||
return JsonResponse({'success': False, 'message': '<span class="red-form-response">Error: Cuenta no encontrada.</span>'})
|
||||
|
||||
account_id, email, acore_ip = account_info
|
||||
client_ip = request.META.get('REMOTE_ADDR', '')
|
||||
|
||||
# ?? Obtener personajes del usuario desde la base de datos `acore_characters`
|
||||
with connections['acore_characters'].cursor() as cursor:
|
||||
cursor.execute("""
|
||||
SELECT name
|
||||
FROM characters
|
||||
WHERE account = (
|
||||
SELECT id
|
||||
FROM acore_auth.account
|
||||
WHERE username = %s
|
||||
)
|
||||
""", [username])
|
||||
SELECT name FROM characters WHERE account = %s
|
||||
""", [account_id])
|
||||
characters = [row[0] for row in cursor.fetchall()]
|
||||
|
||||
# Obtener el precio del cambio de facción
|
||||
@@ -1422,7 +1501,17 @@ def change_faction_character_view(request):
|
||||
# Crear sesión de pago con Stripe
|
||||
success_url = request.build_absolute_uri(reverse('change-faction-success'))
|
||||
cancel_url = request.build_absolute_uri(reverse('change-faction-cancel'))
|
||||
stripe_response = create_checkout_session(price, success_url=success_url, cancel_url=cancel_url, product_name=f"Cambiar Faccion del personaje: {character_name}")
|
||||
stripe_response = create_checkout_session(
|
||||
account_id=account_id,
|
||||
username=username,
|
||||
email=email,
|
||||
acore_ip=acore_ip,
|
||||
amount=price,
|
||||
character_name=character_name,
|
||||
success_url=success_url,
|
||||
cancel_url=cancel_url,
|
||||
product_name=f"Cambiar Faccion del personaje: {character_name}"
|
||||
)
|
||||
|
||||
if stripe_response["success"]:
|
||||
# Guardar el personaje seleccionado en la sesión
|
||||
@@ -1466,16 +1555,23 @@ def level_up_character_view(request):
|
||||
return redirect('login')
|
||||
|
||||
# Obtener personajes del usuario desde la base de datos `acore_characters`
|
||||
with connections['acore_auth'].cursor() as cursor:
|
||||
cursor.execute("""
|
||||
SELECT id, email, last_ip FROM account WHERE username = %s
|
||||
""", [username])
|
||||
account_info = cursor.fetchone()
|
||||
|
||||
if not account_info:
|
||||
return JsonResponse({'success': False, 'message': '<span class="red-form-response">Error: Cuenta no encontrada.</span>'})
|
||||
|
||||
account_id, email, acore_ip = account_info
|
||||
client_ip = request.META.get('REMOTE_ADDR', '')
|
||||
|
||||
# ?? Obtener personajes del usuario desde la base de datos `acore_characters`
|
||||
with connections['acore_characters'].cursor() as cursor:
|
||||
cursor.execute("""
|
||||
SELECT name
|
||||
FROM characters
|
||||
WHERE account = (
|
||||
SELECT id
|
||||
FROM acore_auth.account
|
||||
WHERE username = %s
|
||||
)
|
||||
""", [username])
|
||||
SELECT name FROM characters WHERE account = %s
|
||||
""", [account_id])
|
||||
characters = [row[0] for row in cursor.fetchall()]
|
||||
|
||||
# Obtener el precio de subir a nivel 80
|
||||
@@ -1496,7 +1592,17 @@ def level_up_character_view(request):
|
||||
# Crear sesión de pago con Stripe
|
||||
success_url = request.build_absolute_uri(reverse('level-up-success'))
|
||||
cancel_url = request.build_absolute_uri(reverse('level-up-cancel'))
|
||||
stripe_response = create_checkout_session(price, success_url=success_url, cancel_url=cancel_url, product_name=f"Subir el Nivel 80 del personaje: {character_name}")
|
||||
stripe_response = create_checkout_session(
|
||||
account_id=account_id,
|
||||
username=username,
|
||||
email=email,
|
||||
acore_ip=acore_ip,
|
||||
amount=price,
|
||||
character_name=character_name,
|
||||
success_url=success_url,
|
||||
cancel_url=cancel_url,
|
||||
product_name=f"Subir el Nivel 80 del personaje: {character_name}"
|
||||
)
|
||||
|
||||
if stripe_response["success"]:
|
||||
# Guardar el personaje en la sesión para usarlo después del pago
|
||||
@@ -1542,19 +1648,30 @@ def gold_character_view(request):
|
||||
return redirect('login')
|
||||
|
||||
# Obtener personajes y estado de conexión del usuario
|
||||
with connections['acore_characters'].cursor() as cursor:
|
||||
cursor.execute("""
|
||||
SELECT name, online, money
|
||||
FROM characters
|
||||
WHERE account = (
|
||||
SELECT id
|
||||
FROM acore_auth.account
|
||||
WHERE username = %s
|
||||
)
|
||||
""", [username])
|
||||
characters_data = cursor.fetchall()
|
||||
try:
|
||||
with connections['acore_auth'].cursor() as cursor:
|
||||
cursor.execute("""
|
||||
SELECT id, email, last_ip FROM account WHERE username = %s
|
||||
""", [username])
|
||||
account_info = cursor.fetchone()
|
||||
|
||||
characters = {row[0]: {'online': row[1], 'money': row[2]} for row in characters_data}
|
||||
if not account_info:
|
||||
return JsonResponse({'success': False, 'message': '<span class="red-form-response">Error: Cuenta no encontrada.</span>'})
|
||||
|
||||
account_id, email, acore_ip = account_info
|
||||
client_ip = request.META.get('REMOTE_ADDR', '')
|
||||
|
||||
# Obtener personajes del usuario desde la base de datos `acore_characters`
|
||||
with connections['acore_characters'].cursor() as cursor:
|
||||
cursor.execute("""
|
||||
SELECT name, online, money FROM characters WHERE account = %s
|
||||
""", [account_id])
|
||||
characters_data = cursor.fetchall()
|
||||
|
||||
characters = {row[0]: {'online': row[1], 'money': row[2]} for row in characters_data}
|
||||
|
||||
except Exception as e:
|
||||
return JsonResponse({'success': False, 'message': f'<span class="red-form-response">Error al obtener los personajes: {str(e)}</span>'})
|
||||
|
||||
# Obtener precios del oro
|
||||
gold_prices = GoldPrice.objects.all().order_by('gold_amount')
|
||||
@@ -1588,7 +1705,19 @@ def gold_character_view(request):
|
||||
# Crear sesión de pago con Stripe
|
||||
success_url = request.build_absolute_uri(reverse('gold-success'))
|
||||
cancel_url = request.build_absolute_uri(reverse('gold-cancel'))
|
||||
stripe_response = create_checkout_session(price, success_url=success_url, cancel_url=cancel_url, product_name=f"Aumentar el Oro: {gold_amount} al Personaje: {character_name}")
|
||||
|
||||
# Llamada corregida a create_checkout_session con todos los parámetros requeridos
|
||||
stripe_response = create_checkout_session(
|
||||
account_id=account_id,
|
||||
username=username,
|
||||
email=email,
|
||||
acore_ip=acore_ip,
|
||||
amount=stripe_price, # El precio calculado
|
||||
character_name=character_name,
|
||||
success_url=success_url,
|
||||
cancel_url=cancel_url,
|
||||
product_name=f"Aumentar el Oro: {gold_amount} al Personaje: {character_name}"
|
||||
)
|
||||
|
||||
if stripe_response["success"]:
|
||||
# Guardar en sesión los datos para el callback tras el pago
|
||||
@@ -1645,12 +1774,12 @@ def transfer_character_view(request):
|
||||
|
||||
# Obtener el ID de usuario desde acore_auth.account
|
||||
with connections['acore_auth'].cursor() as cursor:
|
||||
cursor.execute("SELECT id FROM account WHERE username = %s", [username])
|
||||
cursor.execute("SELECT id, email, last_ip FROM account WHERE username = %s", [username])
|
||||
user_data = cursor.fetchone()
|
||||
if not user_data:
|
||||
return JsonResponse({'success': False, 'message': '<span class="red-form-response">Cuenta no encontrada. Por favor, inicie sesión nuevamente.</span>'})
|
||||
|
||||
user_id = user_data[0] # ID de la cuenta
|
||||
user_id, email, acore_ip = user_data # ID de la cuenta, email y la última IP
|
||||
|
||||
# Obtener personajes de la cuenta de origen
|
||||
with connections['acore_characters'].cursor() as cursor:
|
||||
@@ -1722,7 +1851,19 @@ def transfer_character_view(request):
|
||||
# Crear sesión de pago con Stripe
|
||||
success_url = request.build_absolute_uri(reverse('transfer-success'))
|
||||
cancel_url = request.build_absolute_uri(reverse('transfer-cancel'))
|
||||
stripe_response = create_checkout_session(price, success_url=success_url, cancel_url=cancel_url, product_name=f"Trasnferir el personaje: {character_name} a la cuenta de destino: {destination_account}")
|
||||
|
||||
# Llamada corregida a create_checkout_session con todos los parámetros requeridos
|
||||
stripe_response = create_checkout_session(
|
||||
username=username,
|
||||
email=email,
|
||||
acore_ip=acore_ip,
|
||||
account_id=user_id, # Pasar el account_id
|
||||
amount=price, # El precio de la transferencia
|
||||
character_name=character_name,
|
||||
success_url=success_url,
|
||||
cancel_url=cancel_url,
|
||||
product_name=f"Transferir el personaje: {character_name} a la cuenta de destino: {destination_account}"
|
||||
)
|
||||
|
||||
if stripe_response["success"]:
|
||||
# Guardar los datos de la transferencia en la sesión para usarlos después del pago
|
||||
@@ -1805,7 +1946,7 @@ def store_novawow_view(request):
|
||||
# Obtener carrito desde la sesión
|
||||
carrito = request.session.get('carrito', [])
|
||||
|
||||
# ✅ Calcular el precio total con 2 decimales
|
||||
# Calcular el precio total con 2 decimales
|
||||
total_price = sum(Decimal(item['precio']) for item in carrito)
|
||||
total_price_with_iva = (total_price * Decimal('1.21')).quantize(Decimal('0.01'), rounding=ROUND_HALF_UP)
|
||||
|
||||
@@ -1818,11 +1959,11 @@ def store_novawow_view(request):
|
||||
if not character_name:
|
||||
return JsonResponse({'success': False, 'message': 'Por favor, selecciona un personaje.'})
|
||||
|
||||
# ✅ ACTUALIZAR EL CARRITO Y FORZAR LA SESIÓN
|
||||
# ACTUALIZAR EL CARRITO Y FORZAR LA SESIÓN
|
||||
request.session['carrito'] = carrito
|
||||
request.session.modified = True # Forzar que Django guarde la sesión inmediatamente
|
||||
|
||||
# ✅ RECALCULAR EL PRECIO CON EL CARRITO ACTUALIZADO
|
||||
# RECALCULAR EL PRECIO CON EL CARRITO ACTUALIZADO
|
||||
total_price = sum(Decimal(item['precio']) for item in carrito)
|
||||
total_price_with_iva = (total_price * Decimal('1.21')).quantize(Decimal('0.01'), rounding=ROUND_HALF_UP)
|
||||
|
||||
@@ -1830,15 +1971,36 @@ def store_novawow_view(request):
|
||||
if character_name not in characters:
|
||||
return JsonResponse({'success': False, 'message': 'No tienes permiso para renombrar este personaje.'})
|
||||
|
||||
# ✅ Definir siempre `product_description` antes de usarlo
|
||||
# Definir siempre `product_description` antes de usarlo
|
||||
product_description = ", ".join([f"{item.get('nombre', 'Ítem desconocido')} x{item.get('cantidad', 1)}" for item in carrito])
|
||||
|
||||
# Obtener detalles del usuario
|
||||
with connections['acore_auth'].cursor() as cursor:
|
||||
cursor.execute("SELECT id, email, last_ip FROM account WHERE username = %s", [username])
|
||||
user_data = cursor.fetchone()
|
||||
|
||||
if not user_data:
|
||||
return JsonResponse({'success': False, 'message': 'Cuenta no encontrada.'})
|
||||
|
||||
user_id, email, acore_ip = user_data # ID de la cuenta, email y la última IP
|
||||
|
||||
# Crear sesión de pago con Stripe
|
||||
success_url = request.build_absolute_uri(reverse('store-novawow/success'))
|
||||
cancel_url = request.build_absolute_uri(reverse('store-novawow/cancel'))
|
||||
stripe_response = create_checkout_session(total_price_with_iva, success_url=success_url, cancel_url=cancel_url, product_name=f"Compra de items del personaje: {character_name} : {product_description}")
|
||||
|
||||
# Llamada corregida a create_checkout_session con todos los parámetros requeridos
|
||||
stripe_response = create_checkout_session(
|
||||
username=username,
|
||||
email=email,
|
||||
acore_ip=acore_ip,
|
||||
account_id=user_id, # Pasar el account_id
|
||||
amount=total_price_with_iva, # El precio con IVA
|
||||
character_name=character_name,
|
||||
success_url=success_url,
|
||||
cancel_url=cancel_url,
|
||||
product_name=f"Compra de ítems para el personaje: {character_name} : {product_description}"
|
||||
)
|
||||
|
||||
if stripe_response["success"]:
|
||||
request.session['store_novawow'] = character_name
|
||||
return JsonResponse({
|
||||
@@ -1854,8 +2016,9 @@ def store_novawow_view(request):
|
||||
'store_data': store_data,
|
||||
'categories': categories,
|
||||
'total_price': total_price_with_iva
|
||||
})
|
||||
|
||||
})
|
||||
|
||||
|
||||
from collections import Counter
|
||||
|
||||
def store_novawow_success_view(request):
|
||||
|
||||
Reference in New Issue
Block a user