Fase 3 (isla): recuperar personaje (restore_character) en React/TSX

restore_character_view pasa de redirect+messages a JSON en POST: guid -> SOAP
.char del restore -> {success, message, redirect}. RestoreCharacterForm.tsx
(select de personajes borrados + botón) hace fetch y en éxito redirige a my-account.
La vista pasa character_data por json_script; se conserva la rama sin personajes.

Verificado: check OK, ambas ramas renderizan, redirige a login sin sesión.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-12 21:57:49 +00:00
parent ff458379b0
commit 08c36619f0
5 changed files with 116 additions and 21 deletions
@@ -33,15 +33,13 @@
<p>{{ message }}</p>
{% endif %}
{% if character_list %}
<form method="POST">
{% csrf_token %}
<select name="guid">
{% for character in character_list %}
<option value="{{ character.guid }}">{{ character.name }} (LvL {{ character.level }})</option>
{% endfor %}
</select>
<button type="submit">Restaurar Personaje</button>
</form>
{% load django_vite %}
<!-- Isla React (Vite): recuperar personaje borrado (guid -> SOAP). -->
<div id="restore-character-app"
data-csrf="{{ csrf_token }}"
data-url="{% url 'restore-character' %}"></div>
{{ character_data|json_script:"restore-character-data" }}
{% vite_asset 'src/entries/restore_character.tsx' %}
{% else %}
<span>No hay personajes eliminados disponibles para restaurar.</span>
{% endif %}
+14 -12
View File
@@ -121,25 +121,23 @@ def restore_character_view(request):
guid = request.POST.get('guid')
if not guid:
messages.error(request, "No se seleccionó un personaje para restaurar.")
return redirect('restore-character')
return JsonResponse({'success': False, 'message': '<span class="red-form-response">No se seleccionó un personaje para restaurar.</span>'})
# Aquí es donde usamos SOAP en lugar de la actualización directa
# Restaurar vía SOAP y responder en JSON (isla React)
try:
command = f".char del restore {guid}" # Comando SOAP para restaurar el personaje
response = execute_soap_command(command) # Ejecuta el comando SOAP
# Si la respuesta es exitosa, informamos al usuario
if response == "success":
messages.success(request, "Personaje restaurado exitosamente.")
return redirect('my-account') # Redirigir a la cuenta del usuario
return JsonResponse({
'success': True,
'message': '<span class="ok-form-response">Personaje restaurado exitosamente.</span>',
'redirect': reverse('my-account'),
})
else:
messages.error(request, "Hubo un error al restaurar el personaje.")
return redirect('restore-character')
return JsonResponse({'success': False, 'message': '<span class="red-form-response">Hubo un error al restaurar el personaje.</span>'})
except Exception as e:
messages.error(request, f"Hubo un error al intentar restaurar el personaje: {str(e)}")
return redirect('restore-character')
return JsonResponse({'success': False, 'message': f'<span class="red-form-response">Hubo un error al intentar restaurar el personaje: {str(e)}</span>'})
# Realizar la consulta para obtener los personajes eliminados de la cuenta
with connections['acore_characters'].cursor() as cursor:
@@ -172,7 +170,11 @@ def restore_character_view(request):
# Renderiza la plantilla con los personajes eliminados
return render(request, 'account/restore_character.html', {
'character_list': character_list
'character_list': character_list,
'character_data': [
{'guid': c['guid'], 'name': c['name'], 'level': c['level']}
for c in character_list
],
})
def restore_items_view(request):
username = request.session.get('username')