From 43d41d6648e8f1230f46adb045e9f4c29ae9a101 Mon Sep 17 00:00:00 2001 From: Calen Pennington Date: Wed, 15 Apr 2015 16:07:06 -0400 Subject: [PATCH] Move `delete` logic down into per-scope caches --- lms/djangoapps/courseware/model_data.py | 51 +++++++++++++++++++------ 1 file changed, 40 insertions(+), 11 deletions(-) diff --git a/lms/djangoapps/courseware/model_data.py b/lms/djangoapps/courseware/model_data.py index c03ae4ac89..fc0700ea2d 100644 --- a/lms/djangoapps/courseware/model_data.py +++ b/lms/djangoapps/courseware/model_data.py @@ -203,6 +203,25 @@ class DjangoOrmFieldCache(object): def set(self, kvs_key, value): self._cache[self._cache_key_for_kvs_key(kvs_key)] = value + @contract(kvs_key=DjangoKeyValueStore.Key) + def delete(self, kvs_key): + """ + Delete the value specified by `kvs_key`. + + Arguments: + kvs_key (`DjangoKeyValueStore.Key`): The field value to delete + + Raises: KeyError if key isn't found in the cache + """ + + cache_key = self._cache_key_for_kvs_key(kvs_key) + field_object = self._cache.get(cache_key) + if field_object is None: + raise KeyError(kvs_key.field_name) + + field_object.delete() + del self._cache[cache_key] + def __len__(self): return len(self._cache) @@ -298,6 +317,26 @@ class UserStateCache(DjangoOrmFieldCache): """ return key.block_scope_id + @contract(kvs_key=DjangoKeyValueStore.Key) + def delete(self, kvs_key): + """ + Delete the value specified by `kvs_key`. + + Arguments: + kvs_key (`DjangoKeyValueStore.Key`): The field value to delete + + Raises: KeyError if key isn't found in the cache + """ + + field_object = self._cache.get(self._cache_key_for_kvs_key(kvs_key)) + if field_object is None: + raise KeyError(kvs_key.field_name) + + state = json.loads(field_object.state) + del state[kvs_key.field_name] + field_object.state = json.dumps(state) + field_object.save() + class UserStateSummaryCache(DjangoOrmFieldCache): """ @@ -664,17 +703,7 @@ class FieldDataCache(object): if key.scope not in self.cache: raise KeyError(key.field_name) - field_object = self.cache[key.scope].get(key) - if field_object is None: - raise KeyError(key.field_name) - - if key.scope == Scope.user_state: - state = json.loads(field_object.state) - del state[key.field_name] - field_object.state = json.dumps(state) - field_object.save() - else: - field_object.delete() + self.cache[key.scope].delete(key) @contract(key=DjangoKeyValueStore.Key, returns=bool) def has(self, key):