Browse Source

Changes in online tracking.

Ralfp 12 years ago
parent
commit
7213f9d12b
5 changed files with 54 additions and 31 deletions
  1. 1 15
      misago/apps/index.py
  2. 1 0
      misago/middleware/session.py
  3. 39 13
      misago/onlines.py
  4. 9 2
      misago/sessions.py
  5. 4 1
      misago/settings_base.py

+ 1 - 15
misago/apps/index.py

@@ -61,21 +61,7 @@ def index(request):
                 break
 
     # Users online
-    users_online = request.onlines.stats()
-
-    # 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():
-        request.onlines.count_sessions()
-    if users_online['members'] > users_online['all']:
-        request.onlines.count_sessions()
-    if (users_online['members'] == users_online['all'] and
-            not request.user.is_authenticated()):
-        request.onlines.count_sessions()
-
-    # Use recounted information
-    users_online = request.onlines.stats()
+    users_online = request.onlines.stats(request)
 
     # Load reads tracker and build forums list
     reads_tracker = ForumsTracker(request.user)

+ 1 - 0
misago/middleware/session.py

@@ -21,6 +21,7 @@ class SessionMiddleware(object):
                     request.session['visit_sync'] = timezone.now()
                     request.user.last_date = timezone.now()
                     request.user.save(force_update=True)
+            request.session.match()
             request.session.save()
         except AttributeError:
             pass

+ 39 - 13
misago/onlines.py

@@ -5,7 +5,6 @@ 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'])
@@ -15,15 +14,12 @@ 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):
-        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'])
+        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
@@ -35,9 +31,11 @@ class MembersOnline(object):
         if self._members:
             self._members -= 1
 
+    @property
     def all(self):
         return self._all
 
+    @property
     def members(self):
         return self._members
 
@@ -47,8 +45,36 @@ class MembersOnline(object):
         if self._all != self._oa:
             self.monitor['online_all'] = self._all
 
-    def stats(self):
-        return {
-                'members': self.members(),
-                'all': self.all(),
-               }
+    def stats(self, request=None):
+        # Are we request-aware?
+        if not request:
+            return {
+                    'members': self.members,
+                    'all': self.all,
+                   }
+
+        online = self.stats()
+
+        # Here we check for signs that online stats are out of sync
+        try:
+            if not online['members'] and request.user.is_authenticated():
+                raise ValueError()
+            if online['members'] > online['all']:
+                raise ValueError()
+            if (online['members'] == online['all'] and
+                    not request.user.is_authenticated()):
+                raise ValueError()
+            return online
+        except ValueError:
+            if request.session.matched:
+                self.count_sessions()
+                return self.stats()
+            else:
+                if request.user.is_authenticated() and not online['members']:
+                    online['members'] += 1
+                if online['members'] > online['all']:
+                    online['all'] = online['members']
+                if request.user.is_anonymous() and online['members'] == online['all']:
+                    online['all'] += 1
+                return online
+

+ 9 - 2
misago/sessions.py

@@ -78,12 +78,16 @@ class MisagoSession(SessionBase):
         else:
             self._session_rk.save(force_insert=True)
 
+    def match(self):
+        self._session_rk.matched = True
+
 
 class CrawlerSession(MisagoSession):
     """
     Crawler Session controller
     """
     def __init__(self, request):
+        self.matched = True
         self.started = False
         self.team = False
         self._ip = self.get_ip(request)
@@ -127,6 +131,7 @@ class HumanSession(MisagoSession):
     """
     def __init__(self, request):
         self.started = False
+        self.matched = False
         self.expired = False
         self.team = False
         self.rank = None
@@ -157,9 +162,10 @@ class HumanSession(MisagoSession):
                 raise IncorrectSessionException()
             
             # Change session to matched and extract session user
-            if not self._session_rk.matched:
+            if self._session_rk.matched:
+                self.matched = True
+            else:
                 self.started = True
-            self._session_rk.matched = True
             self._user = self._session_rk.user
             self.team = self._session_rk.team
         except (Session.DoesNotExist, IncorrectSessionException):
@@ -168,6 +174,7 @@ class HumanSession(MisagoSession):
                 self.remember_me = auth_remember(request, self.get_ip(request))
                 self.create(request, user=self.remember_me.user)
                 self.started = True
+                self._session_rk.matched = True
             except AuthException as e:
                 # Autolog failed
                 self.create(request)

+ 4 - 1
misago/settings_base.py

@@ -146,7 +146,10 @@ MARKDOWN_EXTENSIONS = (
     'misago.markdown.extensions.mentions.MentionsExtension',
     'misago.markdown.extensions.magiclinks.MagicLinksExtension',
     'misago.markdown.extensions.cleanlinks.CleanLinksExtension',
-    'misago.markdown.extensions.bbcodes.BBCodesExtension',
+    # Uncomment for EXPERIMENTAL BBCode support
+    #'misago.markdown.extensions.bbcodes.BBCodesExtension',
+    # Uncomment for emoji support, requires emoji directory in static dir.
+    #'misago.markdown.extensions.emoji.EmojiExtension',
 )
 
 # Name of root urls configuration