diff --git a/home/admin.py b/home/admin.py index ee54876..0c494b7 100644 --- a/home/admin.py +++ b/home/admin.py @@ -179,15 +179,9 @@ class RecruitRewardAdmin(admin.ModelAdmin): @admin.register(GuildRenameSettings) class GuildRenameSettingsAdmin(admin.ModelAdmin): - list_display = ('id', 'cost') - list_display_links = ('id',) # Hacemos que 'id' sea el enlace - list_editable = ('cost',) # Permitimos que 'cost' sea editable - fieldsets = ( - (None, { - 'fields': ('cost',) - }), - ) - + list_display = ('id', 'cost') # Asegúrate de incluir 'id' antes de 'cost' + list_display_links = ('id',) # Permite hacer clic en 'id' para editar + list_editable = ('cost',) # Ahora 'cost' es editable en línea @admin.register(VoteSite) class VoteSiteAdmin(admin.ModelAdmin): diff --git a/home/models.py b/home/models.py index a4a6400..f370fac 100644 --- a/home/models.py +++ b/home/models.py @@ -228,14 +228,10 @@ class SecurityToken(models.Model): class GuildRenameSettings(models.Model): - cost = models.IntegerField(default=1000, help_text="Costo en Donation Points (DP) para renombrar una hermandad.") + cost = models.DecimalField(max_digits=10, decimal_places=2, default=10, help_text="Costo en euros para renombrar una hermandad.") def __str__(self): - return f"Costo actual: {self.cost} DP" - - class Meta: - verbose_name = "Configuración de Renombrar Hermandad" - verbose_name_plural = "Configuraciones de Renombrar Hermandad" + return f"Configuración de renombrar hermandad - Costo: {self.cost} €" class VoteSite(models.Model): diff --git a/home/templates/account/guild_rename_cancel.html b/home/templates/account/guild_rename_cancel.html new file mode 100644 index 0000000..27abea5 --- /dev/null +++ b/home/templates/account/guild_rename_cancel.html @@ -0,0 +1,9 @@ + + + {% include 'partials/head.html' %} + {% include 'partials/header.html' %} + {% include 'partials/video.html' %} + {% include 'partials/guild_rename_cancel.html' %} + {% include 'partials/social.html' %} + {% include 'partials/footer.html' %} + {% include 'partials/final.html' %} \ No newline at end of file diff --git a/home/templates/account/guild_rename_success.html b/home/templates/account/guild_rename_success.html new file mode 100644 index 0000000..d721a4b --- /dev/null +++ b/home/templates/account/guild_rename_success.html @@ -0,0 +1,9 @@ + + + {% include 'partials/head.html' %} + {% include 'partials/header.html' %} + {% include 'partials/video.html' %} + {% include 'partials/guild_rename_success.html' %} + {% include 'partials/social.html' %} + {% include 'partials/footer.html' %} + {% include 'partials/final.html' %} \ No newline at end of file diff --git a/home/templates/partials/guild_rename_cancel.html b/home/templates/partials/guild_rename_cancel.html new file mode 100644 index 0000000..e69de29 diff --git a/home/templates/partials/guild_rename_success.html b/home/templates/partials/guild_rename_success.html new file mode 100644 index 0000000..e69de29 diff --git a/home/templates/partials/rename_guild.html b/home/templates/partials/rename_guild.html index 01d07e3..cc296dd 100644 --- a/home/templates/partials/rename_guild.html +++ b/home/templates/partials/rename_guild.html @@ -1,15 +1,16 @@
+

Renombrar Hermandad

- +

La herramienta Renombrar hermandad te permite cambiar de nombre a una hermandad de la cual seas Maestro de Hermandad.


@@ -25,18 +26,24 @@

-

Requiere {{ rename_cost }} PD

+

Requiere {{ rename_cost }} EUR


- {% if no_guild_leader_message %} {{ no_guild_leader_message }} {% else %} -
+ {% csrf_token %} - + @@ -44,18 +51,16 @@ - - - + + + + + + + - - -
+ +
- - -
- +
diff --git a/home/urls.py b/home/urls.py index ff1b669..faf05f6 100644 --- a/home/urls.py +++ b/home/urls.py @@ -73,6 +73,8 @@ urlpatterns = [ path('quest-character/', views.quest_character_view, name='quest-character'), path('send-gift/', views.send_gift_view, name='send-gift'), path("webhook/stripe/", stripe_webhook, name="stripe-webhook"), + path('guild-success/', views.guild_rename_success_view, name='guild-success'), + path('guild-cancel/', views.guild_rename_cancel_view, name='guild-cancel'), ] diff --git a/home/views.py b/home/views.py index 0f46786..44bb2ad 100644 --- a/home/views.py +++ b/home/views.py @@ -2338,27 +2338,23 @@ def transfer_d_points_view(request): # Renderizar la plantilla para la transferencia de puntos return render(request, 'account/transfer_d_points.html') + def rename_guild_view(request): - # Verificar si el usuario está autenticado mediante la sesión username = request.session.get('username') if not username: return redirect('login') - # Obtener el usuario desde la base de datos `acore_auth` user_data = get_user_from_acore(username) if not user_data: return redirect('login') user_id = user_data['id'] + email = user_data['email'] + + security_token = SecurityToken.objects.filter(user_id=user_id).first() + guild_settings, created = GuildRenameSettings.objects.get_or_create(defaults={'cost': 10}) + rename_cost = guild_settings.cost - # Obtener el costo desde la configuración - try: - settings = GuildRenameSettings.objects.first() - rename_cost = settings.cost if settings else 1000 - except GuildRenameSettings.DoesNotExist: - rename_cost = 1000 # Valor predeterminado si no se encuentra la configuración - - # Comprobar si hay personajes que sean líderes de una hermandad with connections['acore_characters'].cursor() as cursor: cursor.execute(""" SELECT g.guildid, g.name, gm.rank, c.name @@ -2370,43 +2366,97 @@ def rename_guild_view(request): guild_leader_data = cursor.fetchall() if not guild_leader_data: - no_guild_leader_message = "No tienes personajes que sean Maestros de Hermandad en tu cuenta." - else: - no_guild_leader_message = None + return JsonResponse({'success': False, 'message': 'Error: No tienes personajes que sean Maestros de Hermandad en tu cuenta.'}) + + 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': 'Error: Cuenta no encontrada.'}) + + account_id, email, acore_ip = account_info + client_ip = request.META.get('REMOTE_ADDR', '') if request.method == 'POST': - old_guild_name = request.POST.get('old-guild-name').strip() - new_guild_name = request.POST.get('new-guild-name').strip() - conf_new_guild_name = request.POST.get('conf-new-guild-name').strip() - current_password = request.POST.get('cur-password').strip() - security_token = request.POST.get('security-token').strip() + old_guild_name = request.POST.get('old-guild-name', '').strip() + new_guild_name = request.POST.get('new-guild-name', '').strip() + conf_new_guild_name = request.POST.get('conf-new-guild-name', '').strip() + current_password = request.POST.get('cur-password', '').strip() + token = request.POST.get('security-token', '').strip() - # Validar campos vacíos - if not old_guild_name or not new_guild_name or not conf_new_guild_name or not current_password or not security_token: - return JsonResponse({'success': False, 'message': 'Por favor, complete todos los campos.'}) + if not old_guild_name or not new_guild_name or not conf_new_guild_name or not current_password or not token: + return JsonResponse({'success': False, 'message': 'Por favor, completa todos los campos.'}) + + if not authenticate(username, current_password): + return JsonResponse({'success': False, 'message': 'La contraseña actual es incorrecta.'}) + + if not security_token or security_token.token != token: + return JsonResponse({'success': False, 'message': 'Token de seguridad incorrecto.'}) - # Verificar si el usuario tiene suficientes Donation Points (DP) - with connections['default'].cursor() as cursor: - cursor.execute("SELECT dp FROM home_api_points WHERE accountID = %s", [user_id]) - points_data = cursor.fetchone() + if new_guild_name != conf_new_guild_name: + return JsonResponse({'success': False, 'message': 'Los nombres nuevos no coinciden.'}) - if not points_data or points_data[0] < rename_cost: - return JsonResponse({'success': False, 'message': f'No tienes suficientes Donation Points (se requieren {rename_cost} DP).'}) - - if response is None: - return JsonResponse({'success': False, 'message': 'Error de comunicación con el servidor. Intente nuevamente más tarde.'}) + success_url = request.build_absolute_uri(reverse('guild-success')) + cancel_url = request.build_absolute_uri(reverse('guild-cancel')) - # Deducir los Donation Points del usuario - with connections['default'].cursor() as cursor: - cursor.execute("UPDATE home_api_points SET dp = dp - %s WHERE accountID = %s", [rename_cost, user_id]) + stripe_response = create_checkout_session( + account_id=user_id, + username=username, + email=email, + acore_ip=acore_ip, + amount=rename_cost, + character_name=old_guild_name, + success_url=success_url, + cancel_url=cancel_url, + product_name=f"Renombrar hermandad: {old_guild_name} → {new_guild_name}" + ) - return JsonResponse({'success': True, 'message': 'Hermandad renombrada exitosamente.'}) + if stripe_response["success"]: + request.session['guild_rename'] = { + 'old_name': old_guild_name, + 'new_name': new_guild_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, 'account/rename_guild.html', { 'guild_leader_data': guild_leader_data, - 'no_guild_leader_message': no_guild_leader_message, 'rename_cost': rename_cost }) + + +def guild_rename_success_view(request): + # Obtener los datos de la sesión + guild_rename_data = request.session.get('guild_rename') + if not guild_rename_data: + return redirect('rename-cancel') # Redirigir si no hay datos de renombrado + + old_guild_name = guild_rename_data.get('old_name') + new_guild_name = guild_rename_data.get('new_name') + + if not old_guild_name or not new_guild_name: + return redirect('rename-cancel') # Redirigir si faltan datos + + # Ejecutar el comando SOAP + command = f".guild rename {old_guild_name} {new_guild_name}" + response = execute_soap_command(command) + + # Limpiar la sesión después de la ejecución + request.session.pop('guild_rename', None) + + if response is None or response.strip() == "": + message = f"La Hermandad '{old_guild_name}' ha cambiado su nombre a '{new_guild_name}'. Cierra sesión y vuelve a entrar para que los cambios se reflejen en el juego." + return render(request, 'account/guild_rename_success.html', {'message': message}) + else: + return render(request, 'account/guild_rename_success.html', {'message': f"Error: {response}"}) def vote_points_view(request): # Verificar si el usuario tiene un `username` en la sesión @@ -2595,6 +2645,13 @@ def trade_points_view(request): """ return render(request, 'account/trade_points.html') +def guild_rename_cancel_view(request): + """ + Vista para la página de intercambio de puntos. + """ + return render(request, 'account/guild_rename_cancel.html') + + def help_view(request): # Verificar si el usuario está logueado diff --git a/static/nw-themes/nw-ryu/nw-js-handlers/rename_guild_response.js b/static/nw-themes/nw-ryu/nw-js-handlers/rename_guild_response.js index 8dc9aa7..26f95e0 100644 --- a/static/nw-themes/nw-ryu/nw-js-handlers/rename_guild_response.js +++ b/static/nw-themes/nw-ryu/nw-js-handlers/rename_guild_response.js @@ -39,41 +39,45 @@ $(function(){ var conf = confirm("¿Estás seguro de renombrar la hermandad seleccionada?"); if (conf === true) { - changeButton(button, 'Renombrando hermandad'); + changeButton(button, 'Procesando pago...'); $.ajax({ type: 'POST', - url: '', + url: '', // Asegúrate de que la URL es la correcta data: data, dataType: 'json', success: function(data) { - $("#rename-guild-response").append(data.message).hide().slideDown(); + if (data.success) { // ✅ Verificamos correctamente + if (typeof Stripe === 'undefined') { + console.error("Stripe.js no está cargado."); + $("#rename-guild-response").append('Error al cargar Stripe. Intente nuevamente más tarde.').hide().slideDown(); + restoreButton(button, buttonoriginal); + return; + } - if (data.success === true) { - button.html("Hermandad renombrada"); - button.css("color","#d79602"); - setTimeout(function() { - $("#nw-rename-guild-form")[0].reset(); - restoreButton(button, buttonoriginal); - doRefresh(); - }, 5000); - } - else { - setTimeout(function() { - $("#rename-guild-response").slideUp( function() { - $("#rename-guild-response").empty(); - restoreButton(button, buttonoriginal); - }); - }, 5000); + var stripe = Stripe(data.stripe_public_key); // ✅ Usamos correctamente el public key + + stripe.redirectToCheckout({ + sessionId: data.session_id // ✅ Ahora usamos data.session_id correctamente + }).then(function (result) { + if (result.error) { + $("#rename-guild-response").append('' + result.error.message + '').hide().slideDown(); + restoreButton(button, buttonoriginal); + } + }); + + } else { + $("#rename-guild-response").append(data.message).hide().slideDown(); + restoreButton(button, buttonoriginal); } }, - error: function() { - setTimeout(function() { - alert("Algo ha salido mal. Por favor intente más tarde"); - window.location.reload(); - }, 2000); + error: function () { + setTimeout(function () { + alert("Algo ha salido mal. Por favor intente más tarde"); + window.location.reload(); + }, 2000); } }); - }; + } }); });