diff --git a/src/registrar/forms/application_wizard.py b/src/registrar/forms/application_wizard.py index aa583a10c..2eb359984 100644 --- a/src/registrar/forms/application_wizard.py +++ b/src/registrar/forms/application_wizard.py @@ -8,11 +8,8 @@ from django import forms from django.core.validators import RegexValidator, MaxLengthValidator from django.utils.safestring import mark_safe -from api.views import DOMAIN_API_MESSAGES - from registrar.models import Contact, DomainApplication, DraftDomain, Domain from registrar.templatetags.url_helpers import public_site_url -from registrar.utility import errors from registrar.utility.enums import ValidationErrorReturnType logger = logging.getLogger(__name__) @@ -386,7 +383,9 @@ class AlternativeDomainForm(RegistrarForm): def clean_alternative_domain(self): """Validation code for domain names.""" requested = self.cleaned_data.get("alternative_domain", None) - validated = DraftDomain.validate_and_handle_errors(requested, ValidationErrorReturnType.FORM_VALIDATION_ERROR) + validated = DraftDomain.validate_and_handle_errors( + requested, ValidationErrorReturnType.FORM_VALIDATION_ERROR, prevent_blank=False + ) return validated alternative_domain = forms.CharField( diff --git a/src/registrar/management/commands/utility/terminal_helper.py b/src/registrar/management/commands/utility/terminal_helper.py index 3ae9ff3cd..c24bd9616 100644 --- a/src/registrar/management/commands/utility/terminal_helper.py +++ b/src/registrar/management/commands/utility/terminal_helper.py @@ -2,6 +2,7 @@ import logging import sys from typing import List from registrar.utility.enums import LogCode + logger = logging.getLogger(__name__) diff --git a/src/registrar/models/utility/domain_helper.py b/src/registrar/models/utility/domain_helper.py index cf2369567..eb174d814 100644 --- a/src/registrar/models/utility/domain_helper.py +++ b/src/registrar/models/utility/domain_helper.py @@ -57,30 +57,44 @@ class DomainHelper: return domain @classmethod - def validate_and_handle_errors(cls, domain, error_return_type, display_success = False): - """Runs validate() and catches possible exceptions.""" + def validate_and_handle_errors(cls, domain, error_return_type, prevent_blank=True, display_success=False): + """ + Validates the provided domain and handles any validation errors. + + This method attempts to validate the domain using the `validate` method. If validation fails, + it catches the exception and returns an appropriate error response. The type of the error response + (JSON response or form validation error) is determined by the `error_return_type` parameter. + + If validation is successful and `display_success` is True, it returns a success response. + Otherwise, it returns the validated domain. + + Args: + domain (str): The domain to validate. + error_return_type (ValidationErrorReturnType): The type of error response to return if validation fails. + prevent_blank (bool, optional): Whether to return an exception if the input is blank. Defaults to True. + display_success (bool, optional): Whether to return a success response if validation is successful. Defaults to False. + + Returns: + The error response if validation fails, + the success response if validation is successful and `display_success` is True, + or the validated domain otherwise. + """ # noqa + try: validated = cls.validate(domain) except errors.BlankValueError: - return DomainHelper._return_form_error_or_json_response( - error_return_type, code="required" - ) + if not prevent_blank: + return DomainHelper._return_form_error_or_json_response(error_return_type, code="required") + else: + return validated except errors.ExtraDotsError: - return DomainHelper._return_form_error_or_json_response( - error_return_type, code="extra_dots" - ) + return DomainHelper._return_form_error_or_json_response(error_return_type, code="extra_dots") except errors.DomainUnavailableError: - return DomainHelper._return_form_error_or_json_response( - error_return_type, code="unavailable" - ) + return DomainHelper._return_form_error_or_json_response(error_return_type, code="unavailable") except errors.RegistrySystemError: - return DomainHelper._return_form_error_or_json_response( - error_return_type, code="error" - ) + return DomainHelper._return_form_error_or_json_response(error_return_type, code="error") except errors.InvalidDomainError: - return DomainHelper._return_form_error_or_json_response( - error_return_type, code="invalid" - ) + return DomainHelper._return_form_error_or_json_response(error_return_type, code="invalid") else: if display_success: return DomainHelper._return_form_error_or_json_response( @@ -88,16 +102,32 @@ class DomainHelper: ) else: return validated - + @staticmethod def _return_form_error_or_json_response(return_type: ValidationErrorReturnType, code, available=False): + """ + Returns an error response based on the `return_type`. + + If `return_type` is `FORM_VALIDATION_ERROR`, raises a form validation error. + If `return_type` is `JSON_RESPONSE`, returns a JSON response with 'available', 'code', and 'message' fields. + If `return_type` is neither, raises a ValueError. + + Args: + return_type (ValidationErrorReturnType): The type of error response. + code (str): The error code for the error message. + available (bool, optional): Availability, only used for JSON responses. Defaults to False. + + Returns: + A JSON response or a form validation error. + + Raises: + ValueError: If `return_type` is neither `FORM_VALIDATION_ERROR` nor `JSON_RESPONSE`. + """ # noqa match return_type: case ValidationErrorReturnType.FORM_VALIDATION_ERROR: raise forms.ValidationError(DOMAIN_API_MESSAGES[code], code=code) case ValidationErrorReturnType.JSON_RESPONSE: - return JsonResponse( - {"available": available, "code": code, "message": DOMAIN_API_MESSAGES[code]} - ) + return JsonResponse({"available": available, "code": code, "message": DOMAIN_API_MESSAGES[code]}) case _: raise ValueError("Invalid return type specified") diff --git a/src/registrar/utility/enums.py b/src/registrar/utility/enums.py index 64411f33e..6aa4f4044 100644 --- a/src/registrar/utility/enums.py +++ b/src/registrar/utility/enums.py @@ -5,6 +5,7 @@ from enum import Enum class ValidationErrorReturnType(Enum): """Determines the return value of the validate_and_handle_errors class""" + JSON_RESPONSE = "JSON_RESPONSE" FORM_VALIDATION_ERROR = "FORM_VALIDATION_ERROR" @@ -24,4 +25,4 @@ class LogCode(Enum): WARNING = 2 INFO = 3 DEBUG = 4 - DEFAULT = 5 \ No newline at end of file + DEFAULT = 5 diff --git a/src/registrar/utility/errors.py b/src/registrar/utility/errors.py index 199997cc2..bac18d076 100644 --- a/src/registrar/utility/errors.py +++ b/src/registrar/utility/errors.py @@ -16,9 +16,11 @@ class DomainUnavailableError(ValueError): class RegistrySystemError(ValueError): pass + class InvalidDomainError(ValueError): pass + class ActionNotAllowed(Exception): """User accessed an action that is not allowed by the current state"""