Fase 3: migra gold, transfer, revive y unstuck a islas
- revive/unstuck (acciones SOAP gratuitas): reutilizan CharacterPurchaseForm; se hace el precio opcional (botón sin "por X €" cuando no hay precio). El componente ya maneja la respuesta sin session_id mostrando el mensaje. - gold: variante GoldForm (personaje + cantidad de oro -> Stripe). La vista pasa ahora character_names y gold_options (serializables) por json_script. - transfer: variante TransferForm (personaje + cuenta destino + token -> Stripe). La vista pasa character_names por json_script. Verificado: check OK, plantillas renderizan las islas, las 4 páginas redirigen a login sin sesión. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -9,24 +9,14 @@
|
||||
</div>
|
||||
<div class="body-box-content justified">
|
||||
<p>Selecciona un personaje y la cantidad de oro:</p>
|
||||
<script src="{{ URL_PRINCIPAL }}/static/nw-themes/nw-ryu/nw-js-handlers/gold_response.js"></script>
|
||||
<script src="https://js.stripe.com/v3/"></script>
|
||||
<form id="nw-gold-form">
|
||||
<select name="character" required>
|
||||
<option value="" selected disabled>Seleccione un personaje</option>
|
||||
{% for character, data in characters.items %}
|
||||
<option value="{{ character }}">{{ character }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
<select name="gold_amount" required>
|
||||
<option value="" selected disabled>Seleccione cantidad de oro</option>
|
||||
{% for price in gold_prices %}
|
||||
<option value="{{ price.gold_amount }}">{{ price.gold_amount }} oro - {{ price.price }} EUR</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
<button type="button" class="gold-button">Enviar oro</button>
|
||||
</form>
|
||||
<div id="gold-response"></div>
|
||||
{% load django_vite %}
|
||||
<!-- Isla React (Vite): enviar oro (personaje + cantidad -> Stripe). -->
|
||||
<div id="gold-app"
|
||||
data-csrf="{{ csrf_token }}"
|
||||
data-url="{% url 'gold-character' %}"></div>
|
||||
{{ character_names|json_script:"gold-characters-data" }}
|
||||
{{ gold_options|json_script:"gold-options-data" }}
|
||||
{% vite_asset 'src/entries/gold_character.tsx' %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -15,24 +15,18 @@
|
||||
{% if characters %}
|
||||
<p>Escoge el personaje que quieres revivir:</p>
|
||||
<br>
|
||||
<script src="{{ URL_PRINCIPAL }}/static/nw-themes/nw-ryu/nw-js-handlers/revive_response.js"></script>
|
||||
<form id="nw-revive-form" action="" method="POST" accept-charset="utf-8">
|
||||
{% csrf_token %}
|
||||
<select name="character">
|
||||
<option disabled selected value="">Seleccione un personaje</option>
|
||||
{% for character in characters %}
|
||||
<option value="{{ character }}">{{ character }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
<br>
|
||||
<button class="revive-button" type="submit" name="revive" data-id="Revivir">Revivir</button>
|
||||
</form>
|
||||
<br>
|
||||
{% load django_vite %}
|
||||
<!-- Isla React (Vite): acción de personaje (SOAP, sin pago). -->
|
||||
<div id="character-purchase-app"
|
||||
data-csrf="{{ csrf_token }}"
|
||||
data-url="{% url 'revive-character' %}"
|
||||
data-label="Revivir"
|
||||
data-button-class="revive-button"></div>
|
||||
{{ characters|json_script:"character-purchase-data" }}
|
||||
{% vite_asset 'src/entries/character_purchase.tsx' %}
|
||||
{% else %}
|
||||
<p>No hay personajes disponibles para revivir.</p>
|
||||
<p>No tienes personajes para revivir.</p>
|
||||
{% endif %}
|
||||
<hr>
|
||||
<div class="alert-message" id="revive-response"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -8,21 +8,14 @@
|
||||
<a class="back-to-account" href="{% url 'my-account' %}">Regresar a mi cuenta</a>
|
||||
</div>
|
||||
<div class="body-box-content justified">
|
||||
<script src="{{ URL_PRINCIPAL }}/static/nw-themes/nw-ryu/nw-js-handlers/transfer_character_response.js"></script>
|
||||
<script src="https://js.stripe.com/v3/"></script>
|
||||
<form id="nw-transfer-character-form">
|
||||
<select name="character" required>
|
||||
<option value="" selected disabled>Seleccione un personaje</option>
|
||||
{% for character in characters %}
|
||||
<option value="{{ character.0 }}">{{ character.0 }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
<input type="text" name="destination_account" placeholder="Cuenta destino" required>
|
||||
<input type="password" name="security_token" placeholder="Token de seguridad" required>
|
||||
<button type="button" class="transfer-button">Transferir por {{ price }} €</button>
|
||||
</form>
|
||||
<hr>
|
||||
<center><div id="transfer-character-response"></div></center>
|
||||
{% load django_vite %}
|
||||
<!-- Isla React (Vite): transferir personaje (destino + token -> Stripe). -->
|
||||
<div id="transfer-app"
|
||||
data-csrf="{{ csrf_token }}"
|
||||
data-url="{% url 'transfer-character' %}"
|
||||
data-price="{{ price }}"></div>
|
||||
{{ character_names|json_script:"transfer-characters-data" }}
|
||||
{% vite_asset 'src/entries/transfer_character.tsx' %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -22,20 +22,15 @@
|
||||
</fieldset>
|
||||
<div class="centered">
|
||||
<p>Escoge el personaje que quieres desbloquear</p>
|
||||
<script src="{{ URL_PRINCIPAL }}/static/nw-themes/nw-ryu/nw-js-handlers/unstuck_response.js"></script>
|
||||
<form id="nw-unstuck-form" method="POST" accept-charset="utf-8">
|
||||
{% csrf_token %}
|
||||
<select name="character" required>
|
||||
<option disabled selected value="">Selecciona un personaje</option>
|
||||
{% for character in characters %}
|
||||
<option value="{{ character }}">{{ character }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
<br>
|
||||
<button class="unstuck-button" type="submit" name="unstuck" data-id="Desbloquear">Desbloquear</button>
|
||||
</form>
|
||||
<hr>
|
||||
<div class="alert-message" id="unstuck-response"></div>
|
||||
{% load django_vite %}
|
||||
<!-- Isla React (Vite): acción de personaje (SOAP, sin pago). -->
|
||||
<div id="character-purchase-app"
|
||||
data-csrf="{{ csrf_token }}"
|
||||
data-url="{% url 'unstuck-character' %}"
|
||||
data-label="Desbloquear"
|
||||
data-button-class="unstuck-button"></div>
|
||||
{{ characters|json_script:"character-purchase-data" }}
|
||||
{% vite_asset 'src/entries/character_purchase.tsx' %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -702,7 +702,12 @@ def gold_character_view(request):
|
||||
else:
|
||||
return JsonResponse({'success': False, 'message': f'<span class="red-form-response">Error al iniciar el pago: {stripe_response["error"]}</span>'})
|
||||
|
||||
return render(request, 'account/gold_character.html', {'characters': characters, 'gold_prices': gold_prices})
|
||||
return render(request, 'account/gold_character.html', {
|
||||
'characters': characters,
|
||||
'gold_prices': gold_prices,
|
||||
'character_names': list(characters.keys()),
|
||||
'gold_options': [{'gold_amount': p.gold_amount, 'price': str(p.price)} for p in gold_prices],
|
||||
})
|
||||
@require_paid_stripe()
|
||||
def gold_success_view(request):
|
||||
# Procesar el pago exitoso
|
||||
@@ -843,7 +848,11 @@ def transfer_character_view(request):
|
||||
else:
|
||||
return JsonResponse({'success': False, 'message': f'<span class="red-form-response">Error al iniciar el pago: {stripe_response["error"]}</span>'})
|
||||
|
||||
return render(request, 'account/transfer_character.html', {'characters': characters, 'price': price})
|
||||
return render(request, 'account/transfer_character.html', {
|
||||
'characters': characters,
|
||||
'price': price,
|
||||
'character_names': [c[0] for c in characters],
|
||||
})
|
||||
@require_paid_stripe()
|
||||
def transfer_success_view(request):
|
||||
transfer_data = request.session.get('transfer_data')
|
||||
|
||||
Reference in New Issue
Block a user