errorpages.py 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. from django.http import JsonResponse
  2. from django.shortcuts import render
  3. from django.utils.translation import ugettext as _
  4. from misago.admin.views.errorpages import admin_csrf_failure, admin_error_page
  5. from .utils import is_request_to_misago
  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. request.frontend_context.update({
  11. 'CURRENT_LINK': 'misago:error-%s' % code,
  12. })
  13. return render(
  14. request, 'misago/errorpages/%s.html' % code, {
  15. 'message': message,
  16. }, status=code
  17. )
  18. def banned(request, ban):
  19. request.frontend_context.update({
  20. 'MESSAGE': ban.get_serialized_message(),
  21. 'CURRENT_LINK': 'misago:error-banned',
  22. })
  23. return render(
  24. request, 'misago/errorpages/banned.html', {
  25. 'ban': ban,
  26. }, status=403
  27. )
  28. def permission_denied(request, message=None):
  29. if request.is_ajax():
  30. return _ajax_error(403, message or _("Permission denied."))
  31. else:
  32. return _error_page(request, 403, message)
  33. def page_not_found(request):
  34. if request.is_ajax():
  35. return _ajax_error(404, "Not found.")
  36. else:
  37. return _error_page(request, 404)
  38. @admin_csrf_failure
  39. def csrf_failure(request, reason=""):
  40. if request.is_ajax():
  41. return _ajax_error(403, _("Request authentication is invalid."))
  42. else:
  43. response = render(request, 'misago/errorpages/csrf_failure.html')
  44. response.status_code = 403
  45. return response
  46. def not_allowed(request):
  47. return _error_page(request, 405)
  48. # Decorators for custom error page handlers
  49. def shared_403_exception_handler(f):
  50. def page_decorator(request, *args, **kwargs):
  51. if is_request_to_misago(request):
  52. return permission_denied(request)
  53. else:
  54. return f(request, *args, **kwargs)
  55. return page_decorator
  56. def shared_404_exception_handler(f):
  57. def page_decorator(request, *args, **kwargs):
  58. if is_request_to_misago(request):
  59. return page_not_found(request)
  60. else:
  61. return f(request, *args, **kwargs)
  62. return page_decorator