Coverage for netbox/views/errors.py: 80%

28 statements  

« prev     ^ index     » next       coverage.py v7.15.2, created at 2026-10-10 18:35 +0000

1import platform 

2import sys 

3 

4from django.conf import settings 

5from django.http import HttpResponseServerError 

6from django.shortcuts import render 

7from django.template import loader 

8from django.template.exceptions import TemplateDoesNotExist 

9from django.views.decorators.csrf import requires_csrf_token 

10from django.views.defaults import ERROR_500_TEMPLATE_NAME, page_not_found 

11from django.views.generic import View 

12 

13from netbox.plugins.utils import get_installed_plugins 

14 

15__all__ = ( 

16 'StaticMediaFailureView', 

17 'handler_404', 

18 'handler_500', 

19) 

20 

21 

22class StaticMediaFailureView(View): 

23 """ 

24 Display a user-friendly error message with troubleshooting tips when a static media file fails to load. 

25 """ 

26 def get(self, request): 

27 return render(request, 'media_failure.html', { 

28 'filename': request.GET.get('filename') 

29 }) 

30 

31 

32def handler_404(request, exception): 

33 """ 

34 Wrap Django's default 404 handler to enable Sentry reporting. 

35 """ 

36 if settings.SENTRY_ENABLED: 36 ↛ 37line 36 didn't jump to line 37 because the condition on line 36 was never true

37 from sentry_sdk import capture_message 

38 capture_message("Page not found", level="error") 

39 

40 return page_not_found(request, exception) 

41 

42 

43@requires_csrf_token 

44def handler_500(request, template_name=ERROR_500_TEMPLATE_NAME): 

45 """ 

46 Custom 500 handler to provide additional context when rendering 500.html. 

47 """ 

48 try: 

49 template = loader.get_template(template_name) 

50 except TemplateDoesNotExist: 

51 return HttpResponseServerError('<h1>Server Error (500)</h1>', content_type='text/html') 

52 type_, error = sys.exc_info()[:2] 

53 

54 return HttpResponseServerError(template.render({ 

55 'request': request, 

56 'error': error, 

57 'exception': str(type_), 

58 'netbox_version': settings.RELEASE.full_version, 

59 'python_version': platform.python_version(), 

60 'plugins': get_installed_plugins(), 

61 }))