errorpages.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. from django.http import JsonResponse
  2. from django.shortcuts import render
  3. from django.utils.translation import ugettext as _
  4. from misago.core.utils import is_request_to_misago
  5. from misago.admin.views.errorpages import admin_error_page, admin_csrf_failure
  6. def _ajax_error(code=406, message=None):
  7. return JsonResponse({'detail': message}, status=code)
  8. @admin_error_page
  9. def _error_page(request, code, message=None):
  10. response = render(request,
  11. 'misago/errorpages/%s.html' % code,
  12. {'message': message})
  13. response.status_code = code
  14. return response
  15. def permission_denied(request, message=None):
  16. if request.is_ajax():
  17. return _ajax_error(403, message or _("Permission denied."))
  18. else:
  19. return _error_page(request, 403, message)
  20. def page_not_found(request):
  21. if request.is_ajax():
  22. return _ajax_error(404, "Not found.")
  23. else:
  24. return _error_page(request, 404)
  25. @admin_csrf_failure
  26. def csrf_failure(request, reason=""):
  27. if request.is_ajax():
  28. print 'C> %s' % request.META.get("CSRF_COOKIE")
  29. print 'E> %s' % request.META.get('HTTP_X_CSRFTOKEN', '')
  30. return _ajax_error(403, _("Request authentication is invalid."))
  31. else:
  32. response = render(request, 'misago/errorpages/csrf_failure.html')
  33. response.status_code = 403
  34. return response
  35. def not_allowed(request):
  36. response = render(request, 'misago/errorpages/405.html')
  37. response.status_code = 405
  38. return response
  39. # Decorators for custom error page handlers
  40. def shared_403_exception_handler(f):
  41. def page_decorator(request, *args, **kwargs):
  42. if is_request_to_misago(request):
  43. return permission_denied(request)
  44. else:
  45. return f(request, *args, **kwargs)
  46. return page_decorator
  47. def shared_404_exception_handler(f):
  48. def page_decorator(request, *args, **kwargs):
  49. if is_request_to_misago(request):
  50. return page_not_found(request)
  51. else:
  52. return f(request, *args, **kwargs)
  53. return page_decorator