exceptionhandler.py 2.3 KB

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