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

misago.users middlewares cleanup

* added timezone middleware
* split preloading to separate middleware
* added extra tests
Rafał Pitoń 10 лет назад
Родитель
Сommit
6b59de2053

+ 2 - 0
misago/conf/defaults.py

@@ -130,6 +130,8 @@ MIDDLEWARE_CLASSES = (
     'django.contrib.auth.middleware.AuthenticationMiddleware',
     'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
     'misago.users.middleware.UserMiddleware',
+    'misago.users.middleware.TimezoneMiddleware',
+    'misago.users.middleware.PreloadUserMiddleware',
     'django.contrib.messages.middleware.MessageMiddleware',
     'django.middleware.clickjacking.XFrameOptionsMiddleware',
     'misago.core.middleware.exceptionhandler.ExceptionHandlerMiddleware',

+ 16 - 1
misago/users/middleware.py

@@ -1,7 +1,11 @@
-from django.conf import settings
+import pytz
+
 from django.contrib.auth import logout
 from django.contrib.auth.models import AnonymousUser as DjAnonymousUser
 from django.core.urlresolvers import resolve
+from django.utils import timezone
+
+from misago.conf import settings
 
 from misago.users.bans import get_request_ip_ban, get_user_ban
 from misago.users.models import AnonymousUser, Online
@@ -34,6 +38,17 @@ class UserMiddleware(object):
                 logout(request)
         request.user.ip = request._misago_real_ip
 
+
+class TimezoneMiddleware(object):
+    def process_request(self, request):
+        if request.user.is_authenticated():
+            timezone.activate(pytz.timezone(request.user.timezone))
+        else:
+            timezone.activate(pytz.timezone(settings.default_timezone))
+
+
+class PreloadUserMiddleware(object):
+    def process_request(self, request):
         request.preloaded_ember_data.update({
             'isAuthenticated': request.user.is_authenticated(),
         })

+ 27 - 0
misago/users/tests/test_realip_middleware.py

@@ -0,0 +1,27 @@
+from django.test import TestCase
+from misago.users.middleware import RealIPMiddleware
+
+
+class MockRequest(object):
+    def __init__(self, addr, forwarded_for=None):
+        self.META = {'REMOTE_ADDR': addr}
+
+        if forwarded_for:
+            self.META['HTTP_X_FORWARDED_FOR'] = forwarded_for
+
+
+class RealIPMiddlewareTests(TestCase):
+    def test_middleware_sets_ip_from_remote_add(self):
+        """Middleware sets ip from remote_addr header"""
+        request = MockRequest('83.42.13.77')
+        RealIPMiddleware().process_request(request)
+
+        self.assertEqual(request._misago_real_ip, request.META['REMOTE_ADDR'])
+
+    def test_middleware_sets_ip_from_forwarded_for(self):
+        """Middleware sets ip from forwarded_for header"""
+        request = MockRequest('127.0.0.1', '83.42.13.77')
+        RealIPMiddleware().process_request(request)
+
+        self.assertEqual(request._misago_real_ip,
+                         request.META['HTTP_X_FORWARDED_FOR'])

+ 47 - 0
misago/users/tests/test_timezone_middleware.py

@@ -0,0 +1,47 @@
+from django.test import TestCase
+from django.utils import timezone
+
+from misago.conf import settings
+
+from misago.users.middleware import TimezoneMiddleware
+
+
+class MockRequest(object):
+    def __init__(self, user):
+        self.user = user
+
+
+class MockAuthenticated(object):
+    timezone = 'Europe/Warsaw'
+
+    def is_authenticated(self):
+        return True
+
+
+class MockGuest(object):
+    def is_authenticated(self):
+        return False
+
+
+class TimezoneMiddlewareTests(TestCase):
+    def setUp(self):
+        timezone.activate('Europe/Paris')
+
+    def tearDown(self):
+        timezone.deactivate()
+
+    def test_middleware_sets_timezone_for_guest(self):
+        """Middleware sets ip from remote_addr header"""
+        request = MockRequest(MockGuest())
+        TimezoneMiddleware().process_request(request)
+
+        self.assertEqual(timezone.get_current_timezone_name().lower(),
+                         settings.default_timezone)
+
+    def test_middleware_sets_timezone_for_authenticated(self):
+        """Middleware sets ip from forwarded_for header"""
+        request = MockRequest(MockAuthenticated())
+        TimezoneMiddleware().process_request(request)
+
+        self.assertEqual(timezone.get_current_timezone_name(),
+                         MockAuthenticated.timezone)