exceptionhandler.py 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  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 OutdatedSlug
  6. HANDLED_EXCEPTIONS = (Http404, OutdatedSlug, PermissionDenied,)
  7. def is_misago_exception(exception):
  8. return exception.__class__ in HANDLED_EXCEPTIONS
  9. def handle_http404_exception(request, exception):
  10. return errorpages.page_not_found(request)
  11. def handle_outdated_slug_exception(request, exception):
  12. matched_url = request.resolver_match.url_name
  13. if request.resolver_match.namespace:
  14. matched_url = '%s:%s' % (request.resolver_match, matched_url)
  15. model = exception.args[0]
  16. model_name = model.__class__.__name__.lower()
  17. url_kwargs = request.resolver_match.kwargs
  18. url_kwargs['%s_slug' % model_name] = model.slug
  19. new_url = reverse(matched_url, kwargs=url_kwargs)
  20. return HttpResponsePermanentRedirect(new_url)
  21. def handle_permission_denied_exception(request, exception):
  22. try:
  23. error_message = exception.args[0]
  24. except IndexError:
  25. error_message = None
  26. return errorpages.permission_denied(request, error_message)
  27. EXCEPTION_HANDLERS = (
  28. (Http404, handle_http404_exception),
  29. (OutdatedSlug, handle_outdated_slug_exception),
  30. (PermissionDenied, handle_permission_denied_exception),
  31. )
  32. def get_exception_handler(exception):
  33. for exception_type, handler in EXCEPTION_HANDLERS:
  34. if isinstance(exception, exception_type):
  35. return handler
  36. else:
  37. raise ValueError(
  38. "%s is not Misago exception" % exception.__class__.__name__)
  39. def handle_misago_exception(request, exception):
  40. handler = get_exception_handler(exception)
  41. return handler(request, exception)