errorpages.py 2.1 KB

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