~widelands-dev/widelands-website/django_staticfiles

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)