From 38545ba6da1b2f11daa4011b0805f25dabd788d2 Mon Sep 17 00:00:00 2001 From: Damian Wysocki Date: Mon, 4 Jan 2021 15:33:47 +0100 Subject: [PATCH] Fix reordering products duplicates (#6666) --- saleor/graphql/product/sorters.py | 8 ++++---- saleor/graphql/product/tests/test_product_sorting.py | 9 ++++++--- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/saleor/graphql/product/sorters.py b/saleor/graphql/product/sorters.py index d0b869337d6..076fd07ddbd 100644 --- a/saleor/graphql/product/sorters.py +++ b/saleor/graphql/product/sorters.py @@ -1,7 +1,7 @@ import graphene from django.db.models import Count, F, IntegerField, Min, OuterRef, QuerySet, Subquery from django.db.models.expressions import Window -from django.db.models.functions import Coalesce, RowNumber +from django.db.models.functions import Coalesce, DenseRank from ...product.models import Category, Product from ..core.types import SortInputObjectType @@ -140,7 +140,7 @@ class ProductOrderField(graphene.Enum): TYPE = ["product_type__name", "name", "slug"] PUBLISHED = ["is_published", "name", "slug"] PUBLICATION_DATE = ["publication_date", "name", "slug"] - COLLECTION = ["row_number"] + COLLECTION = ["sort_order"] @property def description(self): @@ -173,8 +173,8 @@ def qs_with_price(queryset: QuerySet) -> QuerySet: @staticmethod def qs_with_collection(queryset: QuerySet) -> QuerySet: return queryset.annotate( - row_number=Window( - expression=RowNumber(), + sort_order=Window( + expression=DenseRank(), order_by=( F("collectionproduct__sort_order").asc(nulls_last=True), F("collectionproduct__id"), diff --git a/saleor/graphql/product/tests/test_product_sorting.py b/saleor/graphql/product/tests/test_product_sorting.py index 9e127631915..695318011d1 100644 --- a/saleor/graphql/product/tests/test_product_sorting.py +++ b/saleor/graphql/product/tests/test_product_sorting.py @@ -113,7 +113,10 @@ def test_sort_products_within_collection( variables = { "collectionId": collection_id, - "moves": [{"productId": product, "sortOrder": 1}], + "moves": [ + {"productId": product, "sortOrder": 1}, + {"productId": second_product, "sortOrder": -1}, + ], } content = get_graphql_content( staff_api_client.post_graphql(COLLECTION_RESORT_QUERY, variables) @@ -121,8 +124,8 @@ def test_sort_products_within_collection( products = content["collection"]["products"]["edges"] assert products[0]["node"]["id"] == third_product - assert products[1]["node"]["id"] == product - assert products[2]["node"]["id"] == second_product + assert products[1]["node"]["id"] == second_product + assert products[2]["node"]["id"] == product GET_SORTED_PRODUCTS_QUERY = """