feat: añadir edición y eliminación de valoraciones propias
This commit is contained in:
@@ -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>
|
||||||
`;
|
`;
|
||||||
|
|||||||
@@ -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
@@ -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]))
|
||||||
|
|||||||
Reference in New Issue
Block a user