diff --git a/src/documents/filters.py b/src/documents/filters.py index b171d0127..4bfb3e6e2 100644 --- a/src/documents/filters.py +++ b/src/documents/filters.py @@ -847,14 +847,19 @@ class DocumentsOrderingFilter(OrderingFilter): output_field=FloatField(), ) case CustomField.FieldDataType.SELECT: - annotation = Case( - When( - custom_fields__field_id=custom_field_id, - then=Cast( - "custom_fields__value_select_name", - output_field=CharField(), + select_options = field.extra_data.get("select_options", []) + whens = [] + # Create a case for each select option + for option in select_options: + whens.append( + When( + custom_fields__field_id=custom_field_id, + custom_fields__value_select=option.get("id"), + then=Value(option["label"], output_field=CharField()), ), - ), + ) + annotation = Case( + *whens, default=Value(""), output_field=CharField(), ) @@ -887,8 +892,17 @@ class DocumentsOrderingFilter(OrderingFilter): annotation = Case( When( custom_fields__field_id=custom_field_id, - then=Cast( - "custom_fields__value_bool", + custom_fields__value_bool=True, + then=Value( + 1, + output_field=IntegerField(), + ), + ), + When( + custom_fields__field_id=custom_field_id, + custom_fields__value_bool=False, + then=Value( + 0, output_field=IntegerField(), ), ), diff --git a/src/documents/tests/test_api_documents.py b/src/documents/tests/test_api_documents.py index 70daa5d17..35b6a2b89 100644 --- a/src/documents/tests/test_api_documents.py +++ b/src/documents/tests/test_api_documents.py @@ -2807,13 +2807,13 @@ class TestDocumentApiCustomFieldsSorting(DirectoriesMixin, APITestCase): ], }, CustomField.FieldDataType.INT: { - "values": [1, 2, 3], + "values": [3, 1, 2], "field_name": CustomFieldInstance.TYPE_TO_DATA_STORE_NAME_MAP[ CustomField.FieldDataType.INT ], }, CustomField.FieldDataType.FLOAT: { - "values": [1.1, 2.2, 3.3], + "values": [3.3, 1.1, 2.2], "field_name": CustomFieldInstance.TYPE_TO_DATA_STORE_NAME_MAP[ CustomField.FieldDataType.FLOAT ], @@ -2825,35 +2825,35 @@ class TestDocumentApiCustomFieldsSorting(DirectoriesMixin, APITestCase): ], }, CustomField.FieldDataType.DATE: { - "values": [date(2021, 1, 1), date(2021, 1, 2), date(2021, 1, 3)], + "values": [date(2021, 1, 3), date(2021, 1, 1), date(2021, 1, 2)], "field_name": CustomFieldInstance.TYPE_TO_DATA_STORE_NAME_MAP[ CustomField.FieldDataType.DATE ], }, CustomField.FieldDataType.URL: { "values": [ + "http://example.org", "http://example.com", "http://example.net", - "http://example.org", ], "field_name": CustomFieldInstance.TYPE_TO_DATA_STORE_NAME_MAP[ CustomField.FieldDataType.URL ], }, CustomField.FieldDataType.MONETARY: { - "values": ["USD123.00", "USD456.00", "USD789.00"], + "values": ["USD789.00", "USD123.00", "USD456.00"], "field_name": CustomFieldInstance.TYPE_TO_DATA_STORE_NAME_MAP[ CustomField.FieldDataType.MONETARY ], }, CustomField.FieldDataType.DOCUMENTLINK: { - "values": [self.doc1.pk, self.doc2.pk, self.doc3.pk], + "values": [self.doc3.pk, self.doc1.pk, self.doc2.pk], "field_name": CustomFieldInstance.TYPE_TO_DATA_STORE_NAME_MAP[ CustomField.FieldDataType.DOCUMENTLINK ], }, CustomField.FieldDataType.SELECT: { - "values": ["abc-123", "def-456", "ghi-789"], + "values": ["ghi-789", "abc-123", "def-456"], "field_name": CustomFieldInstance.TYPE_TO_DATA_STORE_NAME_MAP[ CustomField.FieldDataType.SELECT ], @@ -2868,6 +2868,8 @@ class TestDocumentApiCustomFieldsSorting(DirectoriesMixin, APITestCase): } for data_type, data in values.items(): + CustomField.objects.all().delete() + CustomFieldInstance.objects.all().delete() custom_field = CustomField.objects.create( name=f"custom field {data_type}", data_type=data_type, @@ -2879,25 +2881,31 @@ class TestDocumentApiCustomFieldsSorting(DirectoriesMixin, APITestCase): field=custom_field, **{data["field_name"]: value}, ) - response = self.client.get( - f"/api/documents/?ordering=custom_fields__{custom_field.pk}", + f"/api/documents/?ordering=custom_field_{custom_field.pk}", ) self.assertEqual(response.status_code, status.HTTP_200_OK) results = response.data["results"] self.assertEqual(len(results), 3) self.assertEqual( [results[0]["id"], results[1]["id"], results[2]["id"]], - [self.doc3.id, self.doc2.id, self.doc1.id], + [self.doc2.id, self.doc3.id, self.doc1.id], ) response = self.client.get( - f"/api/documents/?ordering=-custom_fields__{custom_field.pk}", + f"/api/documents/?ordering=-custom_field_{custom_field.pk}", ) self.assertEqual(response.status_code, status.HTTP_200_OK) results = response.data["results"] self.assertEqual(len(results), 3) - self.assertEqual( - [results[0]["id"], results[1]["id"], results[2]["id"]], - [self.doc3.id, self.doc2.id, self.doc1.id], - ) + if data_type == CustomField.FieldDataType.BOOL: + # just check the first one for bools, as the rest are the same + self.assertEqual( + [results[0]["id"]], + [self.doc1.id], + ) + else: + self.assertEqual( + [results[0]["id"], results[1]["id"], results[2]["id"]], + [self.doc1.id, self.doc3.id, self.doc2.id], + )