diff --git a/app/grandchallenge/components/serializers.py b/app/grandchallenge/components/serializers.py index 12e3f554b..4ecb5f658 100644 --- a/app/grandchallenge/components/serializers.py +++ b/app/grandchallenge/components/serializers.py @@ -165,7 +165,12 @@ def validate(self, attrs): class SortedCIVSerializer(serializers.ListSerializer): def to_representation(self, data): - sorted_data = sort_civs(data.all()) + iterable = ( + data.all() + if isinstance(data, serializers.models.manager.BaseManager) + else data + ) + sorted_data = sort_civs(iterable) return super().to_representation(sorted_data) diff --git a/app/tests/components_tests/test_serializers.py b/app/tests/components_tests/test_serializers.py index e7023a279..0be43c0cc 100644 --- a/app/tests/components_tests/test_serializers.py +++ b/app/tests/components_tests/test_serializers.py @@ -4,8 +4,12 @@ from grandchallenge.components.models import InterfaceKind from grandchallenge.components.serializers import ( ComponentInterfaceValuePostSerializer, + ComponentInterfaceValueSerializer, +) +from tests.components_tests.factories import ( + ComponentInterfaceFactory, + ComponentInterfaceValueFactory, ) -from tests.components_tests.factories import ComponentInterfaceFactory from tests.factories import ImageFactory, UploadSessionFactory, UserFactory TEST_DATA = { @@ -468,3 +472,55 @@ def test_civ_post_image_valid(kind, rf): # verify assert serializer.is_valid() + + +@pytest.mark.django_db +def test_civ_serializer_list_ordering(): + + civs = [ + ComponentInterfaceValueFactory( + interface=ComponentInterfaceFactory( + kind=InterfaceKind.InterfaceKindChoices.IMAGE, + store_in_database=False, + ) + ), + ComponentInterfaceValueFactory( + interface=ComponentInterfaceFactory( + kind=InterfaceKind.InterfaceKindChoices.THUMBNAIL_PNG, + store_in_database=False, + ) + ), + ComponentInterfaceValueFactory( + interface=ComponentInterfaceFactory( + kind=InterfaceKind.InterfaceKindChoices.ZIP, + store_in_database=False, + ) + ), + ComponentInterfaceValueFactory( + interface=ComponentInterfaceFactory( + kind=InterfaceKind.InterfaceKindChoices.STRING + ), + value="bar", + ), + ComponentInterfaceValueFactory( + interface=ComponentInterfaceFactory( + kind=InterfaceKind.InterfaceKindChoices.CHART + ), + value="foo", + ), + ] + + serializer = ComponentInterfaceValueSerializer(many=True) + + produced_order = [ + civ["interface"]["kind"] + for civ in serializer.to_representation(data=civs) + ] + + assert produced_order == [ + InterfaceKind.InterfaceKindChoices.STRING.label, + InterfaceKind.InterfaceKindChoices.THUMBNAIL_PNG.label, + InterfaceKind.InterfaceKindChoices.CHART.label, + InterfaceKind.InterfaceKindChoices.ZIP.label, + InterfaceKind.InterfaceKindChoices.IMAGE.label, + ]