mybuddy/babybuddy/middleware.py

156 lines
5.2 KiB
Python
Raw Normal View History

from os import getenv
from time import time
import pytz
from django.conf import settings
from django.utils import timezone, translation
from django.conf.locale.en import formats as formats_en_us
from django.conf.locale.en_GB import formats as formats_en_gb
from django.contrib.auth.middleware import RemoteUserMiddleware
def update_en_us_date_formats():
"""
Update the datetime formats for the en-US locale. This is handled here and
not using `FORMAT_MODULE_PATH` because the processing of format modules
does not allow us to distinguish appropriately between en-US and en-GB
based on user settings.
"""
if settings.USE_24_HOUR_TIME_FORMAT:
2022-02-10 00:00:30 +00:00
formats_en_us.DATETIME_FORMAT = "N j, Y, H:i:s"
custom_input_formats = [
2022-02-10 00:00:30 +00:00
"%m/%d/%Y %H:%M:%S", # '10/25/2006 14:30:59'
"%m/%d/%Y %H:%M", # '10/25/2006 14:30'
]
2022-02-10 00:00:30 +00:00
formats_en_us.SHORT_DATETIME_FORMAT = "m/d/Y G:i:s"
formats_en_us.TIME_FORMAT = "H:i:s"
else:
# These formats are added to support the locale style of Baby Buddy's
# frontend library, which uses momentjs.
custom_input_formats = [
2022-02-10 00:00:30 +00:00
"%m/%d/%Y %I:%M:%S %p", # '10/25/2006 2:30:59 PM'
"%m/%d/%Y %I:%M %p", # '10/25/2006 2:30 PM'
]
# Add custom "short" version of `MONTH_DAY_FORMAT`.
2022-02-10 00:00:30 +00:00
formats_en_us.SHORT_MONTH_DAY_FORMAT = "M j"
# Append all other input formats from the base locale.
2022-02-10 00:00:30 +00:00
formats_en_us.DATETIME_INPUT_FORMATS = (
custom_input_formats + formats_en_us.DATETIME_INPUT_FORMATS
2022-02-10 00:00:30 +00:00
)
def update_en_gb_date_formats():
if settings.USE_24_HOUR_TIME_FORMAT:
2021-11-15 17:24:08 +00:00
# 25 October 2006 14:30:00
2022-02-10 00:00:30 +00:00
formats_en_gb.DATETIME_FORMAT = "j F Y H:i:s"
custom_input_formats = [
2022-02-10 00:00:30 +00:00
"%d/%m/%Y %H:%M:%S", # '25/10/2006 14:30:59'
"%d/%m/%Y %H:%M", # '25/10/2006 14:30'
]
2022-02-10 00:00:30 +00:00
formats_en_gb.SHORT_DATETIME_FORMAT = "d/m/Y H:i"
formats_en_gb.TIME_FORMAT = "H:i"
else:
2022-02-10 00:00:30 +00:00
formats_en_gb.DATETIME_FORMAT = "j F Y f a" # 25 October 2006 2:30 p.m
# These formats are added to support the locale style of Baby Buddy's
# frontend library, which uses momentjs.
custom_input_formats = [
2022-02-10 00:00:30 +00:00
"%d/%m/%Y %I:%M:%S %p", # '25/10/2006 2:30:59 PM'
"%d/%m/%Y %I:%M %p", # '25/10/2006 2:30 PM'
]
# Append all other input formats from the base locale.
2022-02-10 00:00:30 +00:00
formats_en_gb.DATETIME_INPUT_FORMATS = (
custom_input_formats + formats_en_gb.DATETIME_INPUT_FORMATS
2022-02-10 00:00:30 +00:00
)
class UserLanguageMiddleware:
"""
Customizes settings based on user language setting.
"""
2022-02-10 00:00:30 +00:00
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
user = request.user
2022-02-10 00:00:30 +00:00
if hasattr(user, "settings") and user.settings.language:
language = user.settings.language
elif request.LANGUAGE_CODE:
language = request.LANGUAGE_CODE
else:
language = settings.LANGUAGE_CODE
if language:
2022-02-10 00:00:30 +00:00
if language == "en-US":
update_en_us_date_formats()
2022-02-10 00:00:30 +00:00
elif language == "en-GB":
update_en_gb_date_formats()
# Set the language before generating the response.
translation.activate(language)
response = self.get_response(request)
# Deactivate the translation before the response is sent so it not
# reused in other threads.
translation.deactivate()
return response
class UserTimezoneMiddleware:
"""
Sets the timezone based on a user specific setting that falls back on
`settings.TIME_ZONE`. This middleware must run after
`django.contrib.auth.middleware.AuthenticationMiddleware` because it uses
the request.user object.
"""
2022-02-10 00:00:30 +00:00
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
2021-10-17 21:45:53 +00:00
user = request.user
2022-02-10 00:00:30 +00:00
if hasattr(user, "settings") and user.settings.timezone:
try:
2021-10-17 21:45:53 +00:00
timezone.activate(pytz.timezone(user.settings.timezone))
except pytz.UnknownTimeZoneError:
pass
return self.get_response(request)
2020-05-17 10:11:08 +00:00
class RollingSessionMiddleware:
"""
Periodically resets the session expiry for existing sessions.
"""
2022-02-10 00:00:30 +00:00
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
if request.session.keys():
2022-02-10 00:00:30 +00:00
session_refresh = request.session.get("session_refresh")
if session_refresh:
try:
delta = int(time()) - session_refresh
except (ValueError, TypeError):
delta = settings.ROLLING_SESSION_REFRESH + 1
if delta > settings.ROLLING_SESSION_REFRESH:
request.session["session_refresh"] = int(time())
request.session.set_expiry(settings.SESSION_COOKIE_AGE)
else:
request.session["session_refresh"] = int(time())
return self.get_response(request)
class CustomRemoteUser(RemoteUserMiddleware):
"""
Middleware used for remote authentication when `REVERSE_PROXY_AUTH` is True.
"""
header = getenv("PROXY_HEADER", "HTTP_REMOTE_USER")