Features: 1) Update product property to reflect the highest price from stock instead of the lowest; 2) Update filter option to use price_order for consistent sorting;
Fixes: 1) Fix incorrect queryset filtering logic in the `feedbacks` endpoint; 2) Replace redundant product lookup in `feedbacks` with `get_object` for improved clarity and performance; Extra: 1) Rename annotated field `price` to `price_order` in queryset filters for better semantics; 2) Cleanup and streamline `feedbacks` endpoint logic.
This commit is contained in:
parent
a2f9ae8693
commit
016b9a575a
3 changed files with 8 additions and 16 deletions
|
|
@ -87,7 +87,7 @@ class ProductFilter(FilterSet):
|
||||||
("slug", "slug"),
|
("slug", "slug"),
|
||||||
("created", "created"),
|
("created", "created"),
|
||||||
("modified", "modified"),
|
("modified", "modified"),
|
||||||
("price", "price"),
|
("price_order", "price"),
|
||||||
("?", "random"),
|
("?", "random"),
|
||||||
),
|
),
|
||||||
initial="uuid",
|
initial="uuid",
|
||||||
|
|
@ -134,7 +134,7 @@ class ProductFilter(FilterSet):
|
||||||
)
|
)
|
||||||
if "price" in order_fields:
|
if "price" in order_fields:
|
||||||
self.queryset = self.queryset.annotate(
|
self.queryset = self.queryset.annotate(
|
||||||
price=Coalesce(
|
price_order=Coalesce(
|
||||||
Max("stocks__price"),
|
Max("stocks__price"),
|
||||||
Value(0.0),
|
Value(0.0),
|
||||||
output_field=FloatField(),
|
output_field=FloatField(),
|
||||||
|
|
|
||||||
|
|
@ -609,7 +609,7 @@ class Product(ExportModelOperationsMixin("product"), NiceModel): # type: ignore
|
||||||
Properties:
|
Properties:
|
||||||
rating (float): The average rating of the product, rounded to 2 decimal places.
|
rating (float): The average rating of the product, rounded to 2 decimal places.
|
||||||
feedbacks_count (int): The total number of feedback entries associated with the product.
|
feedbacks_count (int): The total number of feedback entries associated with the product.
|
||||||
price (float): The lowest price of the product based on its stock, rounded to 2 decimal
|
price (float): The highest price of the product based on its stock, rounded to 2 decimal
|
||||||
places.
|
places.
|
||||||
quantity (int): The total available quantity of the product across all its stocks.
|
quantity (int): The total available quantity of the product across all its stocks.
|
||||||
total_orders (int): Counts the total orders made for the product in relevant statuses.
|
total_orders (int): Counts the total orders made for the product in relevant statuses.
|
||||||
|
|
|
||||||
|
|
@ -571,19 +571,11 @@ class ProductViewSet(EvibesViewSet):
|
||||||
|
|
||||||
@action(detail=True, methods=["get"], url_path="feedbacks")
|
@action(detail=True, methods=["get"], url_path="feedbacks")
|
||||||
def feedbacks(self, request, **kwargs):
|
def feedbacks(self, request, **kwargs):
|
||||||
lookup_val = kwargs.get(self.lookup_field)
|
product = self.get_object()
|
||||||
try:
|
qs = Feedback.objects.filter(order_product__product=product)
|
||||||
product = Product.objects.get(uuid=lookup_val)
|
if not request.user.has_perm("core.view_feedback"):
|
||||||
feedbacks = (
|
qs = qs.filter(is_active=True)
|
||||||
Feedback.objects.filter(order_product__product=product)
|
return Response(data=FeedbackDetailSerializer(qs, many=True).data)
|
||||||
if request.user.has_perm("core.view_feedback")
|
|
||||||
else Feedback.objects.filter(order_product__product=product, is_active=True)
|
|
||||||
)
|
|
||||||
# noinspection PyTypeChecker
|
|
||||||
return Response(data=FeedbackDetailSerializer(feedbacks, many=True).data)
|
|
||||||
except Product.DoesNotExist:
|
|
||||||
name = "Product"
|
|
||||||
return Response(status=status.HTTP_404_NOT_FOUND, data={"detail": _(f"{name} does not exist: {uuid}")})
|
|
||||||
|
|
||||||
@action(
|
@action(
|
||||||
detail=True,
|
detail=True,
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue