Browse Source

Make request._misago_online_tracker an implementation detail

Rafał Pitoń 7 years ago
parent
commit
f90c328339
3 changed files with 50 additions and 35 deletions
  1. 3 17
      misago/users/middleware.py
  2. 45 16
      misago/users/online/tracker.py
  3. 2 2
      misago/users/serializers/options.py

+ 3 - 17
misago/users/middleware.py

@@ -2,7 +2,7 @@ from django.contrib.auth import logout
 from django.utils.deprecation import MiddlewareMixin
 from django.utils.deprecation import MiddlewareMixin
 
 
 from .bans import get_request_ip_ban, get_user_ban
 from .bans import get_request_ip_ban, get_user_ban
-from .models import AnonymousUser, Online
+from .models import AnonymousUser
 from .online import tracker
 from .online import tracker
 
 
 
 
@@ -27,22 +27,8 @@ class UserMiddleware(MiddlewareMixin):
 
 
 class OnlineTrackerMiddleware(MiddlewareMixin):
 class OnlineTrackerMiddleware(MiddlewareMixin):
     def process_request(self, request):
     def process_request(self, request):
-        if request.user.is_authenticated:
-            try:
-                request._misago_online_tracker = request.user.online_tracker
-            except Online.DoesNotExist:
-                tracker.start_tracking(request, request.user)
-        else:
-            request._misago_online_tracker = None
+        tracker.start_request_tracker(request)
 
 
     def process_response(self, request, response):
     def process_response(self, request, response):
-        if hasattr(request, '_misago_online_tracker'):
-            online_tracker = request._misago_online_tracker
-
-            if online_tracker:
-                if request.user.is_anonymous:
-                    tracker.stop_tracking(request, online_tracker)
-                else:
-                    tracker.update_tracker(request, online_tracker)
-
+        tracker.update_request_tracker(request)
         return response
         return response

+ 45 - 16
misago/users/online/tracker.py

@@ -5,7 +5,42 @@ from django.utils import timezone
 from misago.users.models import Online
 from misago.users.models import Online
 
 
 
 
-def mute_tracker(request):
+def unwrap_drf_request(f):
+    """utility decorator that unwraps django request from rest frameworks wrapper"""
+    def unwrapped_request_view(request, *args, **kwargs):
+        if isinstance(request, Request):
+            request = request._request
+        return f(request, *args, **kwargs)
+    return unwrapped_request_view
+
+
+@unwrap_drf_request
+def start_request_tracker(request):
+    if request.user.is_authenticated:
+        try:
+            request._misago_online_tracker = request.user.online_tracker
+        except Online.DoesNotExist:
+            start_tracking(request, request.user)
+    else:
+        request._misago_online_tracker = None
+    
+
+@unwrap_drf_request
+def update_request_tracker(request):
+    try:
+        online_tracker = request._misago_online_tracker
+    except AttributeError:
+        return
+
+    if online_tracker:
+        if request.user.is_anonymous:
+            stop_tracking(request, online_tracker)
+        else:
+            update_tracking(request, online_tracker)
+
+
+@unwrap_drf_request
+def clear_request_tracker(request):
     request._misago_online_tracker = None
     request._misago_online_tracker = None
 
 
 
 
@@ -19,23 +54,17 @@ def start_tracking(request, user):
     request._misago_online_tracker = online_tracker
     request._misago_online_tracker = online_tracker
 
 
 
 
-def update_tracker(request, tracker):
-    tracker.current_ip = request.user_ip
-    tracker.last_click = timezone.now()
+def update_tracking(request, online_tracker):
+    online_tracker.current_ip = request.user_ip
+    online_tracker.last_click = timezone.now()
 
 
-    tracker.save(update_fields=['last_click', 'current_ip'])
+    online_tracker.save(update_fields=['last_click', 'current_ip'])
 
 
 
 
-def stop_tracking(request, tracker):
-    user = tracker.user
-    user.last_login = tracker.last_click
-    user.last_ip = tracker.current_ip
+def stop_tracking(request, online_tracker):
+    user = online_tracker.user
+    user.last_login = online_tracker.last_click
+    user.last_ip = online_tracker.current_ip
     user.save(update_fields=['last_login', 'last_ip'])
     user.save(update_fields=['last_login', 'last_ip'])
 
 
-    tracker.delete()
-
-
-def clear_tracking(request):
-    if isinstance(request, Request):
-        request = request._request  # Fugly unwrap restframework's request 
-    request._misago_online_tracker = None
+    online_tracker.delete()

+ 2 - 2
misago/users/serializers/options.py

@@ -5,7 +5,7 @@ from django.contrib.auth.password_validation import validate_password
 from django.utils.translation import ugettext as _
 from django.utils.translation import ugettext as _
 
 
 from misago.conf import settings
 from misago.conf import settings
-from misago.users.online.tracker import clear_tracking
+from misago.users.online.tracker import clear_request_tracker
 from misago.users.permissions import allow_delete_own_account
 from misago.users.permissions import allow_delete_own_account
 from misago.users.validators import validate_email, validate_username
 from misago.users.validators import validate_email, validate_username
 
 
@@ -111,6 +111,6 @@ class DeleteOwnAccountSerializer(serializers.Serializer):
         allow_delete_own_account(request.user, profile)
         allow_delete_own_account(request.user, profile)
         
         
         logout(request)
         logout(request)
-        clear_tracking(request)
+        clear_request_tracker(request)
 
 
         profile.mark_for_delete()
         profile.mark_for_delete()