123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- from datetime import timedelta
- from django.core.cache import cache
- from django.utils import timezone
- from misago.models import Session
- from misago.monitor import monitor, UpdatingMonitor
- class MembersOnline(object):
- def __init__(self, mode, frequency=180):
- self.frequency = frequency
- self._mode = mode
- self._members = int(monitor.online_members)
- self._all = int(monitor.online_all)
- self._om = self._members
- self._oa = self._all
- if (self._mode != 'no' or monitor.expired('online_all', frequency) or
- monitor.expired('online_members', frequency)):
- self.count_sessions()
- 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()
- cache.delete_many(['team_users_online', 'ranks_online'])
- def new_session(self):
- self._all += 1
- def sign_in(self):
- self._members += 1
- def sign_out(self):
- if self._members:
- self._members -= 1
- @property
- def all(self):
- return self._all
- @property
- def members(self):
- return self._members
- def sync(self):
- if self._mode == 'snap':
- with UpdatingMonitor() as cm:
- if self._members != self._om:
- monitor.online_members = self._members
- if self._all != self._oa:
- monitor.online_all = self._all
- def stats(self, request):
- stat = {
- 'members': self.members,
- 'all': self.all,
- }
- if not request.user.is_crawler():
- if not stat['members'] and request.user.is_authenticated():
- stat['members'] += 1
- stat['all'] += 1
- if not stat['all']:
- stat['all'] += 1
- return stat
|