diff --git a/openedx/core/djangoapps/courseware_api/views.py b/openedx/core/djangoapps/courseware_api/views.py index 576f0472b770..6fa23965e8a1 100644 --- a/openedx/core/djangoapps/courseware_api/views.py +++ b/openedx/core/djangoapps/courseware_api/views.py @@ -4,7 +4,7 @@ from completion.exceptions import UnavailableCompletionData from completion.utilities import get_key_to_last_completed_block from django.conf import settings -from django.db import transaction +from django.db import transaction, IntegrityError from django.utils.decorators import method_decorator from django.utils.functional import cached_property from edx_django_utils.cache import TieredCache @@ -498,12 +498,20 @@ def set_last_seen_courseware_timezone(self, user): browser_timezone = self.request.query_params.get('browser_timezone', None) cached_value = TieredCache.get_cached_response(cache_key) if not cached_value.is_found: - if browser_timezone: - TieredCache.set_all_tiers(cache_key, str(browser_timezone), 86400) # Refresh the cache daily + return + + if browser_timezone: + TieredCache.set_all_tiers(cache_key, str(browser_timezone), 86400) # Refresh the cache daily + try: LastSeenCoursewareTimezone.objects.update_or_create( user=user, defaults={'last_seen_courseware_timezone': browser_timezone}, ) + except IntegrityError: + # Race condition: record already exists, just update it + obj = LastSeenCoursewareTimezone.objects.get(user=user) + obj.last_seen_courseware_timezone = browser_timezone + obj.save() def get_object(self): """