Enhancement: allow specifying default currency for Monetary custom field (#7381)

This commit is contained in:
shamoon
2024-08-05 17:02:03 -07:00
committed by GitHub
parent 0ee85aae21
commit 15554322dd
13 changed files with 168 additions and 29 deletions

View File

@@ -507,6 +507,23 @@ class CustomFieldSerializer(serializers.ModelSerializer):
raise serializers.ValidationError(
{"error": "extra_data.select_options must be a valid list"},
)
elif (
"data_type" in attrs
and attrs["data_type"] == CustomField.FieldDataType.MONETARY
and "extra_data" in attrs
and "default_currency" in attrs["extra_data"]
and attrs["extra_data"]["default_currency"] is not None
and (
not isinstance(attrs["extra_data"]["default_currency"], str)
or (
len(attrs["extra_data"]["default_currency"]) > 0
and len(attrs["extra_data"]["default_currency"]) != 3
)
)
):
raise serializers.ValidationError(
{"error": "extra_data.default_currency must be a 3-character string"},
)
return super().validate(attrs)

View File

@@ -137,6 +137,66 @@ class TestCustomFieldsAPI(DirectoriesMixin, APITestCase):
)
self.assertEqual(resp.status_code, status.HTTP_400_BAD_REQUEST)
def test_create_custom_field_monetary_validation(self):
"""
GIVEN:
- Custom field does not exist
WHEN:
- API request to create custom field with invalid default currency option
- API request to create custom field with valid default currency option
THEN:
- HTTP 400 is returned
- HTTP 201 is returned
"""
# not a string
resp = self.client.post(
self.ENDPOINT,
json.dumps(
{
"data_type": "monetary",
"name": "Monetary Field",
"extra_data": {
"default_currency": 123,
},
},
),
content_type="application/json",
)
self.assertEqual(resp.status_code, status.HTTP_400_BAD_REQUEST)
# not a 3-letter currency code
resp = self.client.post(
self.ENDPOINT,
json.dumps(
{
"data_type": "monetary",
"name": "Monetary Field",
"extra_data": {
"default_currency": "EU",
},
},
),
content_type="application/json",
)
self.assertEqual(resp.status_code, status.HTTP_400_BAD_REQUEST)
# valid currency code
resp = self.client.post(
self.ENDPOINT,
json.dumps(
{
"data_type": "monetary",
"name": "Monetary Field",
"extra_data": {
"default_currency": "EUR",
},
},
),
content_type="application/json",
)
self.assertEqual(resp.status_code, status.HTTP_201_CREATED)
def test_create_custom_field_instance(self):
"""
GIVEN: