Provide implicit saves for XBlocks and XModules.
Update existing tests and provide new ones to test new paradigm.
This commit is contained in:
committed by
Sarina Canelake
parent
f0c9aa3916
commit
3f9431e8cf
@@ -89,6 +89,21 @@ def grade_histogram(module_id):
|
||||
return grades
|
||||
|
||||
|
||||
def save_module(get_html, module):
|
||||
"""
|
||||
Updates the given get_html function for the given module to save the fields
|
||||
after rendering.
|
||||
"""
|
||||
@wraps(get_html)
|
||||
def _get_html():
|
||||
"""Cache the rendered output, save, then return the output."""
|
||||
rendered_html = get_html()
|
||||
module.save()
|
||||
return rendered_html
|
||||
|
||||
return _get_html
|
||||
|
||||
|
||||
def add_histogram(get_html, module, user):
|
||||
"""
|
||||
Updates the supplied module with a new get_html function that wraps
|
||||
|
||||
@@ -108,8 +108,9 @@ class MongoKeyValueStore(KeyValueStore):
|
||||
def set_many(self, update_dict):
|
||||
"""set_many method. Implementations should accept an `update_dict` of
|
||||
key-value pairs, and set all the `keys` to the given `value`s."""
|
||||
# It appears that `set` simply updates an in-memory db, rather than calling down
|
||||
# to a real db; need to figure out if this is the case.
|
||||
# `set` simply updates an in-memory db, rather than calling down to a real db,
|
||||
# as mongo bulk save is handled elsewhere. A future improvement would be to pull
|
||||
# the mongo-specific bulk save logic into this method.
|
||||
for key, value in update_dict.iteritems():
|
||||
self.set(key, value)
|
||||
|
||||
@@ -647,6 +648,8 @@ class MongoModuleStore(ModuleStoreBase):
|
||||
|
||||
:param xmodule:
|
||||
"""
|
||||
# Save any changes to the xmodule to the MongoKeyValueStore
|
||||
xmodule.save()
|
||||
# split mongo's persist_dag is more general and useful.
|
||||
self.collection.save({
|
||||
'_id': xmodule.location.dict(),
|
||||
@@ -691,6 +694,8 @@ class MongoModuleStore(ModuleStoreBase):
|
||||
'url_slug': new_object.location.name
|
||||
})
|
||||
course.tabs = existing_tabs
|
||||
# Save any changes to the course to the MongoKeyValueStore
|
||||
course.save()
|
||||
self.update_metadata(course.location, course.xblock_kvs._metadata)
|
||||
|
||||
def fire_updated_modulestore_signal(self, course_id, location):
|
||||
@@ -797,6 +802,8 @@ class MongoModuleStore(ModuleStoreBase):
|
||||
tab['name'] = metadata.get('display_name')
|
||||
break
|
||||
course.tabs = existing_tabs
|
||||
# Save the updates to the course to the MongoKeyValueStore
|
||||
course.save()
|
||||
self.update_metadata(course.location, own_metadata(course))
|
||||
|
||||
self._update_single_item(location, {'metadata': metadata})
|
||||
@@ -819,6 +826,8 @@ class MongoModuleStore(ModuleStoreBase):
|
||||
course = self.get_course_for_item(item.location)
|
||||
existing_tabs = course.tabs or []
|
||||
course.tabs = [tab for tab in existing_tabs if tab.get('url_slug') != location.name]
|
||||
# Save the updates to the course to the MongoKeyValueStore
|
||||
course.save()
|
||||
self.update_metadata(course.location, own_metadata(course))
|
||||
|
||||
# Must include this to avoid the django debug toolbar (which defines the deprecated "safe=False")
|
||||
|
||||
@@ -165,34 +165,31 @@ class ModuleStoreTestCase(TestCase):
|
||||
# Call superclass implementation
|
||||
super(ModuleStoreTestCase, self)._post_teardown()
|
||||
|
||||
|
||||
def assert2XX(self, status_code, msg=None):
|
||||
"""
|
||||
Assert that the given value is a success status (between 200 and 299)
|
||||
"""
|
||||
if not 200 <= status_code < 300:
|
||||
msg = self._formatMessage(msg, "%s is not a success status" % safe_repr(status_code))
|
||||
raise self.failureExecption(msg)
|
||||
msg = self._formatMessage(msg, "%s is not a success status" % safe_repr(status_code))
|
||||
self.assertTrue(status_code >= 200 and status_code < 300, msg=msg)
|
||||
|
||||
def assert3XX(self, status_code, msg=None):
|
||||
"""
|
||||
Assert that the given value is a redirection status (between 300 and 399)
|
||||
"""
|
||||
if not 300 <= status_code < 400:
|
||||
msg = self._formatMessage(msg, "%s is not a redirection status" % safe_repr(status_code))
|
||||
raise self.failureExecption(msg)
|
||||
msg = self._formatMessage(msg, "%s is not a redirection status" % safe_repr(status_code))
|
||||
self.assertTrue(status_code >= 300 and status_code < 400, msg=msg)
|
||||
|
||||
def assert4XX(self, status_code, msg=None):
|
||||
"""
|
||||
Assert that the given value is a client error status (between 400 and 499)
|
||||
"""
|
||||
if not 400 <= status_code < 500:
|
||||
msg = self._formatMessage(msg, "%s is not a client error status" % safe_repr(status_code))
|
||||
raise self.failureExecption(msg)
|
||||
msg = self._formatMessage(msg, "%s is not a client error status" % safe_repr(status_code))
|
||||
self.assertTrue(status_code >= 400 and status_code < 500, msg=msg)
|
||||
|
||||
def assert5XX(self, status_code, msg=None):
|
||||
"""
|
||||
Assert that the given value is a server error status (between 500 and 599)
|
||||
"""
|
||||
if not 500 <= status_code < 600:
|
||||
msg = self._formatMessage(msg, "%s is not a server error status" % safe_repr(status_code))
|
||||
raise self.failureExecption(msg)
|
||||
msg = self._formatMessage(msg, "%s is not a server error status" % safe_repr(status_code))
|
||||
self.assertTrue(status_code >= 500 and status_code < 600, msg=msg)
|
||||
|
||||
@@ -53,9 +53,6 @@ class XModuleCourseFactory(Factory):
|
||||
for k, v in kwargs.iteritems():
|
||||
setattr(new_course, k, v)
|
||||
|
||||
# Save the data we've just created before we update mongo datastore
|
||||
new_course.save()
|
||||
|
||||
# Update the data in the mongo datastore
|
||||
store.save_xmodule(new_course)
|
||||
return new_course
|
||||
@@ -138,7 +135,6 @@ class XModuleItemFactory(Factory):
|
||||
# replace the display name with an optional parameter passed in from the caller
|
||||
if display_name is not None:
|
||||
metadata['display_name'] = display_name
|
||||
# note that location comes from above lazy_attribute
|
||||
store.create_and_save_xmodule(location, metadata=metadata, definition_data=data)
|
||||
|
||||
if location.category not in DETACHED_CATEGORIES:
|
||||
|
||||
@@ -194,6 +194,10 @@ class ImportSystem(XMLParsingSystem, MakoDescriptorSystem):
|
||||
if hasattr(descriptor, 'children'):
|
||||
for child in descriptor.get_children():
|
||||
parent_tracker.add_parent(child.location, descriptor.location)
|
||||
|
||||
# After setting up the descriptor, save any changes that we have
|
||||
# made to attributes on the descriptor to the underlying KeyValueStore.
|
||||
descriptor.save()
|
||||
return descriptor
|
||||
|
||||
render_template = lambda: ''
|
||||
|
||||
@@ -504,11 +504,13 @@ class OpenEndedModuleXmlTest(unittest.TestCase, DummyModulestore):
|
||||
See if we can load the module and save an answer
|
||||
@return:
|
||||
"""
|
||||
#Load the module
|
||||
# Load the module
|
||||
module = self.get_module_from_location(self.problem_location, COURSE)
|
||||
|
||||
#Try saving an answer
|
||||
# Try saving an answer
|
||||
module.handle_ajax("save_answer", {"student_answer": self.answer})
|
||||
# Save our modifications to the underlying KeyValueStore so they can be persisted
|
||||
module.save()
|
||||
task_one_json = json.loads(module.task_states[0])
|
||||
self.assertEqual(task_one_json['child_history'][0]['answer'], self.answer)
|
||||
|
||||
|
||||
@@ -217,8 +217,11 @@ class ConditionalModuleXmlTest(unittest.TestCase):
|
||||
html = ajax['html']
|
||||
self.assertFalse(any(['This is a secret' in item for item in html]))
|
||||
|
||||
# now change state of the capa problem to make it completed
|
||||
inner_get_module(Location('i4x://HarvardX/ER22x/problem/choiceprob')).attempts = 1
|
||||
# Now change state of the capa problem to make it completed
|
||||
inner_module = inner_get_module(Location('i4x://HarvardX/ER22x/problem/choiceprob'))
|
||||
inner_module.attempts = 1
|
||||
# Save our modifications to the underlying KeyValueStore so they can be persisted
|
||||
inner_module.save()
|
||||
|
||||
ajax = json.loads(module.handle_ajax('', ''))
|
||||
print "post-attempt ajax: ", ajax
|
||||
|
||||
Reference in New Issue
Block a user