From 9338b6a4804c3ffbe51bfcdd362d2355ab27e6eb Mon Sep 17 00:00:00 2001 From: Calen Pennington Date: Wed, 15 Apr 2015 13:50:16 -0400 Subject: [PATCH] Push `delete` down into FieldDataCache from DjangoKeyValueStore --- lms/djangoapps/courseware/model_data.py | 34 +++++++++++++++++-------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/lms/djangoapps/courseware/model_data.py b/lms/djangoapps/courseware/model_data.py index 79d6dceb62..128f031bac 100644 --- a/lms/djangoapps/courseware/model_data.py +++ b/lms/djangoapps/courseware/model_data.py @@ -159,17 +159,7 @@ class DjangoKeyValueStore(KeyValueStore): if key.scope not in self._allowed_scopes: raise InvalidScopeError(key) - field_object = self._field_data_cache.find(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._field_data_cache.delete(key) def has(self, key): if key.scope not in self._allowed_scopes: @@ -651,6 +641,28 @@ class FieldDataCache(object): log.exception('Error saving fields %r', field_objects[field_object]) raise KeyValueMultiSaveError(saved_fields) + @contract(key=DjangoKeyValueStore.Key) + def delete(self, key): + """ + Delete the value specified by `key`. + + Arguments: + key (`DjangoKeyValueStore.Key`): The field value to delete + + Raises: KeyError if key isn't found in the cache + """ + field_object = self.find(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() + def find(self, key): ''' Look for a model data object using an DjangoKeyValueStore.Key object