|
6 | 6 | import orjson |
7 | 7 | from bs4 import BeautifulSoup |
8 | 8 | from django.core.cache import caches |
| 9 | +from django.core.exceptions import NON_FIELD_ERRORS |
9 | 10 | from django.forms import ValidationError |
10 | 11 | from django.http import HttpRequest, JsonResponse |
11 | 12 | from django.http.response import HttpResponseNotModified |
|
36 | 37 | logger.setLevel(logging.DEBUG) |
37 | 38 |
|
38 | 39 |
|
| 40 | +MIN_VALIDATION_ERROR_ARGS = 2 |
| 41 | + |
| 42 | + |
39 | 43 | def handle_error(view_func): |
40 | 44 | """ |
41 | 45 | Returns a JSON response with an error if necessary. |
@@ -130,19 +134,28 @@ def _process_component_request(request: HttpRequest, component_request: Componen |
130 | 134 | is_reset_called = is_reset_called | _is_reset_called |
131 | 135 | validate_all_fields = validate_all_fields | _validate_all_fields |
132 | 136 | except ValidationError as e: |
133 | | - if hasattr(e, "error_list"): |
134 | | - raise AssertionError("ValidationError must be instantiated with a dictionary") from e |
135 | | - |
136 | | - for field, message in e.message_dict.items(): |
137 | | - if not e.args[1]: |
138 | | - raise AssertionError("Error code must be specified") from e |
| 137 | + if len(e.args) < MIN_VALIDATION_ERROR_ARGS or not e.args[1]: |
| 138 | + raise AssertionError("Error code must be specified") from e |
139 | 139 |
|
| 140 | + if hasattr(e, "error_list"): |
140 | 141 | error_code = e.args[1] |
141 | 142 |
|
142 | | - if field in component.errors: |
143 | | - component.errors[field].append({"code": error_code, "message": message}) |
144 | | - else: |
145 | | - component.errors[field] = [{"code": error_code, "message": message}] |
| 143 | + for error in e.error_list: |
| 144 | + if NON_FIELD_ERRORS in component.errors: |
| 145 | + component.errors[NON_FIELD_ERRORS].append({"code": error_code, "message": error.message}) |
| 146 | + else: |
| 147 | + component.errors[NON_FIELD_ERRORS] = [{"code": error_code, "message": error.message}] |
| 148 | + elif hasattr(e, "message_dict"): |
| 149 | + for field, message in e.message_dict.items(): |
| 150 | + if not e.args[1]: |
| 151 | + raise AssertionError("Error code must be specified") from e |
| 152 | + |
| 153 | + error_code = e.args[1] |
| 154 | + |
| 155 | + if field in component.errors: |
| 156 | + component.errors[field].append({"code": error_code, "message": message}) |
| 157 | + else: |
| 158 | + component.errors[field] = [{"code": error_code, "message": message}] |
146 | 159 | else: |
147 | 160 | raise UnicornViewError(f"Unknown action_type '{action.action_type}'") |
148 | 161 |
|
|
0 commit comments