fix: address code review issues (stack traces, duplicate code, template logic, import alias)
Agent-Logs-Url: https://github.com/dsaub/proyecto-final/sessions/09bd2b8f-753c-4431-816f-eba20606d5a0 Co-authored-by: dsaub <54474838+dsaub@users.noreply.github.com>
This commit is contained in:
committed by
GitHub
parent
233e42c14e
commit
ff475ef2dc
@@ -104,19 +104,16 @@
|
|||||||
</tbody>
|
</tbody>
|
||||||
<tfoot>
|
<tfoot>
|
||||||
<tr>
|
<tr>
|
||||||
<th colspan="2" class="text-end">Subtotal:</th>
|
<th colspan="4" class="text-end">Subtotal:</th>
|
||||||
<th colspan="2" class="text-end">{{ cart.get_total|format_price }}€</th>
|
<th class="text-end">{{ cart.get_total|format_price }}€</th>
|
||||||
<td></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th colspan="2" class="text-end">IVA (21%):</th>
|
<th colspan="4" class="text-end">IVA (21%):</th>
|
||||||
<th colspan="2" class="text-end text-success">+{{ cart.get_vat_amount|format_price }}€</th>
|
<th class="text-end text-success">+{{ cart.get_vat_amount|format_price }}€</th>
|
||||||
<td></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr style="background-color: #f8f9fa;">
|
<tr style="background-color: #f8f9fa;">
|
||||||
<th colspan="2" class="text-end" style="font-size: 1.1rem;">Total:</th>
|
<th colspan="4" class="text-end" style="font-size: 1.1rem;">Total:</th>
|
||||||
<th colspan="2" class="text-end" style="font-size: 1.1rem;">{{ cart.get_total_with_vat|format_price }}€</th>
|
<th class="text-end" style="font-size: 1.1rem;">{{ cart.get_total_with_vat|format_price }}€</th>
|
||||||
<td></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
</tfoot>
|
</tfoot>
|
||||||
</table>
|
</table>
|
||||||
|
|||||||
@@ -38,8 +38,8 @@
|
|||||||
<a href="{% url 'agregar_tarjeta' %}" class="btn btn-sm btn-success">➕ Añadir tarjeta</a>
|
<a href="{% url 'agregar_tarjeta' %}" class="btn btn-sm btn-success">➕ Añadir tarjeta</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
{% for metodo in metodos %}
|
{% with has_card=False %}
|
||||||
{% if metodo.method_type == 'card' %}
|
{% for metodo in metodos %}{% if metodo.method_type == 'card' %}
|
||||||
<div class="d-flex justify-content-between align-items-center border rounded p-3 mb-2">
|
<div class="d-flex justify-content-between align-items-center border rounded p-3 mb-2">
|
||||||
<div>
|
<div>
|
||||||
<span class="fw-semibold">{{ metodo.label }}</span>
|
<span class="fw-semibold">{{ metodo.label }}</span>
|
||||||
@@ -50,9 +50,9 @@
|
|||||||
<button type="submit" class="btn btn-sm btn-outline-danger">Eliminar</button>
|
<button type="submit" class="btn btn-sm btn-outline-danger">Eliminar</button>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}{% endfor %}
|
||||||
{% endfor %}
|
{% endwith %}
|
||||||
{% if not metodos %}
|
{% if not cards_exist %}
|
||||||
<p class="text-muted mb-0">No tienes tarjetas guardadas.</p>
|
<p class="text-muted mb-0">No tienes tarjetas guardadas.</p>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
@@ -67,8 +67,7 @@
|
|||||||
<a href="{% url 'agregar_paypal' %}" class="btn btn-sm btn-warning">➕ Añadir PayPal</a>
|
<a href="{% url 'agregar_paypal' %}" class="btn btn-sm btn-warning">➕ Añadir PayPal</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
{% for metodo in metodos %}
|
{% for metodo in metodos %}{% if metodo.method_type == 'paypal' %}
|
||||||
{% if metodo.method_type == 'paypal' %}
|
|
||||||
<div class="d-flex justify-content-between align-items-center border rounded p-3 mb-2">
|
<div class="d-flex justify-content-between align-items-center border rounded p-3 mb-2">
|
||||||
<div>
|
<div>
|
||||||
<span class="fw-semibold">{{ metodo.paypal_email }}</span>
|
<span class="fw-semibold">{{ metodo.paypal_email }}</span>
|
||||||
@@ -79,9 +78,8 @@
|
|||||||
<button type="submit" class="btn btn-sm btn-outline-danger">Eliminar</button>
|
<button type="submit" class="btn btn-sm btn-outline-danger">Eliminar</button>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}{% endfor %}
|
||||||
{% endfor %}
|
{% if not paypal_exist %}
|
||||||
{% if not metodos %}
|
|
||||||
<p class="text-muted mb-0">No tienes cuentas de PayPal guardadas.</p>
|
<p class="text-muted mb-0">No tienes cuentas de PayPal guardadas.</p>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
+14
-34
@@ -28,7 +28,7 @@ import unicodedata
|
|||||||
import json
|
import json
|
||||||
import random, string
|
import random, string
|
||||||
import logging
|
import logging
|
||||||
import requests as http_requests
|
import requests
|
||||||
# Create your views here.
|
# Create your views here.
|
||||||
|
|
||||||
|
|
||||||
@@ -110,7 +110,7 @@ def _get_paypal_base_url() -> str:
|
|||||||
def _get_paypal_access_token() -> str:
|
def _get_paypal_access_token() -> str:
|
||||||
"""Obtiene un access token de la API de PayPal."""
|
"""Obtiene un access token de la API de PayPal."""
|
||||||
url = f"{_get_paypal_base_url()}/v1/oauth2/token"
|
url = f"{_get_paypal_base_url()}/v1/oauth2/token"
|
||||||
response = http_requests.post(
|
response = requests.post(
|
||||||
url,
|
url,
|
||||||
auth=(settings.PAYPAL_CLIENT_ID, settings.PAYPAL_CLIENT_SECRET),
|
auth=(settings.PAYPAL_CLIENT_ID, settings.PAYPAL_CLIENT_SECRET),
|
||||||
data={"grant_type": "client_credentials"},
|
data={"grant_type": "client_credentials"},
|
||||||
@@ -144,7 +144,7 @@ def _paypal_create_order(amount_eur: Decimal) -> dict:
|
|||||||
"user_action": "PAY_NOW",
|
"user_action": "PAY_NOW",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
response = http_requests.post(url, headers=headers, json=payload, timeout=15)
|
response = requests.post(url, headers=headers, json=payload, timeout=15)
|
||||||
response.raise_for_status()
|
response.raise_for_status()
|
||||||
return response.json()
|
return response.json()
|
||||||
|
|
||||||
@@ -157,7 +157,7 @@ def _paypal_capture_order(order_id: str) -> dict:
|
|||||||
"Content-Type": "application/json",
|
"Content-Type": "application/json",
|
||||||
"Authorization": f"Bearer {token}",
|
"Authorization": f"Bearer {token}",
|
||||||
}
|
}
|
||||||
response = http_requests.post(url, headers=headers, json={}, timeout=15)
|
response = requests.post(url, headers=headers, json={}, timeout=15)
|
||||||
response.raise_for_status()
|
response.raise_for_status()
|
||||||
return response.json()
|
return response.json()
|
||||||
|
|
||||||
@@ -1199,7 +1199,7 @@ def create_checkout_session(request: HttpRequest):
|
|||||||
return JsonResponse({"sessionId": session.id})
|
return JsonResponse({"sessionId": session.id})
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.exception("STRIPE_CHECKOUT_SESSION_ERROR user_id=%s error=%s", request.user.id, str(e))
|
logger.exception("STRIPE_CHECKOUT_SESSION_ERROR user_id=%s error=%s", request.user.id, str(e))
|
||||||
return JsonResponse({"error": f"Error al crear sesión de pago: {str(e)}"}, status=500)
|
return JsonResponse({"error": "Error al crear la sesión de pago. Por favor inténtalo de nuevo."}, status=500)
|
||||||
|
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
@@ -1546,7 +1546,7 @@ def crear_payment_intent(request: HttpRequest):
|
|||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.exception("CREATE_PAYMENT_INTENT_ERROR user_id=%s error=%s", request.user.id, str(e))
|
logger.exception("CREATE_PAYMENT_INTENT_ERROR user_id=%s error=%s", request.user.id, str(e))
|
||||||
return JsonResponse({"error": f"Error al crear el intento de pago: {str(e)}"}, status=500)
|
return JsonResponse({"error": "Error al crear el pago. Por favor inténtalo de nuevo."}, status=500)
|
||||||
|
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
@@ -1672,7 +1672,7 @@ def crear_orden_paypal(request: HttpRequest):
|
|||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.exception("CREAR_ORDEN_PAYPAL_ERROR user_id=%s error=%s", request.user.id, str(e))
|
logger.exception("CREAR_ORDEN_PAYPAL_ERROR user_id=%s error=%s", request.user.id, str(e))
|
||||||
return JsonResponse({"error": f"Error al crear la orden de PayPal: {str(e)}"}, status=500)
|
return JsonResponse({"error": "Error al crear la orden de PayPal. Por favor inténtalo de nuevo."}, status=500)
|
||||||
|
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
@@ -1706,7 +1706,7 @@ def capturar_orden_paypal(request: HttpRequest):
|
|||||||
capture_data = _paypal_capture_order(paypal_order_id)
|
capture_data = _paypal_capture_order(paypal_order_id)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.exception("CAPTURAR_ORDEN_PAYPAL_ERROR user_id=%s error=%s", request.user.id, str(e))
|
logger.exception("CAPTURAR_ORDEN_PAYPAL_ERROR user_id=%s error=%s", request.user.id, str(e))
|
||||||
return JsonResponse({"error": f"Error al capturar el pago de PayPal: {str(e)}"}, status=500)
|
return JsonResponse({"error": "Error al capturar el pago de PayPal. Por favor inténtalo de nuevo."}, status=500)
|
||||||
|
|
||||||
capture_status = capture_data.get("status")
|
capture_status = capture_data.get("status")
|
||||||
if capture_status != "COMPLETED":
|
if capture_status != "COMPLETED":
|
||||||
@@ -1772,7 +1772,8 @@ def metodos_pago(request: HttpRequest):
|
|||||||
metodos = SavedPaymentMethod.objects.filter(user=request.user)
|
metodos = SavedPaymentMethod.objects.filter(user=request.user)
|
||||||
return render(request, "tienda/metodos_pago.html", {
|
return render(request, "tienda/metodos_pago.html", {
|
||||||
"metodos": metodos,
|
"metodos": metodos,
|
||||||
"paypal_client_id": settings.PAYPAL_CLIENT_ID,
|
"cards_exist": metodos.filter(method_type=SavedPaymentMethod.TYPE_CARD).exists(),
|
||||||
|
"paypal_exist": metodos.filter(method_type=SavedPaymentMethod.TYPE_PAYPAL).exists(),
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
@@ -1805,7 +1806,7 @@ def crear_setup_intent(request: HttpRequest):
|
|||||||
})
|
})
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.exception("CREATE_SETUP_INTENT_ERROR user_id=%s error=%s", request.user.id, str(e))
|
logger.exception("CREATE_SETUP_INTENT_ERROR user_id=%s error=%s", request.user.id, str(e))
|
||||||
return JsonResponse({"error": f"Error al iniciar el proceso: {str(e)}"}, status=500)
|
return JsonResponse({"error": "Error al iniciar el proceso de configuración. Por favor inténtalo de nuevo."}, status=500)
|
||||||
|
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
@@ -1851,7 +1852,7 @@ def confirmar_setup_intent(request: HttpRequest):
|
|||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.exception("CONFIRMAR_SETUP_INTENT_ERROR user_id=%s error=%s", request.user.id, str(e))
|
logger.exception("CONFIRMAR_SETUP_INTENT_ERROR user_id=%s error=%s", request.user.id, str(e))
|
||||||
return JsonResponse({"error": f"Error al guardar la tarjeta: {str(e)}"}, status=500)
|
return JsonResponse({"error": "Error al guardar la tarjeta. Por favor inténtalo de nuevo."}, status=500)
|
||||||
|
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
@@ -1897,7 +1898,7 @@ def crear_orden_paypal_setup(request: HttpRequest):
|
|||||||
return JsonResponse({"id": paypal_order.get("id")})
|
return JsonResponse({"id": paypal_order.get("id")})
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.exception("CREAR_ORDEN_PAYPAL_SETUP_ERROR user_id=%s error=%s", request.user.id, str(e))
|
logger.exception("CREAR_ORDEN_PAYPAL_SETUP_ERROR user_id=%s error=%s", request.user.id, str(e))
|
||||||
return JsonResponse({"error": f"Error al iniciar el proceso: {str(e)}"}, status=500)
|
return JsonResponse({"error": "Error al iniciar la verificación de PayPal. Por favor inténtalo de nuevo."}, status=500)
|
||||||
|
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
@@ -1922,7 +1923,7 @@ def capturar_orden_paypal_setup(request: HttpRequest):
|
|||||||
capture_data = _paypal_capture_order(paypal_order_id)
|
capture_data = _paypal_capture_order(paypal_order_id)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.exception("CAPTURAR_PAYPAL_SETUP_ERROR user_id=%s error=%s", request.user.id, str(e))
|
logger.exception("CAPTURAR_PAYPAL_SETUP_ERROR user_id=%s error=%s", request.user.id, str(e))
|
||||||
return JsonResponse({"error": f"Error al verificar la cuenta: {str(e)}"}, status=500)
|
return JsonResponse({"error": "Error al verificar la cuenta de PayPal. Por favor inténtalo de nuevo."}, status=500)
|
||||||
|
|
||||||
if capture_data.get("status") != "COMPLETED":
|
if capture_data.get("status") != "COMPLETED":
|
||||||
return JsonResponse({"error": "No se pudo verificar la cuenta de PayPal"}, status=400)
|
return JsonResponse({"error": "No se pudo verificar la cuenta de PayPal"}, status=400)
|
||||||
@@ -1955,27 +1956,6 @@ def capturar_orden_paypal_setup(request: HttpRequest):
|
|||||||
return JsonResponse({"success": True, "email": payer_email, "already_existed": True})
|
return JsonResponse({"success": True, "email": payer_email, "already_existed": True})
|
||||||
|
|
||||||
|
|
||||||
"""API AJAX que retorna sugerencias de búsqueda en JSON"""
|
|
||||||
query = request.GET.get('q', '').strip()
|
|
||||||
suggestions = []
|
|
||||||
|
|
||||||
if query and len(query) >= 2: # Mínimo 2 caracteres para sugerir
|
|
||||||
# Buscar en nombre (primario) y descripción
|
|
||||||
products = Product.objects.filter(
|
|
||||||
models.Q(name__icontains=query) |
|
|
||||||
models.Q(briefdesc__icontains=query)
|
|
||||||
).values_list('name', 'id', 'price', 'primary_image_id').distinct()[:8] # Máximo 8 sugerencias
|
|
||||||
|
|
||||||
for name, product_id, price, image_id in products:
|
|
||||||
suggestions.append({
|
|
||||||
'name': name,
|
|
||||||
'id': product_id,
|
|
||||||
'price': float(price)
|
|
||||||
})
|
|
||||||
|
|
||||||
return JsonResponse({'suggestions': suggestions})
|
|
||||||
|
|
||||||
|
|
||||||
# ==================== PORTAL DE USUARIO ====================
|
# ==================== PORTAL DE USUARIO ====================
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
|
|||||||
Reference in New Issue
Block a user