Commit 8247ace5 by Calen Pennington

Revert "Merge pull request #7258 from cpennington/lms-field-data-query-counts"

This reverts commit 4856ef78, reversing
changes made to 7abbbb44.
parent 4856ef78
...@@ -266,7 +266,7 @@ class FieldDataCache(object): ...@@ -266,7 +266,7 @@ class FieldDataCache(object):
def find_or_create(self, key): def find_or_create(self, key):
''' '''
Find a model data object in this cache, or create a new one if it doesn't Find a model data object in this cache, or create it if it doesn't
exist exist
''' '''
field_object = self.find(key) field_object = self.find(key)
...@@ -275,26 +275,28 @@ class FieldDataCache(object): ...@@ -275,26 +275,28 @@ class FieldDataCache(object):
return field_object return field_object
if key.scope == Scope.user_state: if key.scope == Scope.user_state:
field_object = StudentModule( field_object, __ = StudentModule.objects.get_or_create(
course_id=self.course_id, course_id=self.course_id,
student_id=key.user_id, student_id=key.user_id,
module_state_key=key.block_scope_id, module_state_key=key.block_scope_id,
state=json.dumps({}), defaults={
module_type=key.block_scope_id.block_type, 'state': json.dumps({}),
'module_type': key.block_scope_id.block_type,
},
) )
elif key.scope == Scope.user_state_summary: elif key.scope == Scope.user_state_summary:
field_object = XModuleUserStateSummaryField( field_object, __ = XModuleUserStateSummaryField.objects.get_or_create(
field_name=key.field_name, field_name=key.field_name,
usage_id=key.block_scope_id usage_id=key.block_scope_id
) )
elif key.scope == Scope.preferences: elif key.scope == Scope.preferences:
field_object = XModuleStudentPrefsField( field_object, __ = XModuleStudentPrefsField.objects.get_or_create(
field_name=key.field_name, field_name=key.field_name,
module_type=BlockTypeKeyV1(key.block_family, key.block_scope_id), module_type=BlockTypeKeyV1(key.block_family, key.block_scope_id),
student_id=key.user_id, student_id=key.user_id,
) )
elif key.scope == Scope.user_info: elif key.scope == Scope.user_info:
field_object = XModuleStudentInfoField( field_object, __ = XModuleStudentInfoField.objects.get_or_create(
field_name=key.field_name, field_name=key.field_name,
student_id=key.user_id, student_id=key.user_id,
) )
...@@ -360,39 +362,39 @@ class DjangoKeyValueStore(KeyValueStore): ...@@ -360,39 +362,39 @@ class DjangoKeyValueStore(KeyValueStore):
""" """
saved_fields = [] saved_fields = []
# field_objects maps id(field_object) to a the object and a list of associated fields. # field_objects maps a field_object to a list of associated fields
# We use id() because FieldDataCache might return django models with no primary key field_objects = dict()
# set, but will return the same django model each time the same key is passed in. for field in kv_dict:
dirty_field_objects = defaultdict(lambda: (None, [])) # Check field for validity
for key in kv_dict: if field.scope not in self._allowed_scopes:
# Check key for validity raise InvalidScopeError(field)
if key.scope not in self._allowed_scopes:
raise InvalidScopeError(key) # If the field is valid and isn't already in the dictionary, add it.
field_object = self._field_data_cache.find_or_create(field)
field_object = self._field_data_cache.find_or_create(key) if field_object not in field_objects.keys():
# Update the list dirtied field_objects field_objects[field_object] = []
_, dirty_names = dirty_field_objects.setdefault(id(field_object), (field_object, [])) # Update the list of associated fields
dirty_names.append(key.field_name) field_objects[field_object].append(field)
# Special case when scope is for the user state, because this scope saves fields in a single row # Special case when scope is for the user state, because this scope saves fields in a single row
if key.scope == Scope.user_state: if field.scope == Scope.user_state:
state = json.loads(field_object.state) state = json.loads(field_object.state)
state[key.field_name] = kv_dict[key] state[field.field_name] = kv_dict[field]
field_object.state = json.dumps(state) field_object.state = json.dumps(state)
else: else:
# The remaining scopes save fields on different rows, so # The remaining scopes save fields on different rows, so
# we don't have to worry about conflicts # we don't have to worry about conflicts
field_object.value = json.dumps(kv_dict[key]) field_object.value = json.dumps(kv_dict[field])
for field_object, names in dirty_field_objects.values(): for field_object in field_objects:
try: try:
# Save the field object that we made above # Save the field object that we made above
field_object.save(force_update=field_object.pk is not None) field_object.save()
# If save is successful on this scope, add the saved fields to # If save is successful on this scope, add the saved fields to
# the list of successful saves # the list of successful saves
saved_fields.extend(names) saved_fields.extend([field.field_name for field in field_objects[field_object]])
except DatabaseError: except DatabaseError:
log.exception('Error saving fields %r', names) log.exception('Error saving fields %r', field_objects[field_object])
raise KeyValueMultiSaveError(saved_fields) raise KeyValueMultiSaveError(saved_fields)
def delete(self, key): def delete(self, key):
...@@ -407,7 +409,7 @@ class DjangoKeyValueStore(KeyValueStore): ...@@ -407,7 +409,7 @@ class DjangoKeyValueStore(KeyValueStore):
state = json.loads(field_object.state) state = json.loads(field_object.state)
del state[key.field_name] del state[key.field_name]
field_object.state = json.dumps(state) field_object.state = json.dumps(state)
field_object.save(force_update=field_object.pk is not None) field_object.save()
else: else:
field_object.delete() field_object.delete()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment