diff --git a/utils/api/api.py b/utils/api/api.py index 5b7a231..3f3f24c 100644 --- a/utils/api/api.py +++ b/utils/api/api.py @@ -89,20 +89,22 @@ class APIView(View): def error(self, msg="error", err="error"): return self.response({"error": err, "data": msg}) - def _serializer_error_to_str(self, errors): - for k, v in errors.items(): - if isinstance(v, list): - return k, v[0] - elif isinstance(v, OrderedDict): - for _k, _v in v.items(): - return self._serializer_error_to_str({_k: _v}) + def extract_errors(self, errors, key="field"): + if isinstance(errors, dict): + if not errors: + return key, "Invalid field" + key = list(errors.keys())[0] + return self.extract_errors(errors.pop(key), key) + elif isinstance(errors, list): + return self.extract_errors(errors[0], key) def invalid_serializer(self, serializer): - k, v = self._serializer_error_to_str(serializer.errors) - if k != "non_field_errors": - return self.error(err="invalid-" + k, msg=k + ": " + v) + key, error = self.extract_errors(serializer.errors) + if key == "non_field_errors": + msg = error else: - return self.error(err="invalid-field", msg=v) + msg = f"{key}: {error}" + return self.error(err=f"invalid-{key}", msg=msg) def server_error(self): return self.error(err="server-error", msg="server error")