aircox-radiocampus/aircox/middleware.py
Chris Tactic 55123c386d #132 | #121: backoffice / dev-1.0-121 (#131)
cfr #121

Co-authored-by: Christophe Siraut <d@tobald.eu.org>
Co-authored-by: bkfox <thomas bkfox net>
Co-authored-by: Thomas Kairos <thomas@bkfox.net>
Reviewed-on: rc/aircox#131
Co-authored-by: Chris Tactic <ctactic@noreply.git.radiocampus.be>
Co-committed-by: Chris Tactic <ctactic@noreply.git.radiocampus.be>
2024-04-28 22:02:09 +02:00

59 lines
1.7 KiB
Python

from zoneinfo import ZoneInfo
from django.db.models import Q
from django.utils import timezone as tz
from .models import Station
from .utils import Redirect
__all__ = ("AircoxMiddleware",)
class AircoxMiddleware(object):
"""Middleware used to get default info for the given website.
It provide following request attributes:
- ``mobile``: set to True if mobile device is detected
- ``station``: current Station
This middleware must be set after the middleware
'django.contrib.auth.middleware.AuthenticationMiddleware',
"""
timezone_session_key = "aircox.timezone"
def __init__(self, get_response):
self.get_response = get_response
def is_mobile(self, request):
if agent := request.META.get("HTTP_USER_AGENT"):
return " Mobi" in agent
return False
def get_station(self, request):
"""Return station for the provided request."""
host = request.get_host()
expr = Q(default=True) | Q(hosts=host) | Q(hosts__contains=host + "\n")
return Station.objects.filter(expr).order_by("default").first()
def init_timezone(self, request):
# note: later we can use http://freegeoip.net/ on user side if
# required
timezone = None
try:
timezone = request.session.get(self.timezone_session_key)
if timezone:
timezone = ZoneInfo(timezone)
tz.activate(timezone)
except Exception:
pass
def __call__(self, request):
self.init_timezone(request)
request.station = self.get_station(request)
request.is_mobile = self.is_mobile(request)
try:
return self.get_response(request)
except Redirect:
return