exceptionhandler.py 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. from django.core.exceptions import PermissionDenied
  2. from django.http import Http404, HttpResponsePermanentRedirect, JsonResponse
  3. from django.urls import reverse
  4. from django.utils import six
  5. from . import errorpages
  6. from .exceptions import AjaxError, Banned, ExplicitFirstPage, OutdatedSlug
  7. HANDLED_EXCEPTIONS = [
  8. AjaxError,
  9. Banned,
  10. ExplicitFirstPage,
  11. Http404,
  12. OutdatedSlug,
  13. PermissionDenied,
  14. ]
  15. def is_misago_exception(exception):
  16. return exception.__class__ in HANDLED_EXCEPTIONS
  17. def handle_ajax_error(request, exception):
  18. json = {
  19. 'is_error': 1,
  20. 'message': six.text_type(exception.message),
  21. }
  22. return JsonResponse(json, status=exception.code)
  23. def handle_banned_exception(request, exception):
  24. return errorpages.banned(request, exception)
  25. def handle_explicit_first_page_exception(request, exception):
  26. matched_url = request.resolver_match.url_name
  27. if request.resolver_match.namespace:
  28. matched_url = '%s:%s' % (request.resolver_match.namespace, matched_url)
  29. url_kwargs = request.resolver_match.kwargs
  30. del url_kwargs['page']
  31. new_url = reverse(matched_url, kwargs=url_kwargs)
  32. return HttpResponsePermanentRedirect(new_url)
  33. def handle_http404_exception(request, exception):
  34. return errorpages.page_not_found(request, exception)
  35. def handle_outdated_slug_exception(request, exception):
  36. view_name = request.resolver_match.view_name
  37. model = exception.args[0]
  38. url_kwargs = request.resolver_match.kwargs
  39. url_kwargs['slug'] = model.slug
  40. new_url = reverse(view_name, kwargs=url_kwargs)
  41. return HttpResponsePermanentRedirect(new_url)
  42. def handle_permission_denied_exception(request, exception):
  43. return errorpages.permission_denied(request, exception)
  44. EXCEPTION_HANDLERS = [
  45. (AjaxError, handle_ajax_error),
  46. (Banned, handle_banned_exception),
  47. (Http404, handle_http404_exception),
  48. (ExplicitFirstPage, handle_explicit_first_page_exception),
  49. (OutdatedSlug, handle_outdated_slug_exception),
  50. (PermissionDenied, handle_permission_denied_exception),
  51. ]
  52. def get_exception_handler(exception):
  53. for exception_type, handler in EXCEPTION_HANDLERS:
  54. if isinstance(exception, exception_type):
  55. return handler
  56. else:
  57. raise ValueError("%s is not Misago exception" % exception.__class__.__name__)
  58. def handle_misago_exception(request, exception):
  59. handler = get_exception_handler(exception)
  60. return handler(request, exception)