Move utilities.api.rest_api_server_error() to utilities.error_handlers.handle_rest_api_exception()

This commit is contained in:
Jeremy Stretch 2024-03-21 10:03:55 -04:00
parent a9bb4c5c3e
commit 19bb808936
3 changed files with 30 additions and 25 deletions

View File

@ -13,7 +13,8 @@ from django.http import Http404, HttpResponseRedirect
from extras.context_managers import event_tracking from extras.context_managers import event_tracking
from netbox.config import clear_config, get_config from netbox.config import clear_config, get_config
from netbox.views import handler_500 from netbox.views import handler_500
from utilities.api import is_api_request, rest_api_server_error from utilities.api import is_api_request
from utilities.error_handlers import handle_rest_api_exception
__all__ = ( __all__ = (
'CoreMiddleware', 'CoreMiddleware',
@ -71,7 +72,7 @@ class CoreMiddleware:
# Cleanly handle exceptions that occur from REST API requests # Cleanly handle exceptions that occur from REST API requests
if is_api_request(request): if is_api_request(request):
return rest_api_server_error(request) return handle_rest_api_exception(request)
# Ignore Http404s (defer to Django's built-in 404 handling) # Ignore Http404s (defer to Django's built-in 404 handling)
if isinstance(exception, Http404): if isinstance(exception, Http404):
@ -211,7 +212,7 @@ class MaintenanceModeMiddleware:
'operations. Please try again later.' 'operations. Please try again later.'
if is_api_request(request): if is_api_request(request):
return rest_api_server_error(request, error=error_message) return handle_rest_api_exception(request, error=error_message)
messages.error(request, error_message) messages.error(request, error_message)
return HttpResponseRedirect(request.path_info) return HttpResponseRedirect(request.path_info)

View File

@ -1,22 +1,16 @@
import platform
import sys
from django.conf import settings
from django.contrib.contenttypes.fields import GenericForeignKey from django.contrib.contenttypes.fields import GenericForeignKey
from django.core.exceptions import ( from django.core.exceptions import (
FieldDoesNotExist, FieldError, MultipleObjectsReturned, ObjectDoesNotExist, ValidationError, FieldDoesNotExist, FieldError, MultipleObjectsReturned, ObjectDoesNotExist, ValidationError,
) )
from django.db.models.fields.related import ManyToOneRel, RelatedField from django.db.models.fields.related import ManyToOneRel, RelatedField
from django.http import JsonResponse
from django.urls import reverse from django.urls import reverse
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from rest_framework import status
from rest_framework.serializers import Serializer from rest_framework.serializers import Serializer
from rest_framework.views import get_view_name as drf_get_view_name from rest_framework.views import get_view_name as drf_get_view_name
from extras.constants import HTTP_CONTENT_TYPE_JSON from extras.constants import HTTP_CONTENT_TYPE_JSON
from netbox.api.fields import RelatedObjectCountField
from netbox.api.exceptions import GraphQLTypeNotFound, SerializerNotFound from netbox.api.exceptions import GraphQLTypeNotFound, SerializerNotFound
from netbox.api.fields import RelatedObjectCountField
from .utils import count_related, dict_to_filter_params, dynamic_import, title from .utils import count_related, dict_to_filter_params, dynamic_import, title
__all__ = ( __all__ = (
@ -27,7 +21,6 @@ __all__ = (
'get_serializer_for_model', 'get_serializer_for_model',
'get_view_name', 'get_view_name',
'is_api_request', 'is_api_request',
'rest_api_server_error',
) )
@ -180,17 +173,3 @@ def get_related_object_by_attrs(queryset, attrs):
return queryset.get(pk=pk) return queryset.get(pk=pk)
except ObjectDoesNotExist: except ObjectDoesNotExist:
raise ValidationError(_("Related object not found using the provided numeric ID: {id}").format(id=pk)) raise ValidationError(_("Related object not found using the provided numeric ID: {id}").format(id=pk))
def rest_api_server_error(request, *args, **kwargs):
"""
Handle exceptions and return a useful error message for REST API requests.
"""
type_, error, traceback = sys.exc_info()
data = {
'error': str(error),
'exception': type_.__name__,
'netbox_version': settings.VERSION,
'python_version': platform.python_version(),
}
return JsonResponse(data, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

View File

@ -1,8 +1,19 @@
import platform
import sys
from django.conf import settings
from django.contrib import messages from django.contrib import messages
from django.db.models import ProtectedError, RestrictedError from django.db.models import ProtectedError, RestrictedError
from django.http import JsonResponse
from django.utils.html import escape from django.utils.html import escape
from django.utils.safestring import mark_safe from django.utils.safestring import mark_safe
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from rest_framework import status
__all__ = (
'handle_protectederror',
'handle_rest_api_exception',
)
def handle_protectederror(obj_list, request, e): def handle_protectederror(obj_list, request, e):
@ -32,3 +43,17 @@ def handle_protectederror(obj_list, request, e):
err_message += ', '.join(dependent_objects) err_message += ', '.join(dependent_objects)
messages.error(request, mark_safe(err_message)) messages.error(request, mark_safe(err_message))
def handle_rest_api_exception(request, *args, **kwargs):
"""
Handle exceptions and return a useful error message for REST API requests.
"""
type_, error, traceback = sys.exc_info()
data = {
'error': str(error),
'exception': type_.__name__,
'netbox_version': settings.VERSION,
'python_version': platform.python_version(),
}
return JsonResponse(data, status=status.HTTP_500_INTERNAL_SERVER_ERROR)