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

Made Misago more vigilant about online stats.

Ralfp 12 лет назад
Родитель
Сommit
c32cdb13ab
3 измененных файлов с 28 добавлено и 17 удалено
  1. 11 9
      misago/apps/index.py
  2. 1 4
      misago/apps/signin/views.py
  3. 16 4
      misago/onlines.py

+ 11 - 9
misago/apps/index.py

@@ -57,23 +57,25 @@ def index(request):
             if rank['id'] == request.user.rank_id and not request.user.pk in rank['pks']:
                 rank['online'].append(request.user)
                 rank['pks'].append(request.user.pk)
-                cache.delete_many(['team_users_online', 'ranks_online'])
+                request.onlines.count_sessions()
                 break
 
     # Users online
-    users_online = {
-                    'members': request.onlines.members(),
-                    'all': request.onlines.all(),
-                   }
+    users_online = request.onlines.stats()
 
-    # Final cleanup of stats to don't confuse people
+    # Here we check for signs that online stats are out of sync
+    # If they are, we trigger recount. Dont worry about repeated count_sessions()
+    # calls, function is smart enough to to dont recount more than once per request
     if not users_online['members'] and request.user.is_authenticated():
-        users_online['members'] += 1
+        request.onlines.count_sessions()
     if users_online['members'] > users_online['all']:
-        users_online['all'] = users_online['members']
+        request.onlines.count_sessions()
     if (users_online['members'] == users_online['all'] and
             not request.user.is_authenticated()):
-        users_online['all'] += 1
+        request.onlines.count_sessions()
+
+    # Use recounted information
+    users_online = request.onlines.stats()
 
     # Load reads tracker and build forums list
     reads_tracker = ForumsTracker(request.user)

+ 1 - 4
misago/apps/signin/views.py

@@ -1,4 +1,3 @@
-from django.core.cache import cache
 from django.core.urlresolvers import reverse
 from django.shortcuts import redirect
 from django.template import RequestContext
@@ -107,7 +106,5 @@ def signout(request):
     request.messages.set_flash(Message(_("You have been signed out.")), 'info', 'security')
     if request.firewall.admin:
         return redirect(reverse(site.get_admin_index()))
-    request.onlines.sign_out()
-    if user.pk in cache.get('team_users_online', []):
-        cache.delete_many(['team_users_online', 'ranks_online'])
+    request.onlines.count_sessions()
     return redirect(reverse('index'))

+ 16 - 4
misago/onlines.py

@@ -1,9 +1,11 @@
 from datetime import timedelta
+from django.core.cache import cache
 from django.utils import timezone
 from misago.models import Session
 
 class MembersOnline(object):
     def __init__(self, monitor, frequency=180):
+        self.recounted = False
         self.monitor = monitor
         self.frequency = frequency
         self._members = int(monitor['online_members'])
@@ -13,11 +15,15 @@ class MembersOnline(object):
         if (monitor.expired('online_all', frequency) or
                 monitor.expired('online_members', frequency)):
             self.count_sessions()
+            self.recounted = False
 
     def count_sessions(self):
-        queryset = Session.objects.filter(matched=True).filter(crawler__isnull=True).filter(last__gte=timezone.now() - timedelta(seconds=self.frequency))
-        self._all = queryset.count()
-        self._members = queryset.filter(user__isnull=False).count()
+        if not self.recounted:
+            self.recounted = True
+            queryset = Session.objects.filter(matched=True).filter(crawler__isnull=True).filter(last__gte=timezone.now() - timedelta(seconds=self.frequency))
+            self._all = queryset.count()
+            self._members = queryset.filter(user__isnull=False).count()
+            cache.delete_many(['team_users_online', 'ranks_online'])
 
     def new_session(self):
         self._all += 1
@@ -39,4 +45,10 @@ class MembersOnline(object):
         if self._members != self._om:
             self.monitor['online_members'] = self._members
         if self._all != self._oa:
-            self.monitor['online_all'] = self._all
+            self.monitor['online_all'] = self._all
+
+    def stats(self):
+        return {
+                'members': self.members(),
+                'all': self.all(),
+               }