Files
WYGIWYH/app/apps/common/middleware/localization.py
Herculino Trotta ff302e8377 test
2024-10-13 15:33:47 -03:00

55 lines
1.9 KiB
Python

import zoneinfo
from django.utils import timezone, translation
from django.utils.cache import patch_vary_headers
from django.utils.translation import activate
from cachalot.api import invalidate
class LocalizationMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
tz = request.COOKIES.get("mytz")
if request.user.is_authenticated:
user_settings = request.user.settings
user_language = user_settings.language
user_timezone = user_settings.timezone
else:
user_language = "auto"
user_timezone = "auto"
# Set timezone
if tz and user_timezone == "auto":
timezone_to_activate = zoneinfo.ZoneInfo(tz)
elif user_timezone != "auto":
timezone_to_activate = zoneinfo.ZoneInfo(user_timezone)
else:
timezone_to_activate = zoneinfo.ZoneInfo("UTC")
# Set language
if user_language and user_language != "auto":
language_to_activate = user_language
else:
language_to_activate = translation.get_language_from_request(request)
# Check if timezone or language has changed
if (
getattr(request, "timezone", None) != timezone_to_activate
or getattr(request, "language", None) != language_to_activate
):
# Invalidate cachalot cache
invalidate()
# Apply timezone and language to the request
request.timezone = timezone_to_activate
request.language = language_to_activate
# Wrap the response in a custom function to handle activation
def wrapped_response(request):
with timezone.override(request.timezone):
with translation.override(request.language):
return self.get_response(request)
return wrapped_response(request)