Implementado Cambio de Nombre Hermandad de Stripe

This commit is contained in:
adevopg
2025-02-20 17:27:00 +01:00
parent 3f962f8368
commit 9a96fad61b
10 changed files with 168 additions and 92 deletions
+3 -9
View File
@@ -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):
+2 -6
View File
@@ -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):
@@ -0,0 +1,9 @@
<!DOCTYPE html>
{% 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' %}
@@ -0,0 +1,9 @@
<!DOCTYPE html>
{% 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' %}
+17 -12
View File
@@ -1,12 +1,13 @@
<div class="main-page">
<div class="middle-content">
<div class="body-content">
<script src="https://js.stripe.com/v3/"></script>
<div class="title-content"><h1>Renombrar Hermandad</h1></div>
<div class="box-content">
<div class="title-box-content">
<h2>Información</h2>
<a class="back-to-account" href="my-account">Regresar a mi cuenta</a>
<a class="back-to-account-responsive" href="my-account">Regresar</a>
<a class="back-to-account" href="{% url 'my-account' %}">Regresar a mi cuenta</a>
<a class="back-to-account-responsive" href="{% url 'my-account' %}">Regresar</a>
</div>
<div class="body-box-content justified">
<script src="{{ URL_PRINCIPAL }}/static/nw-themes/nw-ryu/nw-js-handlers/rename_guild_response.js"></script>
@@ -25,18 +26,24 @@
</fieldset>
<div class="centered">
<br>
<p>Requiere <span>{{ rename_cost }}</span> <span class="yellow-info">PD</span></p>
<p>Requiere <span>{{ rename_cost }}</span> <span class="yellow-info">EUR</span></p>
<br>
<!-- Mostrar mensaje solo si no hay personajes líderes de hermandad -->
{% if no_guild_leader_message %}
<span class="red-form-response">{{ no_guild_leader_message }}</span>
{% else %}
<form id="nw-rename-guild-form" method="POST" accept-charset="utf-8">
<form id="nw-rename-guild-form" method="POST" action="{% url 'rename-guild' %}" accept-charset="utf-8">
{% csrf_token %}
<table class="middle-center-table">
<tr>
<td><input type="text" maxlength="24" name="old-guild-name" id="old-guild-name" placeholder="Nombre antiguo de hermandad"></td>
<td>
<select name="old-guild-name" id="old-guild-name">
<option value="">Selecciona tu hermandad</option>
{% for guild in guild_leader_data %}
<option value="{{ guild.1 }}">{{ guild.1 }}</option>
{% endfor %}
</select>
</td>
</tr>
<tr>
<td><input type="text" maxlength="24" name="new-guild-name" id="new-guild-name" placeholder="Nuevo nombre de hermandad"></td>
@@ -45,17 +52,15 @@
<td><input type="text" maxlength="24" name="conf-new-guild-name" id="conf-new-guild-name" placeholder="Confirmar nuevo nombre"></td>
</tr>
<tr>
<td><input type="password" maxlength="16" name="cur-password" id="cur-password" placeholder="Contraseña actual"></td>
<td><input type="password" name="cur-password" id="cur-password" placeholder="Contraseña actual"></td>
</tr>
<tr>
<td>
<input type="password" maxlength="6" name="security-token" id="security-token" placeholder="Token de seguridad">
<span class="far fa-eye toggle-token"></span>
</td>
<td><input type="text" name="security-token" id="security-token" placeholder="Token de seguridad"></td>
</tr>
<tr>
<td>
<button type="submit" class="rename-guild-button" data-id="RenameGuild">Renombrar Hermandad</button>
<button type="submit" class="rename-guild-button" data-id="RenameGuild">Proceder al Pago</button>
</td>
</tr>
</table>
+2
View File
@@ -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'),
]
+90 -33
View File
@@ -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']
# 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
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
# 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,44 +2366,98 @@ 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': '<span class="red-form-response">Error: No tienes personajes que sean Maestros de Hermandad en tu cuenta.</span>'})
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', '')
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': '<span class="red-form-response">Por favor, complete todos los campos.</span>'})
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': '<span class="red-form-response">Por favor, completa todos los campos.</span>'})
# 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 not authenticate(username, current_password):
return JsonResponse({'success': False, 'message': '<span class="red-form-response">La contraseña actual es incorrecta.</span>'})
if not points_data or points_data[0] < rename_cost:
return JsonResponse({'success': False, 'message': f'<span class="red-form-response">No tienes suficientes Donation Points (se requieren {rename_cost} DP).</span>'})
if not security_token or security_token.token != token:
return JsonResponse({'success': False, 'message': '<span class="red-form-response">Token de seguridad incorrecto.</span>'})
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>'})
if new_guild_name != conf_new_guild_name:
return JsonResponse({'success': False, 'message': '<span class="red-form-response">Los nombres nuevos no coinciden.</span>'})
# 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])
success_url = request.build_absolute_uri(reverse('guild-success'))
cancel_url = request.build_absolute_uri(reverse('guild-cancel'))
return JsonResponse({'success': True, 'message': '<span class="ok-form-response">Hermandad renombrada exitosamente.</span>'})
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}"
)
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
username = request.session.get('username')
@@ -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
@@ -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 === true) {
button.html("Hermandad renombrada");
button.css("color","#d79602");
setTimeout(function() {
$("#nw-rename-guild-form")[0].reset();
if (data.success) { // ✅ Verificamos correctamente
if (typeof Stripe === 'undefined') {
console.error("Stripe.js no está cargado.");
$("#rename-guild-response").append('<span class="red-form-response">Error al cargar Stripe. Intente nuevamente más tarde.</span>').hide().slideDown();
restoreButton(button, buttonoriginal);
doRefresh();
}, 5000);
return;
}
else {
setTimeout(function() {
$("#rename-guild-response").slideUp( function() {
$("#rename-guild-response").empty();
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('<span class="red-form-response">' + result.error.message + '</span>').hide().slideDown();
restoreButton(button, buttonoriginal);
}
});
}, 5000);
} else {
$("#rename-guild-response").append(data.message).hide().slideDown();
restoreButton(button, buttonoriginal);
}
},
error: function() {
setTimeout(function() {
error: function () {
setTimeout(function () {
alert("Algo ha salido mal. Por favor intente más tarde");
window.location.reload();
}, 2000);
}
});
};
}
});
});