Source code for userextensions.middleware

"""

"""
from django.utils import timezone
from django.conf import settings
from django.urls import resolve
from urllib.parse import urlparse

# Use MiddlewareMixin when present (Django >= 1.10)
try:
    from django.utils.deprecation import MiddlewareMixin
except ImportError:
    MiddlewareMixin = object

# import models
from userextensions.models import UserRecent


[docs]class UserRecentsMiddleware(MiddlewareMixin): """ This middleware parses data from requests and, where applicable, stores the full url path in the request to the users list of recently viewed pages (recents). No recents will be stored if the user is not authenticated, user can not be determined, or if the URL is invalid. Tracking can be filtered byt methods, URL prefixes, and static URLs via parameters in the settings.py file. The following are configurable: method: tracks only specified methods; defaults to GET TRACK_METHOD_LIST = ['GET', ] URL prefixes: will not track URLs that start with the specified prefixes SKIP_URL_PREFIX_LIST = ['/admin/', '/__debug__/'] static URLs: will not track the specified URLs SKIP_FIXED_URL_LIST = ['/', '/login/', '/logout/', ] """
[docs] def process_request(self, request): """ read user and url (path) from request, if valid and not in a skip list, add to recents """ # only track specified methods track_method_list = getattr(settings, 'TRACK_METHOD_LIST', ['GET']) if request.method not in track_method_list: return # do not track url if user is not authenticated if not request.user.is_authenticated: return if not getattr(request, 'user'): return # do not track if url (full path) can not be determined path = getattr(request, 'get_full_path')() if not path: return # do not track admin or debug urls skip_url_prefix_list = getattr(settings, 'SKIP_URL_PREFIX_LIST', ['/admin/', '/__debug__/']) for prefix in skip_url_prefix_list: if path.startswith(prefix): return # do not track urls in the skip_fixed_url_list skip_fixed_url_list = getattr(settings, 'SKIP_FIXED_URL_LIST', ['/', '/login/', '/logout/', '/userextensions/list_recents/', '/userextensions/user_login_redirect/']) for url in skip_fixed_url_list: if path == url: return # do not track invalid urls try: resolve(urlparse(path).path) except: return # add recent UserRecent.objects.update_or_create(url=request.get_full_path(), user=request.user, defaults=dict(url=request.get_full_path(), user=request.user, updated_at=timezone.now()) )