Crack the select fields nut, fix bool, fix tests

This commit is contained in:
shamoon 2024-12-11 10:39:44 -08:00
parent 3dbc9d9fc1
commit 0c568eb836
2 changed files with 46 additions and 24 deletions

View File

@ -847,14 +847,19 @@ class DocumentsOrderingFilter(OrderingFilter):
output_field=FloatField(), output_field=FloatField(),
) )
case CustomField.FieldDataType.SELECT: case CustomField.FieldDataType.SELECT:
annotation = Case( select_options = field.extra_data.get("select_options", [])
When( whens = []
custom_fields__field_id=custom_field_id, # Create a case for each select option
then=Cast( for option in select_options:
"custom_fields__value_select_name", whens.append(
output_field=CharField(), 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(""), default=Value(""),
output_field=CharField(), output_field=CharField(),
) )
@ -887,8 +892,17 @@ class DocumentsOrderingFilter(OrderingFilter):
annotation = Case( annotation = Case(
When( When(
custom_fields__field_id=custom_field_id, custom_fields__field_id=custom_field_id,
then=Cast( custom_fields__value_bool=True,
"custom_fields__value_bool", 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(), output_field=IntegerField(),
), ),
), ),

View File

@ -2807,13 +2807,13 @@ class TestDocumentApiCustomFieldsSorting(DirectoriesMixin, APITestCase):
], ],
}, },
CustomField.FieldDataType.INT: { CustomField.FieldDataType.INT: {
"values": [1, 2, 3], "values": [3, 1, 2],
"field_name": CustomFieldInstance.TYPE_TO_DATA_STORE_NAME_MAP[ "field_name": CustomFieldInstance.TYPE_TO_DATA_STORE_NAME_MAP[
CustomField.FieldDataType.INT CustomField.FieldDataType.INT
], ],
}, },
CustomField.FieldDataType.FLOAT: { 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[ "field_name": CustomFieldInstance.TYPE_TO_DATA_STORE_NAME_MAP[
CustomField.FieldDataType.FLOAT CustomField.FieldDataType.FLOAT
], ],
@ -2825,35 +2825,35 @@ class TestDocumentApiCustomFieldsSorting(DirectoriesMixin, APITestCase):
], ],
}, },
CustomField.FieldDataType.DATE: { 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[ "field_name": CustomFieldInstance.TYPE_TO_DATA_STORE_NAME_MAP[
CustomField.FieldDataType.DATE CustomField.FieldDataType.DATE
], ],
}, },
CustomField.FieldDataType.URL: { CustomField.FieldDataType.URL: {
"values": [ "values": [
"http://example.org",
"http://example.com", "http://example.com",
"http://example.net", "http://example.net",
"http://example.org",
], ],
"field_name": CustomFieldInstance.TYPE_TO_DATA_STORE_NAME_MAP[ "field_name": CustomFieldInstance.TYPE_TO_DATA_STORE_NAME_MAP[
CustomField.FieldDataType.URL CustomField.FieldDataType.URL
], ],
}, },
CustomField.FieldDataType.MONETARY: { 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[ "field_name": CustomFieldInstance.TYPE_TO_DATA_STORE_NAME_MAP[
CustomField.FieldDataType.MONETARY CustomField.FieldDataType.MONETARY
], ],
}, },
CustomField.FieldDataType.DOCUMENTLINK: { 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[ "field_name": CustomFieldInstance.TYPE_TO_DATA_STORE_NAME_MAP[
CustomField.FieldDataType.DOCUMENTLINK CustomField.FieldDataType.DOCUMENTLINK
], ],
}, },
CustomField.FieldDataType.SELECT: { 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[ "field_name": CustomFieldInstance.TYPE_TO_DATA_STORE_NAME_MAP[
CustomField.FieldDataType.SELECT CustomField.FieldDataType.SELECT
], ],
@ -2868,6 +2868,8 @@ class TestDocumentApiCustomFieldsSorting(DirectoriesMixin, APITestCase):
} }
for data_type, data in values.items(): for data_type, data in values.items():
CustomField.objects.all().delete()
CustomFieldInstance.objects.all().delete()
custom_field = CustomField.objects.create( custom_field = CustomField.objects.create(
name=f"custom field {data_type}", name=f"custom field {data_type}",
data_type=data_type, data_type=data_type,
@ -2879,25 +2881,31 @@ class TestDocumentApiCustomFieldsSorting(DirectoriesMixin, APITestCase):
field=custom_field, field=custom_field,
**{data["field_name"]: value}, **{data["field_name"]: value},
) )
response = self.client.get( 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) self.assertEqual(response.status_code, status.HTTP_200_OK)
results = response.data["results"] results = response.data["results"]
self.assertEqual(len(results), 3) self.assertEqual(len(results), 3)
self.assertEqual( self.assertEqual(
[results[0]["id"], results[1]["id"], results[2]["id"]], [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( 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) self.assertEqual(response.status_code, status.HTTP_200_OK)
results = response.data["results"] results = response.data["results"]
self.assertEqual(len(results), 3) self.assertEqual(len(results), 3)
self.assertEqual( if data_type == CustomField.FieldDataType.BOOL:
[results[0]["id"], results[1]["id"], results[2]["id"]], # just check the first one for bools, as the rest are the same
[self.doc3.id, self.doc2.id, self.doc1.id], 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],
)