exceptionhandler.py 2.5 KB

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