aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--blog/views.py1
-rw-r--r--middleware/uuidmiddleware.py60
-rw-r--r--static/css/sidebar.css14
-rw-r--r--templates/blog/partials/sidebar.html12
-rw-r--r--thatcomputerscientist/settings.py2
5 files changed, 87 insertions, 2 deletions
diff --git a/blog/views.py b/blog/views.py
index a40aef35..f422b256 100644
--- a/blog/views.py
+++ b/blog/views.py
@@ -150,6 +150,7 @@ def post(request, slug):
post.first_paragraph = first_paragraph
post.body = str(soup)
+ post.views = '{:,}'.format(post.views)
tags = post.tags.all()
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),
+ }
+
diff --git a/static/css/sidebar.css b/static/css/sidebar.css
index 12917902..e43c3b07 100644
--- a/static/css/sidebar.css
+++ b/static/css/sidebar.css
@@ -90,7 +90,8 @@
#archives-area h2,
#categories-area h2,
#admin-area h2,
-#fun-stuff h2 {
+#fun-stuff h2,
+#online-users h2 {
background: #311b4f;
padding: 10px 15px;
text-align: left;
@@ -106,10 +107,19 @@
#archives-area ul,
#categories-area ul,
#admin-area ul,
-#fun-stuff ul {
+#fun-stuff ul,
+#online-users div {
background: #f4f1e90f;
padding: 10px;
border-bottom-left-radius: 8px;
border-bottom-right-radius: 8px;
}
+#online-users div > ul {
+ padding: 0 0 0 20px;
+}
+
+#online-users p {
+ margin: 0;
+}
+
diff --git a/templates/blog/partials/sidebar.html b/templates/blog/partials/sidebar.html
index b0c7b59b..1ef7877b 100644
--- a/templates/blog/partials/sidebar.html
+++ b/templates/blog/partials/sidebar.html
@@ -317,3 +317,15 @@
</li>
</ul>
</div>
+<div id="online-users" class="mtctitem">
+ <h2>Who's Online?</h2>
+ <div>
+ <p>In total, there {% if not anonymous_users|add:logged_in_users|add:admin_users == 1%}are{% else %}is{% endif %} {{ anonymous_users|add:logged_in_users|add:admin_users }} user{% if not anonymous_users|add:logged_in_users|add:admin_users == 1%}s{% endif %} online ::</p>
+ <ul>
+ <li>{{ anonymous_users }} Guest{% if not anonymous_users == 1%}s{% endif %}</li>
+ <li>{{ logged_in_users }} Registered User{% if not logged_in_users == 1%}s{% endif %}</li>
+ <li>{{ admin_users }} Staff Member{% if not admin_users == 1%}s{% endif %}</li>
+ </ul>
+ <p>(Based on users active over the past 5 minutes)</p>
+ </div>
+</div>
diff --git a/thatcomputerscientist/settings.py b/thatcomputerscientist/settings.py
index c345cbb0..11895250 100644
--- a/thatcomputerscientist/settings.py
+++ b/thatcomputerscientist/settings.py
@@ -86,6 +86,7 @@ MIDDLEWARE = [
'whitenoise.middleware.WhiteNoiseMiddleware',
'middleware.oldbrowsermiddleware.OldBrowserMiddleware',
'middleware.globalmetamiddleware.GlobalMetaMiddleware',
+ 'middleware.uuidmiddleware.UserUUIDMiddleware',
]
CONFIGURED_SUBDOMAINS = {
@@ -110,6 +111,7 @@ TEMPLATES = [
'django.contrib.messages.context_processors.messages',
'blog.context_processors.categories',
'blog.context_processors.archives',
+ 'middleware.uuidmiddleware.userTrackingContextProcessor',
],
},
},