diff options
| -rw-r--r-- | blog/views.py | 1 | ||||
| -rw-r--r-- | middleware/uuidmiddleware.py | 60 | ||||
| -rw-r--r-- | static/css/sidebar.css | 14 | ||||
| -rw-r--r-- | templates/blog/partials/sidebar.html | 12 | ||||
| -rw-r--r-- | thatcomputerscientist/settings.py | 2 |
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', ], }, }, |
