Browse Source

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

Rafał Pitoń 8 years ago
parent
commit
aaf26ebe5d

+ 3 - 0
.gitignore

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

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

@@ -1,17 +1,20 @@
 from django.shortcuts import redirect
 from django.shortcuts import redirect
 
 
 from misago.admin.auth import is_admin_session, update_admin_session
 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
 from . import get_protected_namespace, protected_admin_view, render
 
 
 
 
 # Magic error page used by admin
 # Magic error page used by admin
 @protected_admin_view
 @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):
     if is_admin_session(request):
         template_pattern = 'misago/admin/errorpages/%s.html' % code
         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
         response.status_code = code
         return response
         return response
     else:
     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 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
 @admin_error_page
-def _error_page(request, code, message=None):
+def _error_page(request, code, exception=None, default_message=None):
     request.frontend_context.update({
     request.frontend_context.update({
         'CURRENT_LINK': 'misago:error-%s' % code,
         'CURRENT_LINK': 'misago:error-%s' % code,
     })
     })
 
 
     return render(
     return render(
         request, 'misago/errorpages/%s.html' % code, {
         request, 'misago/errorpages/%s.html' % code, {
-            'message': message,
+            'message': get_exception_message(exception, default_message),
         }, status=code
         }, status=code
     )
     )
 
 
 
 
-def banned(request, ban):
+def banned(request, exception):
+    ban = exception.ban
+
     request.frontend_context.update({
     request.frontend_context.update({
         'MESSAGE': ban.get_serialized_message(),
         'MESSAGE': ban.get_serialized_message(),
         'CURRENT_LINK': 'misago:error-banned',
         '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():
     if request.is_ajax():
-        return _ajax_error(403, message or _("Permission denied."))
+        return _ajax_error(403, exception, _("Permission denied."))
     else:
     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():
     if request.is_ajax():
-        return _ajax_error(404, "Not found.")
+        return _ajax_error(404, exception, "Not found.")
     else:
     else:
-        return _error_page(request, 404)
+        return _error_page(request, 404, exception)
 
 
 
 
 @admin_csrf_failure
 @admin_csrf_failure
@@ -69,7 +73,7 @@ def not_allowed(request):
 def shared_403_exception_handler(f):
 def shared_403_exception_handler(f):
     def page_decorator(request, *args, **kwargs):
     def page_decorator(request, *args, **kwargs):
         if is_request_to_misago(request):
         if is_request_to_misago(request):
-            return permission_denied(request)
+            return permission_denied(request, *args, **kwargs)
         else:
         else:
             return f(request, *args, **kwargs)
             return f(request, *args, **kwargs)
 
 
@@ -79,7 +83,7 @@ def shared_403_exception_handler(f):
 def shared_404_exception_handler(f):
 def shared_404_exception_handler(f):
     def page_decorator(request, *args, **kwargs):
     def page_decorator(request, *args, **kwargs):
         if is_request_to_misago(request):
         if is_request_to_misago(request):
-            return page_not_found(request)
+            return page_not_found(request, *args, **kwargs)
         else:
         else:
             return f(request, *args, **kwargs)
             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):
 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):
 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):
 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):
 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):
 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 = [
 EXCEPTION_HANDLERS = [

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

@@ -131,10 +131,10 @@ def test_require_post(request):
 
 
 
 
 @errorpages.shared_403_exception_handler
 @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)
     return HttpResponse("Custom 403", status=403)
 
 
 
 
 @errorpages.shared_404_exception_handler
 @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)
     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 import Client, TestCase, override_settings
 from django.test.client import RequestFactory
 from django.test.client import RequestFactory
 from django.urls import reverse
 from django.urls import reverse
@@ -64,9 +66,9 @@ class CustomErrorPagesTests(TestCase):
         response = self.client.get(reverse('raise-403'))
         response = self.client.get(reverse('raise-403'))
         self.assertContains(response, "Custom 403", status_code=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)
         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)
         self.assertContains(response, "Custom 403", status_code=403)
 
 
     def test_shared_404_decorator(self):
     def test_shared_404_decorator(self):
@@ -76,7 +78,7 @@ class CustomErrorPagesTests(TestCase):
         response = self.client.get(reverse('raise-404'))
         response = self.client.get(reverse('raise-404'))
         self.assertContains(response, "Custom 404", status_code=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)
         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)
         self.assertContains(response, "Custom 404", status_code=404)

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

@@ -1,13 +1,14 @@
 #-*- coding: utf-8 -*-
 #-*- coding: utf-8 -*-
 from __future__ import unicode_literals
 from __future__ import unicode_literals
 
 
+from django.core.exceptions import PermissionDenied
 from django.test import TestCase
 from django.test import TestCase
 from django.test.client import RequestFactory
 from django.test.client import RequestFactory
 from django.urls import reverse
 from django.urls import reverse
 
 
 from misago.core.utils import (
 from misago.core.utils import (
     clean_return_path, format_plaintext_for_html, is_referer_local, is_request_to_misago,
     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/", )
 VALID_PATHS = ("/", "/threads/", )
@@ -238,3 +239,29 @@ class IsRefererLocalTests(TestCase):
             }
             }
         )
         )
         self.assertFalse(is_referer_local(bad_request))
         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 False
 
 
     return True
     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 += [
     urlpatterns += [
         url(admin_prefix, include((adminpatterns, 'admin'), namespace='admin')),
         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),
-    ]