Browse Source

revamped decorators for ember app

Rafał Pitoń 10 years ago
parent
commit
f15389beaf

+ 12 - 16
misago/users/decorators.py

@@ -1,5 +1,6 @@
 from django.core.exceptions import PermissionDenied
-from django.utils.translation import gettext_lazy as _
+from django.shortcuts import redirect
+from django.utils.translation import gettext as _
 
 from misago.users.bans import get_request_ip_ban
 
@@ -8,10 +9,10 @@ def deny_authenticated(f):
     def decorator(request, *args, **kwargs):
         if request.user.is_authenticated():
             if request.is_ajax():
-                message = _("This action is not available to signed in users.")
+                raise PermissionDenied(
+                    _("This action is not available to signed in users."))
             else:
-                message = _("This page is not available to signed in users.")
-            raise PermissionDenied(message)
+                return redirect('misago:index')
         else:
             return f(request, *args, **kwargs)
     return decorator
@@ -21,10 +22,10 @@ def deny_guests(f):
     def decorator(request, *args, **kwargs):
         if request.user.is_anonymous():
             if request.is_ajax():
-                message = _("This action is not available to guests.")
+                raise PermissionDenied(
+                    _("This action is not available to guests."))
             else:
-                message = _("This page is not available to guests.")
-            raise PermissionDenied(message)
+                return redirect('misago:index')
         else:
             return f(request, *args, **kwargs)
     return decorator
@@ -34,15 +35,10 @@ def deny_banned_ips(f):
     def decorator(request, *args, **kwargs):
         ban = get_request_ip_ban(request)
         if ban:
-            default_message = _("Your IP address has been banned.")
-            ban_message = ban.get('message') or default_message
-
-            if ban.get('expires'):
-                ban_expires = ban['formatted_expiration_date']
-                expiration_message = _("This ban will end on %(date)s.")
-                expiration_message = expiration_message % {'date': ban_expires}
-                ban_message = '%s\n\n%s' % (ban_message, expiration_message)
-            raise PermissionDenied(ban_message)
+            if request.is_ajax():
+                raise PermissionDenied(ban.get_serialized_message())
+            else:
+                return redirect('misago:index')
         else:
             return f(request, *args, **kwargs)
     return decorator

+ 24 - 15
misago/users/tests/test_decorators.py

@@ -1,35 +1,44 @@
-from django.contrib.auth import get_user_model
 from django.core.urlresolvers import reverse
-from django.test import TestCase
+from misago.users.testutils import UserTestCase
 
 
-class DenyAuthenticatedTests(TestCase):
+class DenyAuthenticatedTests(UserTestCase):
+    ajax_header = {'HTTP_X_REQUESTED_WITH': 'XMLHttpRequest'}
+
     def test_success(self):
         """deny_authenticated decorator allowed guest request"""
-        response = self.client.get(reverse('misago:login'))
+        response = self.client.get(reverse('misago:request_password_reset'))
         self.assertEqual(response.status_code, 200)
 
     def test_fail(self):
         """deny_authenticated decorator blocked authenticated request"""
-        User = get_user_model()
-        test_user = User.objects.create_user('Bob', 'bob@test.com', 'Pass.123')
-        self.client.login(username=test_user.username, password='Pass.123')
+        self.login_user(self.get_authenticated_user())
+
+        response = self.client.get(reverse('misago:request_password_reset'))
+        self.assertEqual(response.status_code, 302)
 
-        response = self.client.get(reverse('misago:login'))
+        response = self.client.get(reverse('misago:request_password_reset'),
+                                           **self.ajax_header)
         self.assertEqual(response.status_code, 403)
 
 
-class DenyGuestsTests(TestCase):
+class DenyGuestsTests(UserTestCase):
+    ajax_header = {'HTTP_X_REQUESTED_WITH': 'XMLHttpRequest'}
+
     def test_success(self):
         """deny_guests decorator allowed authenticated request"""
-        User = get_user_model()
-        test_user = User.objects.create_user('Bob', 'bob@test.com', 'Pass.123')
-        self.client.login(username=test_user.username, password='Pass.123')
+        self.login_user(self.get_authenticated_user())
 
-        response = self.client.post(reverse('misago:logout'))
-        self.assertEqual(response.status_code, 302)
+        response = self.client.post(
+            reverse('misago:usercp_change_forum_options'))
+        self.assertEqual(response.status_code, 200)
 
     def test_fail(self):
         """deny_guests decorator blocked authenticated request"""
-        response = self.client.post(reverse('misago:logout'))
+        response = self.client.post(
+            reverse('misago:usercp_change_forum_options'))
+        self.assertEqual(response.status_code, 302)
+
+        response = self.client.get(
+            reverse('misago:usercp_change_forum_options'), **self.ajax_header)
         self.assertEqual(response.status_code, 403)

+ 5 - 0
misago/users/views/forgottenpassword.py

@@ -7,6 +7,7 @@ from django.views.decorators.debug import sensitive_post_parameters
 
 from misago.conf import settings
 from misago.core.mail import mail_user
+from misago.core.views import noscript
 
 from misago.users.bans import get_user_ban
 from misago.users.decorators import deny_authenticated, deny_banned_ips
@@ -25,6 +26,10 @@ def reset_view(f):
 
 @reset_view
 def request_reset(request):
+    return noscript(request, **{
+        'title': _("Change forgotten password"),
+        'message': _("To change forgotten password enable JavaScript."),
+    })
     form = ResetPasswordForm()
 
     if request.method == 'POST':

+ 5 - 0
misago/users/views/usercp.py

@@ -12,6 +12,7 @@ from misago.conf import settings
 from misago.core.decorators import ajax_only, require_POST
 from misago.core.exceptions import AjaxError
 from misago.core.mail import mail_user
+from misago.core.views import noscript
 from misago.markup import Editor
 from misago.notifications import read_user_notifications
 
@@ -42,6 +43,10 @@ def render(request, template, context=None):
 
 @deny_guests
 def change_forum_options(request):
+    return noscript(request, **{
+        'title': _("Change options"),
+        'message': _("To change forum options enable JavaScript."),
+    })
     form = ChangeForumOptionsForm(instance=request.user)
     if request.method == 'POST':
         form = ChangeForumOptionsForm(request.POST, instance=request.user)