Socialify

Folder ..

Viewing uuidmiddleware.py
81 lines (67 loc) • 2.5 KB

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
import json
import uuid

import redis
import os
from dotenv import load_dotenv

load_dotenv()

redis_instance = redis.StrictRedis(
  host=os.getenv('REDIS_HOST'),
  port=os.getenv('REDIS_PORT'),
  password=os.getenv('REDIS_PASSWORD'),
  db=0
)

class UserUUIDMiddleware:
    # assign a uuid to the user if they don't have one
    # store in cookies for 365 days
    def __init__(self, get_response):
        self.get_response = get_response
        self.cookie_name = 'user_uuid'

    def __call__(self, request):
        if not request.COOKIES.get(self.cookie_name):
            response = self.get_response(request)
            response.set_cookie(self.cookie_name, uuid.uuid4(), max_age=31536000)
            return response
        return self.get_response(request)

def userTrackingContextProcessor(request):
    # ignore /rss/ path
    if '/rss/' in request.path:
        return {
            'anonymous_users': 0,
            'logged_in_users': 0,
            'admin_users': 0,
        }

    # user tracking context processor - track 3 types of users (anonymous, logged in, admin)
    # based on the user's uuid cookie. Only UUID are necessary to track online users. Then we
    # separate them into anonymous, logged in, and admin users based on their permissions.

    # get the user's uuid from the cookie
    user_uuid = request.COOKIES.get('user_uuid')
    user_data = {
        'is_authenticated': request.user.is_authenticated,
        'is_staff': request.user.is_staff,
    }

    redis_instance.set(f"presence_{user_uuid}", json.dumps(user_data), ex=300)

    # get all online users
    online_now = redis_instance.keys('presence_*')

    # separate online users into anonymous, logged in, and admin users
    anonymous_users = []
    logged_in_users = []
    admin_users = []

    for user in online_now:
        user_data = redis_instance.get(user)
        user_data = json.loads(user_data)
        if user_data['is_authenticated'] == False and user_data['is_staff'] == False:
            anonymous_users.append(user_data)
        elif user_data['is_authenticated'] == True and user_data['is_staff'] == False:
            logged_in_users.append(user_data)
        if user_data['is_staff'] == True:
            admin_users.append(user_data)

    an = len(anonymous_users)
    lo = len(logged_in_users)
    ad = len(admin_users)
    if user_uuid is not None:
        an = max((an - 1), 0) if lo + ad > 0 else max(an - 1, 1)

    return {
        'anonymous_users': an,
        'logged_in_users': lo,
        'admin_users': ad,
    }