Browse Source

Track online users

Rafał Pitoń 11 years ago
parent
commit
7dc2f78c6a
3 changed files with 41 additions and 1 deletions
  1. 1 0
      misago/conf/defaults.py
  2. 8 0
      misago/users/authbackends.py
  3. 32 1
      misago/users/middleware.py

+ 1 - 0
misago/conf/defaults.py

@@ -115,6 +115,7 @@ MIDDLEWARE_CLASSES = (
     'django.middleware.clickjacking.XFrameOptionsMiddleware',
     'misago.core.middleware.threadstore.ThreadStoreMiddleware',
     'misago.core.middleware.exceptionhandler.ExceptionHandlerMiddleware',
+    'misago.users.middleware.OnlineTrackerMiddleware',
     'misago.admin.middleware.AdminAuthMiddleware',
 )
 

+ 8 - 0
misago/users/authbackends.py

@@ -17,3 +17,11 @@ class MisagoBackend(ModelBackend):
             # Run the default password hasher once to reduce the timing
             # difference between an existing and a non-existing user (#20760).
             UserModel().set_password(password)
+
+    def get_user(self, user_id):
+        UserModel = get_user_model()
+        try:
+            manager = UserModel._default_manager
+            return manager.select_related('online_tracker').get(pk=user_id)
+        except UserModel.DoesNotExist:
+            return None

+ 32 - 1
misago/users/middleware.py

@@ -1,7 +1,38 @@
-from misago.users.models import AnonymousUser
+from django.utils import timezone
+from misago.users.models import AnonymousUser, Online
 
 
 class UserMiddleware(object):
     def process_request(self, request):
         if request.user.is_anonymous():
             request.user = AnonymousUser()
+
+
+class OnlineTrackerMiddleware(object):
+    def process_request(self, request):
+        if request.user.is_authenticated():
+            try:
+                request._misago_online_tracker = request.user.online_tracker
+            except Online.DoesNotExist:
+                online_tracker = Online.objects.create(user=request.user)
+                request.user.online_tracker = online_tracker
+                request._misago_online_tracker = online_tracker
+        else:
+            request._misago_online_tracker = None
+
+    def process_response(self, request, response):
+        if hasattr(request, '_misago_online_tracker'):
+            tracker = request._misago_online_tracker
+
+            if tracker:
+                if request.user.is_anonymous():
+                    # User logged off, update his last visit and blam tracker
+                    user = tracker.user
+                    user.last_active = tracker.last_click
+                    user.save(update_fields=['last_active'])
+                else:
+                    # Bump user's tracker time
+                    tracker.last_click = timezone.now()
+                    tracker.save(update_fields=['last_click'])
+
+        return response