489.1.18
by franku
replace tracking with a single online_users_middleware |
1 |
from django.conf import settings |
2 |
from django.core.cache import cache |
|
3 |
from django.contrib.auth.models import User |
|
4 |
from django.utils.deprecation import MiddlewareMixin |
|
5 |
from django.contrib.auth import user_logged_out |
|
6 |
from django.dispatch import receiver |
|
7 |
||
8 |
ONLINE_THRESHOLD = getattr(settings, 'ONLINE_THRESHOLD', 60 * 15) |
|
9 |
ONLINE_MAX = getattr(settings, 'ONLINE_MAX', 50) |
|
10 |
||
489.1.21
by franku
pyformat on online_users_middleware |
11 |
|
489.1.18
by franku
replace tracking with a single online_users_middleware |
12 |
def get_online_now(self): |
13 |
return User.objects.filter(id__in=self.online_now_ids or []) |
|
14 |
||
489.1.21
by franku
pyformat on online_users_middleware |
15 |
|
489.1.18
by franku
replace tracking with a single online_users_middleware |
16 |
@receiver(user_logged_out) |
17 |
def logout(sender, **kwargs): |
|
493.1.1
by franku
fix for last server error; define a CACHE backend to use another than default |
18 |
try: |
19 |
cache.delete('online-%s' % kwargs['user'].id) |
|
493.1.2
by franku
This is an Attribute error |
20 |
except AttributeError: |
493.1.1
by franku
fix for last server error; define a CACHE backend to use another than default |
21 |
pass
|
489.1.21
by franku
pyformat on online_users_middleware |
22 |
|
489.1.18
by franku
replace tracking with a single online_users_middleware |
23 |
|
24 |
class OnlineNowMiddleware(MiddlewareMixin): |
|
489.1.21
by franku
pyformat on online_users_middleware |
25 |
"""Maintains a list of users who have interacted with the website recently.
|
26 |
||
27 |
Their user IDs are available as ``online_now_ids`` on the request
|
|
28 |
object, and their corresponding users are available (lazily) as the
|
|
489.1.18
by franku
replace tracking with a single online_users_middleware |
29 |
``online_now`` property on the request object.
|
489.1.21
by franku
pyformat on online_users_middleware |
30 |
|
489.1.18
by franku
replace tracking with a single online_users_middleware |
31 |
"""
|
32 |
||
33 |
def process_request(self, request): |
|
34 |
# First get the index
|
|
35 |
uids = cache.get('online-now', []) |
|
489.1.21
by franku
pyformat on online_users_middleware |
36 |
|
489.1.18
by franku
replace tracking with a single online_users_middleware |
37 |
# Perform the multiget on the individual online uid keys
|
38 |
online_keys = ['online-%s' % (u,) for u in uids] |
|
39 |
fresh = cache.get_many(online_keys).keys() |
|
40 |
online_now_ids = [int(k.replace('online-', '')) for k in fresh] |
|
489.1.21
by franku
pyformat on online_users_middleware |
41 |
|
489.1.18
by franku
replace tracking with a single online_users_middleware |
42 |
# If the user is authenticated, add their id to the list
|
492.1.1
by franku
fixed server error for py-modindex; fixes some warnings |
43 |
if request.user.is_authenticated: |
489.1.18
by franku
replace tracking with a single online_users_middleware |
44 |
uid = request.user.id |
45 |
# If their uid is already in the list, we want to bump it
|
|
46 |
# to the top, so we remove the earlier entry.
|
|
47 |
if uid in online_now_ids: |
|
48 |
online_now_ids.remove(uid) |
|
49 |
online_now_ids.append(uid) |
|
50 |
if len(online_now_ids) > ONLINE_MAX: |
|
51 |
del online_now_ids[0] |
|
489.1.21
by franku
pyformat on online_users_middleware |
52 |
|
489.1.18
by franku
replace tracking with a single online_users_middleware |
53 |
# Attach our modifications to the request object
|
54 |
request.__class__.online_now_ids = online_now_ids |
|
55 |
request.__class__.online_now = property(get_online_now) |
|
489.1.21
by franku
pyformat on online_users_middleware |
56 |
|
489.1.18
by franku
replace tracking with a single online_users_middleware |
57 |
# Set the new cache
|
58 |
cache.set('online-%s' % (request.user.pk,), True, ONLINE_THRESHOLD) |
|
489.1.21
by franku
pyformat on online_users_middleware |
59 |
cache.set('online-now', online_now_ids, ONLINE_THRESHOLD) |