aboutsummaryrefslogtreecommitdiff
path: root/middleware
diff options
context:
space:
mode:
authorBobby <[email protected]>2023-05-28 06:29:00 -0400
committerBobby <[email protected]>2023-05-28 06:29:00 -0400
commitbddee38e88ffac9ba7129846ef1a9c7e61684bcc (patch)
tree1941b687b4234a980e84c52b3b0f27ac60c4c447 /middleware
parent1bb0aa7433ec5f9d1bc6252204c8d6e8a682396c (diff)
downloadthatcomputerscientist-bddee38e88ffac9ba7129846ef1a9c7e61684bcc.tar.xz
thatcomputerscientist-bddee38e88ffac9ba7129846ef1a9c7e61684bcc.zip
Online Users and Comma separated views
Diffstat (limited to 'middleware')
-rw-r--r--middleware/uuidmiddleware.py60
1 files changed, 60 insertions, 0 deletions
diff --git a/middleware/uuidmiddleware.py b/middleware/uuidmiddleware.py
new file mode 100644
index 00000000..c381c8e0
--- /dev/null
+++ b/middleware/uuidmiddleware.py
@@ -0,0 +1,60 @@
+import uuid
+from django.core.cache import cache
+
+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):
+ # 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')
+
+ # get the user's permissions
+ is_authenticated = request.user.is_authenticated
+ is_staff = request.user.is_staff
+
+ # get a list of anonymous users (retire after 60 seconds)
+ anonymous_users = cache.get('anonymous_users', set())
+ logged_in_users = cache.get('logged_in_users', set())
+ admin_users = cache.get('admin_users', set())
+
+ if not is_authenticated:
+ anonymous_users.add(user_uuid)
+ logged_in_users.discard(user_uuid)
+ admin_users.discard(user_uuid)
+ elif is_staff and is_authenticated:
+ admin_users.add(user_uuid)
+ anonymous_users.discard(user_uuid)
+ logged_in_users.discard(user_uuid)
+ else:
+ logged_in_users.add(user_uuid)
+ anonymous_users.discard(user_uuid)
+ admin_users.discard(user_uuid)
+ cache.set('anonymous_users', anonymous_users, 300)
+ cache.set('logged_in_users', logged_in_users, 300)
+ cache.set('admin_users', admin_users, 300)
+
+ anonymous_users = cache.get('anonymous_users', set())
+ logged_in_users = cache.get('logged_in_users', set())
+ admin_users = cache.get('admin_users', set())
+
+ return {
+ 'anonymous_users': len(anonymous_users),
+ 'logged_in_users': len(logged_in_users),
+ 'admin_users': len(admin_users),
+ }
+