Implementacion Inicial de la Tienda

This commit is contained in:
adevopg
2025-02-15 23:36:48 +01:00
parent fa8a0e0891
commit 41c3c6ae91
12 changed files with 420 additions and 125 deletions
+98 -70
View File
@@ -4,6 +4,7 @@ import gmpy2
import binascii
import os
import re
import json
from django.shortcuts import render, redirect
from django.urls import reverse
from django.http import HttpResponse, JsonResponse
@@ -12,7 +13,7 @@ from django.contrib import messages
from django.contrib.auth import logout
from django import forms
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, StoreCategory, StoreItem, Cart
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 django.views.decorators.csrf import csrf_exempt
import logging
from datetime import datetime, timedelta
@@ -1164,7 +1165,7 @@ def rename_character_view(request):
price_obj = RenamePrice.objects.first()
price = price_obj.price if price_obj else 2.00
# Ejecutar el comando SOAP
# Ejecutar el comando SOAP De prueba haber si el servidor funciona antes de proceder al pago
command = f".server info"
response = execute_soap_command(command)
@@ -1723,6 +1724,8 @@ def transfer_character_view(request):
return render(request, 'account/transfer_character.html', {'characters': characters, 'price': price})
def transfer_success_view(request):
transfer_data = request.session.get('transfer_data')
if not transfer_data:
@@ -1745,88 +1748,113 @@ def transfer_success_view(request):
def transfer_cancel_view(request):
return render(request, 'account/transfer_cancel.html')
from decimal import Decimal
from django.http import JsonResponse
def store_novawow_success_view(request):
return render(request, 'store/store_novawow_success.html')
def store_novawow_cancel_view(request):
return render(request, 'store/store_novawow_cancel.html')
def store_novawow_view(request):
username = request.session.get('username')
if not username:
return redirect('login')
category_name = request.GET.get("category")
categories = StoreCategory.objects.filter(parent_category=None)
items = StoreItem.objects.all()
cart_items = Cart.objects.filter(username=username)
# 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])
characters = [row[0] for row in cursor.fetchall()]
total_price = sum([item.total_price() for item in cart_items])
# Obtener categorías e ítems
categories = Category.objects.prefetch_related("items").all()
store_data = {category.name: list(category.items.values()) for category in categories}
# Si se está solicitando una categoría específica, devolver solo los ítems de esa categoría
if category_name:
items_in_category = Category.objects.get(name=category_name).items.values()
return JsonResponse({'success': True, 'items': list(items_in_category)})
return render(request, 'account/store_novawow.html', {
# Si el carrito está en la sesión
carrito = request.session.get('carrito', [])
total_price = sum(item['price'] for item in carrito) * Decimal('1.21') # Incluir IVA
if request.method == 'POST':
# Obtener datos del body
data = json.loads(request.body)
character_name = data.get('character')
if not character_name:
return JsonResponse({'success': False, 'message': 'Por favor, selecciona un personaje.'})
# Verificar si el personaje pertenece al usuario
if character_name not in characters:
return JsonResponse({'success': False, 'message': 'No tienes permiso para renombrar este personaje.'})
# 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, success_url=success_url, cancel_url=cancel_url)
if stripe_response["success"]:
request.session['store_novawow'] = character_name
return JsonResponse({
'success': True,
'session_id': stripe_response["session_id"],
'stripe_public_key': settings.STRIPE_PUBLIC_KEY
})
else:
return JsonResponse({'success': False, 'message': f'Error al iniciar el pago: {stripe_response["error"]}'})
return render(request, 'store/store_novawow.html', {
'characters': characters,
'store_data': store_data,
'categories': categories,
'items': items,
'cart_items': cart_items,
'total_price': total_price,
})
def add_to_cart(request):
username = request.session.get('username')
if not username:
return redirect('login')
if request.method == 'POST':
item_id = request.POST.get('item_id')
item = StoreItem.objects.get(id=item_id)
Cart.objects.create(username=username, item=item)
return JsonResponse({'success': True, 'message': f'{item.name} añadido al carrito.'})
return JsonResponse({'success': False, 'message': 'Error al añadir al carrito.'})
def remove_from_cart(request):
username = request.session.get('username')
if not username:
return redirect('login')
if request.method == 'POST':
cart_id = request.POST.get('cart_id')
Cart.objects.filter(id=cart_id, username=username).delete()
return JsonResponse({'success': True, 'message': 'Artículo eliminado del carrito.'})
return JsonResponse({'success': False, 'message': 'Error al eliminar del carrito.'})
def checkout_view(request):
username = request.session.get('username')
if not username:
return redirect('login')
cart_items = Cart.objects.filter(username=username)
total_price = sum([item.total_price() for item in cart_items])
success_url = request.build_absolute_uri(reverse('checkout_success'))
cancel_url = request.build_absolute_uri(reverse('checkout_cancel'))
stripe_response = create_checkout_session(total_price, success_url, cancel_url)
if stripe_response["success"]:
return JsonResponse({'success': True, 'session_id': stripe_response["session_id"]})
'total_price': total_price
})
return JsonResponse({'success': False, 'message': 'Error al procesar el pago.'})
def store_novawow_success_view(request):
# Procesar el comando SOAP tras el pago exitoso
character_name = request.session.get('store_novawow')
if not character_name:
return redirect('store-novawow')
def checkout_success(request):
username = request.session.get('username')
if not username:
return redirect('login')
command = f".send item {character_name}"
response = execute_soap_command(command)
cart_items = Cart.objects.filter(username=username)
if response is None or response.strip() == "":
message = f"El personaje {character_name} se a anadido los items de la compra."
request.session.pop('store_novawow', None) # Limpiar la sesión
return render(request, 'store/store_success.html', {'message': message})
else:
return render(request, 'store/store_success.html', {'message': f"Error: {response}"})
for cart_item in cart_items:
command = f".send item {cart_item.item.item_id} {cart_item.item.name} {username}"
execute_soap_command(command)
cart_item.delete()
return render(request, 'account/checkout_success.html', {'message': 'Compra procesada con éxito.'})
def store_novawow_buscar_categoria_view(request, categoria):
try:
# Buscar la categoría desde el parámetro de la URL
category = Category.objects.get(name=categoria)
items = category.items.all().values("id", "name", "price", "image_url")
return JsonResponse({"success": True, "items": list(items)})
except Category.DoesNotExist:
return JsonResponse({"success": False, "message": "Categoría no encontrada"}, status=404)
def checkout_cancel(request):
username = request.session.get('username')
if not username:
return redirect('login')
return render(request, 'account/checkout_cancel.html', {'message': 'Compra cancelada.'})
def revive_character_view(request):
username = request.session.get('username')