@@ -80,7 +80,7 @@ cdef class InputFilter:
8080 all required conditions; otherwise, returns False.
8181 """
8282 try :
83- self .validateData ()
83+ self .validate_data ()
8484
8585 except ValidationError as e:
8686 self .errors = e.args[0 ]
@@ -99,13 +99,7 @@ cdef class InputFilter:
9999 cls
100100
101101 Returns:
102- Callable[
103- [Any],
104- Callable[
105- [tuple[Any, ...], Dict[str, Any]],
106- Union[Response, tuple[Any, Dict[str, Any]]],
107- ],
108- ]
102+ Callable
109103 """
110104 def decorator (
111105 f ,
@@ -140,14 +134,22 @@ cdef class InputFilter:
140134 if not any (request_method == method for method in input_filter.methods):
141135 return Response(status = 405 , response = " Method Not Allowed" )
142136
143- data = request.json if request.is_json else request.args
137+ if request.is_json:
138+ data = request.get_json(cache = True )
139+ if not isinstance (data, dict ):
140+ data = {}
141+ else :
142+ data = dict (request.args)
144143
145144 try :
146- kwargs = kwargs or {}
145+ if kwargs:
146+ data.update(kwargs)
147147
148- input_filter.data = {** data, ** kwargs}
148+ input_filter.data = data
149+ input_filter.validated_data = {}
150+ input_filter.errors = {}
149151
150- g.validated_data = input_filter.validateData ()
152+ g.validated_data = input_filter.validate_data ()
151153
152154 except ValidationError as e:
153155 return Response(
@@ -157,7 +159,7 @@ cdef class InputFilter:
157159 )
158160
159161 except Exception :
160- logging.getLogger( __name__ ). exception(
162+ logging.exception(
161163 " An unexpected exception occurred while "
162164 " validating input data." ,
163165 )
@@ -205,59 +207,89 @@ cdef class InputFilter:
205207 """
206208 data = data or self .data
207209 cdef dict errors = {}
208- cdef bint required
210+ cdef dict validated_data = {}
211+
209212 cdef object default
210213 cdef object fallback
211214 cdef list filters
212215 cdef list validators
213216 cdef object external_api
214217 cdef str copy
215218
216- for field_name, field_info in self .fields.items():
217- value = data.get(field_name)
218-
219- required = field_info.required
220- default = field_info.default
221- fallback = field_info.fallback
222- filters = field_info.filters + self .global_filters
223- validators = field_info.validators + self .global_validators
224- steps = field_info.steps
225- external_api = field_info.external_api
226- copy = field_info.copy
219+ cdef list global_filters = self .global_filters
220+ cdef list global_validators = self .global_validators
221+ cdef bint has_global_filters = bool (global_filters)
222+ cdef bint has_global_validators = bool (global_validators)
227223
224+ for field_name, field_info in self .fields.items():
228225 try :
229- if copy:
230- value = self .validated_data.get(copy)
231-
232- if external_api:
226+ if field_info.copy:
227+ value = validated_data.get(field_info.copy)
228+ elif field_info.external_api:
233229 value = ExternalApiMixin.call_external_api(
234- external_api, fallback, self .validated_data
230+ field_info.external_api,
231+ field_info.fallback,
232+ validated_data,
235233 )
234+ else :
235+ value = data.get(field_name)
236+
237+ if field_info.filters or has_global_filters:
238+ filters = field_info.filters
239+ if has_global_filters:
240+ filters = filters + global_filters
241+ value = FieldMixin.apply_filters(filters, value)
242+
243+ if field_info.validators or has_global_validators:
244+ validators = field_info.validators
245+ if has_global_validators:
246+ validators = validators + global_validators
247+ result = FieldMixin.validate_field(
248+ validators, field_info.fallback, value
249+ )
250+ if result is not None :
251+ value = result
236252
237- value = FieldMixin.apply_filters(filters, value)
238- value = FieldMixin.validate_field(validators, fallback, value) or value
239- value = FieldMixin.apply_steps(steps, fallback, value) or value
240- value = FieldMixin.check_for_required(
241- field_name, required, default, fallback, value
242- )
243-
244- self .validated_data[field_name] = value
253+ if field_info.steps:
254+ result = FieldMixin.apply_steps(
255+ field_info.steps, field_info.fallback, value
256+ )
257+ if result is not None :
258+ value = result
259+
260+ if value is None :
261+ if field_info.required:
262+ if field_info.fallback is not None :
263+ value = field_info.fallback
264+ elif field_info.default is not None :
265+ value = field_info.default
266+ else :
267+ raise ValidationError(
268+ f" Field '{field_name}' is required."
269+ )
270+ elif field_info.default is not None :
271+ value = field_info.default
272+
273+ validated_data[field_name] = value
245274
246275 except ValidationError as e:
247276 errors[field_name] = str (e)
248277
249- try :
250- FieldMixin.check_conditions(self .conditions, self .validated_data)
251- except ValidationError as e:
252- errors[" _condition" ] = str (e)
278+ if self .conditions:
279+ try :
280+ FieldMixin.check_conditions(self .conditions, validated_data)
281+ except ValidationError as e:
282+ errors[" _condition" ] = str (e)
253283
254284 if errors:
255285 raise ValidationError(errors)
256286
287+ self .validated_data = validated_data
288+
257289 if self .model_class is not None :
258- return self .serialize( )
290+ return self .model_class( ** validated_data )
259291
260- return self . validated_data
292+ return validated_data
261293
262294 cpdef void addCondition(self , condition: BaseCondition):
263295 warnings.warn(
@@ -826,7 +858,7 @@ cdef class InputFilter:
826858 " Can only merge with another InputFilter instance."
827859 )
828860
829- for key, new_field in other.getInputs ().items():
861+ for key, new_field in other.get_inputs ().items():
830862 self .fields[key] = new_field
831863
832864 self .conditions += other.conditions
0 commit comments