feat: añadir edición y eliminación de valoraciones propias

This commit is contained in:
2026-05-08 14:05:52 +02:00
parent e70a9aeb9c
commit d0f687f56f
3 changed files with 43 additions and 3 deletions
+18
View File
@@ -75,6 +75,14 @@
</div> </div>
{% if can_review %} {% if can_review %}
<a href="{% url 'add_review' product.id %}" class="btn btn-sm btn-outline-primary ms-auto">Valorar este producto</a> <a href="{% url 'add_review' product.id %}" class="btn btn-sm btn-outline-primary ms-auto">Valorar este producto</a>
{% elif user_has_review %}
<div class="ms-auto">
<a href="{% url 'add_review' product.id %}" class="btn btn-sm btn-outline-primary">Editar mi valoración</a>
<form method="post" action="{% url 'delete_review' product.id %}" style="display:inline;">
{% csrf_token %}
<button type="submit" class="btn btn-sm btn-outline-danger" onclick="return confirm('¿Eliminar esta valoración?');">Eliminar</button>
</form>
</div>
{% elif user.is_authenticated %} {% elif user.is_authenticated %}
<span class="text-muted ms-auto">Solo puedes valorar productos que hayas comprado</span> <span class="text-muted ms-auto">Solo puedes valorar productos que hayas comprado</span>
{% else %} {% else %}
@@ -115,6 +123,15 @@ async function loadReviews() {
}); });
imagesHtml += '</div>'; imagesHtml += '</div>';
} }
const actionsHtml = review.is_owner
? `<div class="mt-2">
<a href="/tienda/producto/${review.id}/valorar/" class="btn btn-sm btn-outline-primary me-1">Editar</a>
<form method="post" action="/tienda/producto/${review.id}/valorar/eliminar/" style="display:inline;">
{% csrf_token %}
<button type="submit" class="btn btn-sm btn-outline-danger" onclick="return confirm('¿Eliminar esta valoración?');">Eliminar</button>
</form>
</div>`
: '';
reviewsHtml += ` reviewsHtml += `
<div class="card mb-3"> <div class="card mb-3">
<div class="card-body"> <div class="card-body">
@@ -128,6 +145,7 @@ async function loadReviews() {
<h6 class="mt-2">${review.title}</h6> <h6 class="mt-2">${review.title}</h6>
<p class="mb-1">${review.content}</p> <p class="mb-1">${review.content}</p>
${imagesHtml} ${imagesHtml}
${actionsHtml}
</div> </div>
</div> </div>
`; `;
+1
View File
@@ -70,5 +70,6 @@ urlpatterns = [
path("reset-password", views.reset_password, name="reset_password"), path("reset-password", views.reset_password, name="reset_password"),
path("reset-password-phase2/<str:code>", views.reset_password_phase2, name="reset_password_phase2"), path("reset-password-phase2/<str:code>", views.reset_password_phase2, name="reset_password_phase2"),
path("producto/<int:product_id>/valorar/", views.add_review, name="add_review"), path("producto/<int:product_id>/valorar/", views.add_review, name="add_review"),
path("producto/<int:product_id>/valorar/eliminar/", views.delete_review, name="delete_review"),
path("api/producto/<int:product_id>/valoraciones/", views.product_reviews, name="product_reviews"), path("api/producto/<int:product_id>/valoraciones/", views.product_reviews, name="product_reviews"),
] ]
+24 -3
View File
@@ -401,10 +401,22 @@ def producto(request: HttpRequest, id: int):
cache.set(cache_key, product, 300) cache.set(cache_key, product, 300)
can_review = False can_review = False
if request.user.is_authenticated: user_has_review = False
can_review = product.has_user_purchased(request.user) and not Review.objects.filter(product=product, user=request.user).exists() user_review_id = None
return render(request, "tienda/producto.html", {"product": product, "can_review": can_review}) if request.user.is_authenticated:
user_review = Review.objects.filter(product=product, user=request.user).first()
if user_review:
user_has_review = True
user_review_id = user_review.id
can_review = product.has_user_purchased(request.user) and not user_review
return render(request, "tienda/producto.html", {
"product": product,
"can_review": can_review,
"user_has_review": user_has_review,
"user_review_id": user_review_id
})
def categoria(request: HttpRequest, id: int): def categoria(request: HttpRequest, id: int):
page = 1 page = 1
@@ -2413,3 +2425,12 @@ def product_reviews(request: HttpRequest, product_id: int):
"reviews_count": product.get_reviews_count(), "reviews_count": product.get_reviews_count(),
"can_review": request.user.is_authenticated and product.has_user_purchased(request.user) and not Review.objects.filter(product=product, user=request.user).exists() "can_review": request.user.is_authenticated and product.has_user_purchased(request.user) and not Review.objects.filter(product=product, user=request.user).exists()
}) })
@login_required
def delete_review(request: HttpRequest, review_id: int):
review = get_object_or_404(Review, id=review_id, user=request.user)
product_id = review.product_id
review.delete()
messages.success(request, "Tu valoración ha sido eliminada.")
return redirect(reverse("producto", args=[product_id]))