Просмотр исходного кода

fix #839, wip #838: updated deps to latest versions, django 1.11 works

Rafał Pitoń 8 лет назад
Родитель
Сommit
aaf26ebe5d

+ 3 - 0
.gitignore

@@ -69,6 +69,9 @@ futuredep/
 venv/
 venv2/
 venv3/
+venv34/
+venv35/
+venv36/
 future-manage.py
 misago-admin.py
 db.sqlite3

+ 5 - 2
misago/admin/views/errorpages.py

@@ -1,17 +1,20 @@
 from django.shortcuts import redirect
 
 from misago.admin.auth import is_admin_session, update_admin_session
+from misago.core.utils import get_exception_message
 
 from . import get_protected_namespace, protected_admin_view, render
 
 
 # Magic error page used by admin
 @protected_admin_view
-def _error_page(request, code, message=None):
+def _error_page(request, code, exception=None, default_message=None):
     if is_admin_session(request):
         template_pattern = 'misago/admin/errorpages/%s.html' % code
 
-        response = render(request, template_pattern, {'message': message}, error_page=True)
+        response = render(request, template_pattern, {
+            'message': get_exception_message(exception, default_message),
+        }, error_page=True)
         response.status_code = code
         return response
     else:

+ 18 - 14
misago/core/errorpages.py

@@ -4,27 +4,31 @@ from django.utils.translation import ugettext as _
 
 from misago.admin.views.errorpages import admin_csrf_failure, admin_error_page
 
-from .utils import is_request_to_misago
+from .utils import get_exception_message, is_request_to_misago
 
 
-def _ajax_error(code=406, message=None):
-    return JsonResponse({'detail': message}, status=code)
+def _ajax_error(code, exception=None, default_message=None):
+    return JsonResponse({
+        'detail': get_exception_message(exception, default_message),
+    }, status=code)
 
 
 @admin_error_page
-def _error_page(request, code, message=None):
+def _error_page(request, code, exception=None, default_message=None):
     request.frontend_context.update({
         'CURRENT_LINK': 'misago:error-%s' % code,
     })
 
     return render(
         request, 'misago/errorpages/%s.html' % code, {
-            'message': message,
+            'message': get_exception_message(exception, default_message),
         }, status=code
     )
 
 
-def banned(request, ban):
+def banned(request, exception):
+    ban = exception.ban
+
     request.frontend_context.update({
         'MESSAGE': ban.get_serialized_message(),
         'CURRENT_LINK': 'misago:error-banned',
@@ -37,18 +41,18 @@ def banned(request, ban):
     )
 
 
-def permission_denied(request, message=None, exception=None):
+def permission_denied(request, exception):
     if request.is_ajax():
-        return _ajax_error(403, message or _("Permission denied."))
+        return _ajax_error(403, exception, _("Permission denied."))
     else:
-        return _error_page(request, 403, message)
+        return _error_page(request, 403, exception)
 
 
-def page_not_found(request, exception=None):
+def page_not_found(request, exception):
     if request.is_ajax():
-        return _ajax_error(404, "Not found.")
+        return _ajax_error(404, exception, "Not found.")
     else:
-        return _error_page(request, 404)
+        return _error_page(request, 404, exception)
 
 
 @admin_csrf_failure
@@ -69,7 +73,7 @@ def not_allowed(request):
 def shared_403_exception_handler(f):
     def page_decorator(request, *args, **kwargs):
         if is_request_to_misago(request):
-            return permission_denied(request)
+            return permission_denied(request, *args, **kwargs)
         else:
             return f(request, *args, **kwargs)
 
@@ -79,7 +83,7 @@ def shared_403_exception_handler(f):
 def shared_404_exception_handler(f):
     def page_decorator(request, *args, **kwargs):
         if is_request_to_misago(request):
-            return page_not_found(request)
+            return page_not_found(request, *args, **kwargs)
         else:
             return f(request, *args, **kwargs)
 

+ 3 - 8
misago/core/exceptionhandler.py

@@ -32,7 +32,7 @@ def handle_ajax_error(request, exception):
 
 
 def handle_banned_exception(request, exception):
-    return errorpages.banned(request, exception.ban)
+    return errorpages.banned(request, exception)
 
 
 def handle_explicit_first_page_exception(request, exception):
@@ -48,7 +48,7 @@ def handle_explicit_first_page_exception(request, exception):
 
 
 def handle_http404_exception(request, exception):
-    return errorpages.page_not_found(request)
+    return errorpages.page_not_found(request, exception)
 
 
 def handle_outdated_slug_exception(request, exception):
@@ -63,12 +63,7 @@ def handle_outdated_slug_exception(request, exception):
 
 
 def handle_permission_denied_exception(request, exception):
-    try:
-        error_message = exception.args[0]
-    except IndexError:
-        error_message = None
-
-    return errorpages.permission_denied(request, error_message)
+    return errorpages.permission_denied(request, exception)
 
 
 EXCEPTION_HANDLERS = [

+ 2 - 2
misago/core/testproject/views.py

@@ -131,10 +131,10 @@ def test_require_post(request):
 
 
 @errorpages.shared_403_exception_handler
-def mock_custom_403_error_page(request):
+def mock_custom_403_error_page(request, exception):
     return HttpResponse("Custom 403", status=403)
 
 
 @errorpages.shared_404_exception_handler
-def mock_custom_404_error_page(request):
+def mock_custom_404_error_page(request, exception):
     return HttpResponse("Custom 404", status=404)

+ 6 - 4
misago/core/tests/test_errorpages.py

@@ -1,3 +1,5 @@
+from django.core.exceptions import PermissionDenied
+from django.http import Http404
 from django.test import Client, TestCase, override_settings
 from django.test.client import RequestFactory
 from django.urls import reverse
@@ -64,9 +66,9 @@ class CustomErrorPagesTests(TestCase):
         response = self.client.get(reverse('raise-403'))
         self.assertContains(response, "Custom 403", status_code=403)
 
-        response = mock_custom_403_error_page(self.misago_request)
+        response = mock_custom_403_error_page(self.misago_request, PermissionDenied())
         self.assertNotContains(response, "Custom 403", status_code=403)
-        response = mock_custom_403_error_page(self.site_request)
+        response = mock_custom_403_error_page(self.site_request, PermissionDenied())
         self.assertContains(response, "Custom 403", status_code=403)
 
     def test_shared_404_decorator(self):
@@ -76,7 +78,7 @@ class CustomErrorPagesTests(TestCase):
         response = self.client.get(reverse('raise-404'))
         self.assertContains(response, "Custom 404", status_code=404)
 
-        response = mock_custom_404_error_page(self.misago_request)
+        response = mock_custom_404_error_page(self.misago_request, Http404())
         self.assertNotContains(response, "Custom 404", status_code=404)
-        response = mock_custom_404_error_page(self.site_request)
+        response = mock_custom_404_error_page(self.site_request, Http404())
         self.assertContains(response, "Custom 404", status_code=404)

+ 28 - 1
misago/core/tests/test_utils.py

@@ -1,13 +1,14 @@
 #-*- coding: utf-8 -*-
 from __future__ import unicode_literals
 
+from django.core.exceptions import PermissionDenied
 from django.test import TestCase
 from django.test.client import RequestFactory
 from django.urls import reverse
 
 from misago.core.utils import (
     clean_return_path, format_plaintext_for_html, is_referer_local, is_request_to_misago,
-    parse_iso8601_string, slugify)
+    parse_iso8601_string, slugify, get_exception_message)
 
 
 VALID_PATHS = ("/", "/threads/", )
@@ -238,3 +239,29 @@ class IsRefererLocalTests(TestCase):
             }
         )
         self.assertFalse(is_referer_local(bad_request))
+
+
+class GetExceptionMessageTests(TestCase):
+    def test_no_args(self):
+        """both of helper args are optional"""
+        message = get_exception_message()
+        self.assertIsNone(message)
+
+    def test_no_default_message(self):
+        """helper's default message arg is optional"""
+        message = get_exception_message(PermissionDenied('Lorem Ipsum'))
+        self.assertEqual(message, 'Lorem Ipsum')
+
+        message = get_exception_message(PermissionDenied())
+        self.assertIsNone(message)
+
+    def test_default_message(self):
+        """helper's default message arg is used"""
+        message = get_exception_message(PermissionDenied('Lorem Ipsum'), 'Default')
+        self.assertEqual(message, 'Lorem Ipsum')
+
+        message = get_exception_message(PermissionDenied(), 'Default')
+        self.assertEqual(message, 'Default')
+
+        message = get_exception_message(default_message='Lorem Ipsum')
+        self.assertEqual(message, 'Lorem Ipsum')

+ 10 - 0
misago/core/utils.py

@@ -136,3 +136,13 @@ def is_referer_local(request):
         return False
 
     return True
+
+
+def get_exception_message(exception=None, default_message=None):
+    if not exception:
+        return default_message
+
+    try:
+        return exception.args[0]
+    except IndexError:
+        return default_message

+ 0 - 11
misago/urls.py

@@ -54,14 +54,3 @@ if settings.MISAGO_ADMIN_PATH:
     urlpatterns += [
         url(admin_prefix, include((adminpatterns, 'admin'), namespace='admin')),
     ]
-
-
-# Make error pages accessible casually in DEBUG
-if settings.DEBUG:
-    from misago.core import errorpages
-    urlpatterns += [
-        url(r'^403/$', errorpages.permission_denied),
-        url(r'^404/$', errorpages.page_not_found),
-        url(r'^405/$', errorpages.not_allowed),
-        url(r'^csrf-failure/$', errorpages.csrf_failure),
-    ]