diff --git a/lms/djangoapps/courseware/model_data.py b/lms/djangoapps/courseware/model_data.py index 109550c2ce..80df3db3ea 100644 --- a/lms/djangoapps/courseware/model_data.py +++ b/lms/djangoapps/courseware/model_data.py @@ -282,6 +282,23 @@ class DjangoOrmFieldCache(object): """ return self._cache_key_for_kvs_key(kvs_key) in self._cache + @contract(kvs_key=DjangoKeyValueStore.Key, returns="datetime|None") + def last_modified(self, kvs_key): + """ + Return when the supplied field was changed. + + Arguments: + kvs_key (`DjangoKeyValueStore.Key`): The field value to delete + + Returns: datetime if there was a modified date, or None otherwise + """ + field_object = self._cache.get(self._cache_key_for_kvs_key(kvs_key)) + + if field_object is None: + return None + else: + return field_object.modified + @contract(kvs_key=DjangoKeyValueStore.Key) def _set_field_value(self, field_object, kvs_key, value): field_object.value = json.dumps(value) @@ -933,3 +950,23 @@ class FieldDataCache(object): assert user_id == self.user.id assert usage_key.course_key == self.course_id self.cache[Scope.user_state].set_score(user_id, usage_key, score, max_score) + + @contract(key=DjangoKeyValueStore.Key, returns="datetime|None") + def last_modified(self, key): + """ + Return when the supplied field was changed. + + Arguments: + key (`DjangoKeyValueStore.Key`): The field value to delete + + Returns: datetime if there was a modified date, or None otherwise + """ + if key.scope.user == UserScope.ONE and not self.user.is_anonymous(): + # If we're getting user data, we expect that the key matches the + # user we were constructed for. + assert key.user_id == self.user.id + + if key.scope not in self.cache: + return None + + return self.cache[key.scope].last_modified(key) diff --git a/lms/djangoapps/mobile_api/users/views.py b/lms/djangoapps/mobile_api/users/views.py index fa1e6c68ee..2f90d96de1 100644 --- a/lms/djangoapps/mobile_api/users/views.py +++ b/lms/djangoapps/mobile_api/users/views.py @@ -149,12 +149,10 @@ class UserCourseStatus(views.APIView): block_scope_id=course.location, field_name=None ) - student_module = field_data_cache.find(key) - if student_module: - original_store_date = student_module.modified - if modification_date < original_store_date: - # old modification date so skip update - return self._get_course_info(request, course) + original_store_date = field_data_cache.last_modified(key) + if original_store_date is not None and modification_date < original_store_date: + # old modification date so skip update + return self._get_course_info(request, course) save_positions_recursively_up(request.user, request, field_data_cache, module) return self._get_course_info(request, course)