Commit ca0dd839 by Don Mitchell

Mixed no longer translates

parent 432249e9
...@@ -17,6 +17,7 @@ from .utils import CourseTestCase ...@@ -17,6 +17,7 @@ from .utils import CourseTestCase
import contentstore.git_export_utils as git_export_utils import contentstore.git_export_utils as git_export_utils
from xmodule.contentstore.django import _CONTENTSTORE from xmodule.contentstore.django import _CONTENTSTORE
from xmodule.modulestore.django import modulestore from xmodule.modulestore.django import modulestore
from contentstore.utils import get_modulestore
TEST_DATA_CONTENTSTORE = copy.deepcopy(settings.CONTENTSTORE) TEST_DATA_CONTENTSTORE = copy.deepcopy(settings.CONTENTSTORE)
TEST_DATA_CONTENTSTORE['DOC_STORE_CONFIG']['db'] = 'test_xcontent_%s' % uuid4().hex TEST_DATA_CONTENTSTORE['DOC_STORE_CONFIG']['db'] = 'test_xcontent_%s' % uuid4().hex
...@@ -70,7 +71,7 @@ class TestExportGit(CourseTestCase): ...@@ -70,7 +71,7 @@ class TestExportGit(CourseTestCase):
Test failed course export response. Test failed course export response.
""" """
self.course_module.giturl = 'foobar' self.course_module.giturl = 'foobar'
modulestore().save_xmodule(self.course_module) get_modulestore(self.course_module.location).update_item(self.course_module)
response = self.client.get('{}?action=push'.format(self.test_url)) response = self.client.get('{}?action=push'.format(self.test_url))
self.assertIn('Export Failed:', response.content) self.assertIn('Export Failed:', response.content)
...@@ -93,7 +94,7 @@ class TestExportGit(CourseTestCase): ...@@ -93,7 +94,7 @@ class TestExportGit(CourseTestCase):
self.populateCourse() self.populateCourse()
self.course_module.giturl = 'file://{}'.format(bare_repo_dir) self.course_module.giturl = 'file://{}'.format(bare_repo_dir)
modulestore().save_xmodule(self.course_module) get_modulestore(self.course_module.location).update_item(self.course_module)
response = self.client.get('{}?action=push'.format(self.test_url)) response = self.client.get('{}?action=push'.format(self.test_url))
self.assertIn('Export Succeeded', response.content) self.assertIn('Export Succeeded', response.content)
...@@ -202,7 +202,12 @@ def xblock_view_handler(request, package_id, view_name, tag=None, branch=None, v ...@@ -202,7 +202,12 @@ def xblock_view_handler(request, package_id, view_name, tag=None, branch=None, v
log.debug("unable to render studio_view for %r", component, exc_info=True) log.debug("unable to render studio_view for %r", component, exc_info=True)
fragment = Fragment(render_to_string('html_error.html', {'message': str(exc)})) fragment = Fragment(render_to_string('html_error.html', {'message': str(exc)}))
store.save_xmodule(component) # change not authored by requestor but by xblocks. should not convert to draft if not
# already draft
if getattr(component, 'is_draft', False):
modulestore('draft').update_item(component, None)
else:
modulestore('direct').update_item(component, None)
elif view_name == 'student_view' and component.has_children: elif view_name == 'student_view' and component.has_children:
# For non-leaf xblocks on the unit page, show the special rendering # For non-leaf xblocks on the unit page, show the special rendering
# which links to the new container page. # which links to the new container page.
......
...@@ -16,7 +16,7 @@ os.environ['SERVICE_VARIANT'] = 'bok_choy' ...@@ -16,7 +16,7 @@ os.environ['SERVICE_VARIANT'] = 'bok_choy'
os.environ['CONFIG_ROOT'] = path(__file__).abspath().dirname() #pylint: disable=E1120 os.environ['CONFIG_ROOT'] = path(__file__).abspath().dirname() #pylint: disable=E1120
from .aws import * # pylint: disable=W0401, W0614 from .aws import * # pylint: disable=W0401, W0614
from xmodule.x_module import prefer_xmodules from xmodule.modulestore import prefer_xmodules
######################### Testing overrides #################################### ######################### Testing overrides ####################################
......
...@@ -479,7 +479,9 @@ class ModuleStoreReadBase(ModuleStoreRead): ...@@ -479,7 +479,9 @@ class ModuleStoreReadBase(ModuleStoreRead):
metadata_inheritance_cache_subsystem=None, request_cache=None, metadata_inheritance_cache_subsystem=None, request_cache=None,
modulestore_update_signal=None, xblock_mixins=(), xblock_select=None, modulestore_update_signal=None, xblock_mixins=(), xblock_select=None,
# temporary parms to enable backward compatibility. remove once all envs migrated # temporary parms to enable backward compatibility. remove once all envs migrated
db=None, collection=None, host=None, port=None, tz_aware=True, user=None, password=None db=None, collection=None, host=None, port=None, tz_aware=True, user=None, password=None,
# allow lower level init args to pass harmlessly
** kwargs
): ):
''' '''
Set up the error-tracking logic. Set up the error-tracking logic.
......
...@@ -51,6 +51,12 @@ class Locator(object): ...@@ -51,6 +51,12 @@ class Locator(object):
def __eq__(self, other): def __eq__(self, other):
return self.__dict__ == other.__dict__ return self.__dict__ == other.__dict__
def __hash__(self):
"""
Hash on contents.
"""
return hash(unicode(self))
def __repr__(self): def __repr__(self):
''' '''
repr(self) returns something like this: CourseLocator("mit.eecs.6002x") repr(self) returns something like this: CourseLocator("mit.eecs.6002x")
...@@ -198,16 +204,16 @@ class CourseLocator(Locator): ...@@ -198,16 +204,16 @@ class CourseLocator(Locator):
""" """
Return a string representing this location. Return a string representing this location.
""" """
result = u""
if self.package_id: if self.package_id:
result = unicode(self.package_id) result += unicode(self.package_id)
if self.branch: if self.branch:
result += '/' + BRANCH_PREFIX + self.branch result += '/' + BRANCH_PREFIX + self.branch
if self.version_guid:
if self.package_id:
result += u"/"
result += u"{prefix}{guid}".format(prefix=VERSION_PREFIX, guid=self.version_guid)
return result return result
elif self.version_guid:
return u"{prefix}{guid}".format(prefix=VERSION_PREFIX, guid=self.version_guid)
else:
# raise InsufficientSpecificationError("missing package_id or version_guid")
return '<InsufficientSpecificationError: missing package_id or version_guid>'
def url(self): def url(self):
""" """
...@@ -432,23 +438,30 @@ class BlockUsageLocator(CourseLocator): ...@@ -432,23 +438,30 @@ class BlockUsageLocator(CourseLocator):
def version_agnostic(self): def version_agnostic(self):
""" """
Returns a copy of itself.
If both version_guid and package_id are known, use a blank package_id in the copy.
We don't care if the locator's version is not the current head; so, avoid version conflict We don't care if the locator's version is not the current head; so, avoid version conflict
by reducing info. by reducing info.
Returns a copy of itself without any version info.
:raises: ValueError if the block locator has no package_id
:param block_locator: :param block_locator:
""" """
if self.version_guid:
return BlockUsageLocator(version_guid=self.version_guid,
branch=self.branch,
block_id=self.block_id)
else:
return BlockUsageLocator(package_id=self.package_id, return BlockUsageLocator(package_id=self.package_id,
branch=self.branch, branch=self.branch,
block_id=self.block_id) block_id=self.block_id)
def course_agnostic(self):
"""
We only care about the locator's version not its course.
Returns a copy of itself without any course info.
:raises: ValueError if the block locator has no version_guid
:param block_locator:
"""
return BlockUsageLocator(version_guid=self.version_guid,
block_id=self.block_id)
def set_block_id(self, new): def set_block_id(self, new):
""" """
Initialize block_id to new value. Initialize block_id to new value.
......
...@@ -633,8 +633,7 @@ class MongoModuleStore(ModuleStoreWriteBase): ...@@ -633,8 +633,7 @@ class MongoModuleStore(ModuleStoreWriteBase):
raise ValueError(u"Course roots must be of category 'course': {}".format(unicode(location))) raise ValueError(u"Course roots must be of category 'course': {}".format(unicode(location)))
return self.create_and_save_xmodule(location, definition_data, metadata, runtime) return self.create_and_save_xmodule(location, definition_data, metadata, runtime)
def create_xmodule(self, location, definition_data=None, metadata=None, system=None, def create_xmodule(self, location, definition_data=None, metadata=None, system=None, fields={}):
fields={}):
""" """
Create the new xmodule but don't save it. Returns the new module. Create the new xmodule but don't save it. Returns the new module.
......
...@@ -92,7 +92,7 @@ class DraftModuleStore(MongoModuleStore): ...@@ -92,7 +92,7 @@ class DraftModuleStore(MongoModuleStore):
except ItemNotFoundError: except ItemNotFoundError:
return wrap_draft(super(DraftModuleStore, self).get_instance(course_id, location, depth=depth)) return wrap_draft(super(DraftModuleStore, self).get_instance(course_id, location, depth=depth))
def create_xmodule(self, location, definition_data=None, metadata=None, system=None): def create_xmodule(self, location, definition_data=None, metadata=None, system=None, fields={}):
""" """
Create the new xmodule but don't save it. Returns the new module with a draft locator Create the new xmodule but don't save it. Returns the new module with a draft locator
...@@ -104,7 +104,7 @@ class DraftModuleStore(MongoModuleStore): ...@@ -104,7 +104,7 @@ class DraftModuleStore(MongoModuleStore):
draft_loc = as_draft(location) draft_loc = as_draft(location)
if draft_loc.category in DIRECT_ONLY_CATEGORIES: if draft_loc.category in DIRECT_ONLY_CATEGORIES:
raise InvalidVersionError(location) raise InvalidVersionError(location)
return super(DraftModuleStore, self).create_xmodule(draft_loc, definition_data, metadata, system) return super(DraftModuleStore, self).create_xmodule(draft_loc, definition_data, metadata, system, fields)
def get_items(self, location, course_id=None, depth=0, qualifiers=None): def get_items(self, location, course_id=None, depth=0, qualifiers=None):
""" """
......
...@@ -556,8 +556,8 @@ class SplitMongoModuleStore(ModuleStoreWriteBase): ...@@ -556,8 +556,8 @@ class SplitMongoModuleStore(ModuleStoreWriteBase):
The block's history tracks its explicit changes but not the changes in its children. The block's history tracks its explicit changes but not the changes in its children.
''' '''
# version_agnostic means we don't care if the head and version don't align, trust the version # course_agnostic means we don't care if the head and version don't align, trust the version
course_struct = self._lookup_course(block_locator.version_agnostic())['structure'] course_struct = self._lookup_course(block_locator.course_agnostic())['structure']
block_id = block_locator.block_id block_id = block_locator.block_id
update_version_field = 'blocks.{}.edit_info.update_version'.format(block_id) update_version_field = 'blocks.{}.edit_info.update_version'.format(block_id)
all_versions_with_block = self.db_connection.find_matching_structures({'original_version': course_struct['original_version'], all_versions_with_block = self.db_connection.find_matching_structures({'original_version': course_struct['original_version'],
......
...@@ -33,7 +33,6 @@ def mixed_store_config(data_dir, mappings): ...@@ -33,7 +33,6 @@ def mixed_store_config(data_dir, mappings):
'ENGINE': 'xmodule.modulestore.mixed.MixedModuleStore', 'ENGINE': 'xmodule.modulestore.mixed.MixedModuleStore',
'OPTIONS': { 'OPTIONS': {
'mappings': mappings, 'mappings': mappings,
'reference_type': 'xmodule.modulestore.Location',
'stores': { 'stores': {
'default': mongo_config['default'], 'default': mongo_config['default'],
'xml': xml_config['default'] 'xml': xml_config['default']
...@@ -219,14 +218,17 @@ class ModuleStoreTestCase(TestCase): ...@@ -219,14 +218,17 @@ class ModuleStoreTestCase(TestCase):
# even if we're using a mixed modulestore # even if we're using a mixed modulestore
store = editable_modulestore() store = editable_modulestore()
if hasattr(store, 'collection'): if hasattr(store, 'collection'):
connection = store.collection.database.connection
store.collection.drop() store.collection.drop()
store.db.connection.close() connection.close()
elif hasattr(store, 'close_all_connections'): elif hasattr(store, 'close_all_connections'):
store.close_all_connections() store.close_all_connections()
if contentstore().fs_files: if contentstore().fs_files:
db = contentstore().fs_files.database db = contentstore().fs_files.database
db.connection.drop_database(db) db.connection.drop_database(db)
db.connection.close() db.connection.close()
location_mapper = loc_mapper() location_mapper = loc_mapper()
if location_mapper.db: if location_mapper.db:
location_mapper.location_map.drop() location_mapper.location_map.drop()
......
...@@ -200,13 +200,14 @@ class LocatorTest(TestCase): ...@@ -200,13 +200,14 @@ class LocatorTest(TestCase):
expected_id = 'mit.eecs.6002x' expected_id = 'mit.eecs.6002x'
expected_branch = 'published' expected_branch = 'published'
expected_block_ref = 'HW3' expected_block_ref = 'HW3'
testobj = BlockUsageLocator(package_id=testurn) testobj = BlockUsageLocator(url=testurn)
self.check_block_locn_fields(testobj, 'test_block constructor', self.check_block_locn_fields(testobj, 'test_block constructor',
package_id=expected_id, package_id=expected_id,
branch=expected_branch, branch=expected_branch,
block=expected_block_ref) block=expected_block_ref)
self.assertEqual(str(testobj), testurn) self.assertEqual(str(testobj), testurn)
self.assertEqual(testobj.url(), 'edx://' + testurn) self.assertEqual(testobj.url(), 'edx://' + testurn)
testobj = BlockUsageLocator(url=testurn, version_guid=ObjectId())
agnostic = testobj.version_agnostic() agnostic = testobj.version_agnostic()
self.assertIsNone(agnostic.version_guid) self.assertIsNone(agnostic.version_guid)
self.check_block_locn_fields(agnostic, 'test_block constructor', self.check_block_locn_fields(agnostic, 'test_block constructor',
...@@ -225,7 +226,7 @@ class LocatorTest(TestCase): ...@@ -225,7 +226,7 @@ class LocatorTest(TestCase):
block='lab2', block='lab2',
version_guid=ObjectId(test_id_loc) version_guid=ObjectId(test_id_loc)
) )
agnostic = testobj.version_agnostic() agnostic = testobj.course_agnostic()
self.check_block_locn_fields( self.check_block_locn_fields(
agnostic, 'error parsing URL with version and block', agnostic, 'error parsing URL with version and block',
block='lab2', block='lab2',
......
...@@ -45,7 +45,6 @@ MODULESTORE = { ...@@ -45,7 +45,6 @@ MODULESTORE = {
'ENGINE': 'xmodule.modulestore.mixed.MixedModuleStore', 'ENGINE': 'xmodule.modulestore.mixed.MixedModuleStore',
'OPTIONS': { 'OPTIONS': {
'mappings': {}, 'mappings': {},
'reference_type': 'xmodule.modulestore.Location',
'stores': { 'stores': {
'default': { 'default': {
'ENGINE': 'xmodule.modulestore.mongo.MongoModuleStore', 'ENGINE': 'xmodule.modulestore.mongo.MongoModuleStore',
......
...@@ -32,7 +32,6 @@ MODULESTORE = { ...@@ -32,7 +32,6 @@ MODULESTORE = {
'default': { 'default': {
'ENGINE': 'xmodule.modulestore.mixed.MixedModuleStore', 'ENGINE': 'xmodule.modulestore.mixed.MixedModuleStore',
'OPTIONS': { 'OPTIONS': {
'reference_type': 'Location',
'mappings': {}, 'mappings': {},
'stores': { 'stores': {
'default': { 'default': {
......
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