From d0f687f56f41bc4d406938acfdb2b24293aeea6a Mon Sep 17 00:00:00 2001 From: Daniel Date: Fri, 8 May 2026 14:05:52 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20a=C3=B1adir=20edici=C3=B3n=20y=20elimin?= =?UTF-8?q?aci=C3=B3n=20de=20valoraciones=20propias?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tienda/templates/tienda/producto.html | 18 ++++++++++++++++++ tienda/urls.py | 1 + tienda/views.py | 27 ++++++++++++++++++++++++--- 3 files changed, 43 insertions(+), 3 deletions(-) diff --git a/tienda/templates/tienda/producto.html b/tienda/templates/tienda/producto.html index b20c3ce..cb00214 100644 --- a/tienda/templates/tienda/producto.html +++ b/tienda/templates/tienda/producto.html @@ -75,6 +75,14 @@ {% if can_review %} Valorar este producto + {% elif user_has_review %} +
+ Editar mi valoración +
+ {% csrf_token %} + +
+
{% elif user.is_authenticated %} Solo puedes valorar productos que hayas comprado {% else %} @@ -115,6 +123,15 @@ async function loadReviews() { }); imagesHtml += ''; } + const actionsHtml = review.is_owner + ? `
+ Editar +
+ {% csrf_token %} + +
+
` + : ''; reviewsHtml += `
@@ -128,6 +145,7 @@ async function loadReviews() {
${review.title}

${review.content}

${imagesHtml} + ${actionsHtml}
`; diff --git a/tienda/urls.py b/tienda/urls.py index cbb924f..30ed75e 100644 --- a/tienda/urls.py +++ b/tienda/urls.py @@ -70,5 +70,6 @@ urlpatterns = [ path("reset-password", views.reset_password, name="reset_password"), path("reset-password-phase2/", views.reset_password_phase2, name="reset_password_phase2"), path("producto//valorar/", views.add_review, name="add_review"), + path("producto//valorar/eliminar/", views.delete_review, name="delete_review"), path("api/producto//valoraciones/", views.product_reviews, name="product_reviews"), ] diff --git a/tienda/views.py b/tienda/views.py index ffafbf6..bc8e04c 100644 --- a/tienda/views.py +++ b/tienda/views.py @@ -401,10 +401,22 @@ def producto(request: HttpRequest, id: int): cache.set(cache_key, product, 300) can_review = False - if request.user.is_authenticated: - can_review = product.has_user_purchased(request.user) and not Review.objects.filter(product=product, user=request.user).exists() + user_has_review = False + 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): page = 1 @@ -2413,3 +2425,12 @@ def product_reviews(request: HttpRequest, product_id: int): "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() }) + + +@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]))