diff --git a/src/datasource_django/forestadmin/datasource_django/utils/model_introspection.py b/src/datasource_django/forestadmin/datasource_django/utils/model_introspection.py index 8b44e9ab0..1ec6bcf6e 100644 --- a/src/datasource_django/forestadmin/datasource_django/utils/model_introspection.py +++ b/src/datasource_django/forestadmin/datasource_django/utils/model_introspection.py @@ -35,11 +35,19 @@ GeneratedField = None +def serialize_enum_value(value): + try: + json.dumps(value) + except TypeError: + value = str(value) + return value + + class FieldFactory: @staticmethod def _build_enum_values(field: Field) -> Optional[List[str]]: if field.choices: - return [c[0] for c in field.choices] # type: ignore + return [serialize_enum_value(c[0]) for c in field.choices] # type: ignore return None @staticmethod diff --git a/src/datasource_django/tests/utils/test_django_model_introspection.py b/src/datasource_django/tests/utils/test_django_model_introspection.py index f72c30768..e04852d8c 100644 --- a/src/datasource_django/tests/utils/test_django_model_introspection.py +++ b/src/datasource_django/tests/utils/test_django_model_introspection.py @@ -1,3 +1,4 @@ +from datetime import datetime from unittest import TestCase from unittest.mock import patch @@ -52,6 +53,20 @@ def test_build_should_handle_enums(self): self.assertEqual(field_schema["enum_values"], [1, 2, 3]) self.assertEqual(field_schema["column_type"], PrimitiveType.ENUM) + def test_build_should_use_str_on_enum_values_when_value_is_not_json_serializable(self): + """enums""" + now = datetime.now() + choices = [ + (datetime(1916, 1, 1, 1, 1, 1), "WW1"), + (datetime(1941, 2, 2, 2, 2, 2), "WW2"), + (now, "NOW"), + ] + field = models.DateField(choices=choices) + field_schema = FieldFactory.build(field) + + self.assertEqual(field_schema["enum_values"], ["1916-01-01 01:01:01", "1941-02-02 02:02:02", str(now)]) + self.assertEqual(field_schema["column_type"], PrimitiveType.ENUM) + def test_build_should_handle_read_only_for_auto_increment_pk(self): """readonly""" field = models.AutoField(primary_key=True) diff --git a/src/datasource_toolkit/forestadmin/datasource_toolkit/validations/condition_tree.py b/src/datasource_toolkit/forestadmin/datasource_toolkit/validations/condition_tree.py index 258955e7e..38559e475 100644 --- a/src/datasource_toolkit/forestadmin/datasource_toolkit/validations/condition_tree.py +++ b/src/datasource_toolkit/forestadmin/datasource_toolkit/validations/condition_tree.py @@ -80,7 +80,7 @@ def validate_value_for_operator(condition_tree: ConditionTreeLeaf, column_schema error_msg = ( f'The given value attribute "{value}" (type: {value_type}) has an unexpected value ' - 'for the given operator "{condition_tree.operator}."' + f'for the given operator "{condition_tree.operator}."' ) allowed_types = MAP_ALLOWED_TYPES_FOR_OPERATOR.get(condition_tree.operator, []) if not allowed_types: