diff --git a/zerver/lib/exceptions.py b/zerver/lib/exceptions.py index 9dce24b3cc..5ea75cccd6 100644 --- a/zerver/lib/exceptions.py +++ b/zerver/lib/exceptions.py @@ -1,6 +1,7 @@ from enum import Enum from typing import Any, Dict, List, NoReturn, Optional, Tuple, Type, TypeVar +from django.core.exceptions import ValidationError from django.utils.translation import gettext as _ T = TypeVar("T", bound="AbstractEnum") @@ -390,3 +391,14 @@ class AccessDeniedError(JsonableError): class ResourceNotFoundError(JsonableError): http_status_code = 404 + + +class ValidationFailureError(JsonableError): + # This class translations a Django ValidationError into a + # Zulip-style JsonableError, sending back just the first error for + # consistency of API. + data_fields = ["errors"] + + def __init__(self, error: ValidationError) -> None: + super().__init__(error.messages[0]) + self.errors = dict(error) diff --git a/zerver/views/realm_linkifiers.py b/zerver/views/realm_linkifiers.py index 6a91bc3540..53fcf56905 100644 --- a/zerver/views/realm_linkifiers.py +++ b/zerver/views/realm_linkifiers.py @@ -4,9 +4,9 @@ from django.utils.translation import gettext as _ from zerver.decorator import require_realm_admin from zerver.lib.actions import do_add_linkifier, do_remove_linkifier, do_update_linkifier -from zerver.lib.exceptions import JsonableError +from zerver.lib.exceptions import JsonableError, ValidationFailureError from zerver.lib.request import REQ, has_request_variables -from zerver.lib.response import json_error, json_success +from zerver.lib.response import json_success from zerver.models import RealmFilter, UserProfile, linkifiers_for_realm @@ -32,7 +32,7 @@ def create_linkifier( ) return json_success({"id": linkifier_id}) except ValidationError as e: - return json_error(e.messages[0], data={"errors": dict(e)}) + raise ValidationFailureError(e) @require_realm_admin @@ -66,4 +66,4 @@ def update_linkifier( except RealmFilter.DoesNotExist: raise JsonableError(_("Linkifier not found.")) except ValidationError as e: - return json_error(e.messages[0], data={"errors": dict(e)}) + raise ValidationFailureError(e) diff --git a/zerver/views/realm_playgrounds.py b/zerver/views/realm_playgrounds.py index a49190e50b..a426bd1a78 100644 --- a/zerver/views/realm_playgrounds.py +++ b/zerver/views/realm_playgrounds.py @@ -6,8 +6,9 @@ from django.utils.translation import gettext as _ from zerver.decorator import require_realm_admin from zerver.lib.actions import do_add_realm_playground, do_remove_realm_playground +from zerver.lib.exceptions import ValidationFailureError from zerver.lib.request import REQ, JsonableError, has_request_variables -from zerver.lib.response import json_error, json_success +from zerver.lib.response import json_success from zerver.lib.validator import check_capped_string, check_url from zerver.models import Realm, RealmPlayground, UserProfile @@ -50,7 +51,7 @@ def add_realm_playground( url_prefix=url_prefix.strip(), ) except ValidationError as e: - return json_error(e.messages[0], data={"errors": dict(e)}) + raise ValidationFailureError(e) return json_success({"id": playground_id})