Skip to content

Commit 3d4e456

Browse files
committed
refactor
1 parent 5216779 commit 3d4e456

File tree

1 file changed

+19
-12
lines changed

1 file changed

+19
-12
lines changed

fastapi_jsonapi/data_layers/filtering/sqlalchemy.py

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@
3939
# The mapping with validators using by to cast raw value to instance of target type
4040
REGISTERED_PYDANTIC_TYPES: Dict[Type, List[Callable]] = dict(_VALIDATORS)
4141

42+
cast_failed = object()
43+
4244

4345
def create_filters(model: Type[TypeModel], filter_info: Union[list, dict], schema: Type[TypeSchema]):
4446
"""
@@ -65,7 +67,22 @@ def __init__(self, model: Type[TypeModel], filter_: dict, schema: Type[TypeSchem
6567
self.filter_ = filter_
6668
self.schema = schema
6769

68-
def create_filter(self, schema_field: ModelField, model_column, operator, value): # noqa: PLR0912 temporary
70+
def _cast_value_with_scheme(self, field_types: List[ModelField], value: Any) -> Tuple[Any, List[str]]:
71+
errors: List[str] = []
72+
casted_value = cast_failed
73+
74+
for field_type in field_types:
75+
try:
76+
if isinstance(value, list): # noqa: SIM108
77+
casted_value = [field_type(item) for item in value]
78+
else:
79+
casted_value = field_type(value)
80+
except (TypeError, ValueError) as ex:
81+
errors.append(str(ex))
82+
83+
return casted_value, errors
84+
85+
def create_filter(self, schema_field: ModelField, model_column, operator, value):
6986
"""
7087
Create sqlalchemy filter
7188
:param schema_field:
@@ -107,17 +124,7 @@ def create_filter(self, schema_field: ModelField, model_column, operator, value)
107124
if clear_value is None and userspace_types:
108125
log.warning("Filtering by user type values is not properly tested yet. Use this on your own risk.")
109126

110-
cast_failed = object()
111-
clear_value = cast_failed
112-
113-
for i_type in types:
114-
try:
115-
if isinstance(value, list): # noqa: SIM108
116-
clear_value = [i_type(item) for item in value]
117-
else:
118-
clear_value = i_type(value)
119-
except (TypeError, ValueError) as ex:
120-
errors.append(str(ex))
127+
clear_value, errors = self._cast_value_with_scheme(types, value)
121128

122129
if clear_value is cast_failed:
123130
raise InvalidType(

0 commit comments

Comments
 (0)