Files
edx-platform/lms/djangoapps/courseware/context_processor.py
dyudyunov 2716810f48 fix: course discovery dates localization after user logout
Preconditions:
- course discovery enabled

STR:
- log in
- choose any language with different date format (e.g. ukrainian)
- check date format changed on the /courses page
- logout and go to /courses again

AR:
- date format is english on /courses, but stays the same as for logged in
user on the main page

ER:
- date format stays the same as for logged in user
2022-02-08 10:07:35 +02:00

92 lines
3.3 KiB
Python

"""
This is the courseware context_processor module.
This is meant to simplify the process of sending user preferences (espec. time_zone and pref-lang)
to the templates without having to append every view file.
"""
from django.utils.translation import get_language
from pytz import timezone
from edx_django_utils.cache import TieredCache
from lms.djangoapps.courseware.models import LastSeenCoursewareTimezone
from openedx.core.djangoapps.site_configuration.helpers import get_value
from openedx.core.djangoapps.user_api.errors import UserAPIInternalError, UserNotFound
from openedx.core.djangoapps.user_api.preferences.api import get_user_preference, get_user_preferences
from openedx.core.lib.cache_utils import get_cache
RETRIEVABLE_PREFERENCES = {
'user_timezone': 'time_zone',
'user_language': 'pref-lang'
}
CACHE_NAME = "context_processor.user_timezone_preferences"
def user_timezone_locale_prefs(request):
"""
Checks if request has an authenticated user.
If so, sends set (or none if unset) time_zone and language prefs.
If site-wide language is set, that language is used over the language set
in user preferences.
This interacts with the DateUtils to either display preferred or attempt to determine
system/browser set time_zones and languages
"""
cached_value = get_cache(CACHE_NAME)
if not cached_value:
user_prefs = {
'user_timezone': None,
'user_language': get_language(),
}
if hasattr(request, 'user') and request.user.is_authenticated:
try:
user_preferences = get_user_preferences(request.user)
except (UserNotFound, UserAPIInternalError):
cached_value.update(user_prefs)
else:
user_prefs = {
key: user_preferences.get(pref_name, None)
for key, pref_name in RETRIEVABLE_PREFERENCES.items()
}
site_wide_language = get_value('LANGUAGE_CODE', None)
if site_wide_language:
user_prefs['user_language'] = site_wide_language
cached_value.update(user_prefs)
return cached_value
def get_last_seen_courseware_timezone(user):
"""
The above method is for the timezone that is set on the user's account.
That timezone is often not set, so this field retrieves the browser timezone
from a recent courseware visit (updated daily)
"""
cache_key = 'browser_timezone_{}'.format(str(user.id))
cached_value = TieredCache.get_cached_response(cache_key)
if not cached_value.is_found:
try:
LastSeenCoursewareTimezone.objects.get(user=user)
except LastSeenCoursewareTimezone.DoesNotExist:
return None
else:
return cached_value.value
def get_user_timezone_or_last_seen_timezone_or_utc(user):
"""
Helper method for returning a reasonable timezone for a user.
This method returns the timezone in the user's account if that is set.
If that is not set, it returns a recent timezone that we have recorded from a user's visit to the courseware.
If that is not set, it returns UTC.
"""
user_timezone = (
get_user_preference(user, 'time_zone') or
get_last_seen_courseware_timezone(user) or
'UTC'
)
return timezone(user_timezone)