errorpages.py 2.4 KB

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