diff --git a/common/lib/xmodule/xmodule/modulestore/__init__.py b/common/lib/xmodule/xmodule/modulestore/__init__.py index eb439a8aa575f6c40d48bb281374b551c7b58cd4..a5aef65facef2f34d0b7b87b4a5fb8f651920994 100644 --- a/common/lib/xmodule/xmodule/modulestore/__init__.py +++ b/common/lib/xmodule/xmodule/modulestore/__init__.py @@ -12,7 +12,7 @@ from collections import defaultdict from contextlib import contextmanager import threading from operator import itemgetter -from sortedcontainers import SortedListWithKey +from sortedcontainers import SortedKeyList from abc import ABCMeta, abstractmethod from contracts import contract, new_contract @@ -509,7 +509,7 @@ class IncorrectlySortedList(Exception): pass -class SortedAssetList(SortedListWithKey): +class SortedAssetList(SortedKeyList): """ List of assets that is sorted based on an asset attribute. """ @@ -549,12 +549,11 @@ class SortedAssetList(SortedListWithKey): """ metadata_to_insert = asset_md.to_storable() asset_idx = self.find(asset_md.asset_id) - if asset_idx is None: - # Add new metadata sorted into the list. - self.add(metadata_to_insert) - else: - # Replace existing metadata. - self[asset_idx] = metadata_to_insert + if asset_idx is not None: + # Delete existing metadata. + del self[asset_idx] + # Add new metadata sorted into the list. + self.add(metadata_to_insert) class ModuleStoreAssetBase(object): @@ -575,10 +574,7 @@ class ModuleStoreAssetBase(object): - the index of asset in list (None if asset does not exist) """ course_assets = self._find_course_assets(asset_key.course_key) - all_assets = SortedAssetList(iterable=[]) - # Assets should be pre-sorted, so add them efficiently without sorting. - # extend() will raise a ValueError if the passed-in list is not sorted. - all_assets.extend(course_assets.setdefault(asset_key.block_type, [])) + all_assets = SortedAssetList(iterable=course_assets.setdefault(asset_key.block_type, [])) idx = all_assets.find(asset_key) return course_assets, idx diff --git a/common/lib/xmodule/xmodule/modulestore/mongo/base.py b/common/lib/xmodule/xmodule/modulestore/mongo/base.py index 123c6999999018b0eedaec1ef980bba81ce64eff..eec7eed2b417063b0326773995d17a6a1deef31c 100644 --- a/common/lib/xmodule/xmodule/modulestore/mongo/base.py +++ b/common/lib/xmodule/xmodule/modulestore/mongo/base.py @@ -1856,7 +1856,7 @@ class MongoModuleStore(ModuleStoreDraftAndPublished, ModuleStoreWriteBase, Mongo # Build an update set with potentially multiple embedded fields. updates_by_type = {} for asset_type, assets in assets_by_type.iteritems(): - updates_by_type[self._make_mongo_asset_key(asset_type)] = assets.as_list() + updates_by_type[self._make_mongo_asset_key(asset_type)] = list(assets) # Update the document. self.asset_collection.update( diff --git a/common/lib/xmodule/xmodule/modulestore/split_mongo/split.py b/common/lib/xmodule/xmodule/modulestore/split_mongo/split.py index 2acd3a52e3a3ca43a1c5c8537aea3d5993b286be..93e2ff1510ec2a3f877674bd1bdc184aede710ba 100644 --- a/common/lib/xmodule/xmodule/modulestore/split_mongo/split.py +++ b/common/lib/xmodule/xmodule/modulestore/split_mongo/split.py @@ -2856,14 +2856,11 @@ class SplitMongoModuleStore(SplitBulkWriteMixin, ModuleStoreWriteBase): course_assets = new_structure.setdefault('assets', {}) asset_type = asset_key.asset_type - all_assets = SortedAssetList(iterable=[]) - # Assets should be pre-sorted, so add them efficiently without sorting. - # extend() will raise a ValueError if the passed-in list is not sorted. - all_assets.extend(course_assets.setdefault(asset_type, [])) + all_assets = SortedAssetList(iterable=course_assets.setdefault(asset_type, [])) asset_idx = all_assets.find(asset_key) all_assets_updated = update_function(all_assets, asset_idx) - new_structure['assets'][asset_type] = all_assets_updated.as_list() + new_structure['assets'][asset_type] = list(all_assets_updated) # update index if appropriate and structures self.update_structure(asset_key.course_key, new_structure) @@ -2894,7 +2891,7 @@ class SplitMongoModuleStore(SplitBulkWriteMixin, ModuleStoreWriteBase): ) for asset_type, assets in assets_by_type.iteritems(): - new_structure['assets'][asset_type] = assets.as_list() + new_structure['assets'][asset_type] = list(assets) # update index if appropriate and structures self.update_structure(course_key, new_structure) @@ -2935,7 +2932,7 @@ class SplitMongoModuleStore(SplitBulkWriteMixin, ModuleStoreWriteBase): mdata.update(attr_dict) # Generate a Mongo doc from the metadata and update the course asset info. - all_assets[asset_idx] = mdata.to_storable() + all_assets.insert_or_update(mdata) return all_assets self._update_course_assets(user_id, asset_key, _internal_method) diff --git a/requirements/edx/base.in b/requirements/edx/base.in index f38b4d09daed32a118bfd2280f320d4801790032..bcb4a556773f79d233332d0ac2148ae45477d4bd 100644 --- a/requirements/edx/base.in +++ b/requirements/edx/base.in @@ -141,7 +141,7 @@ sailthru-client==2.2.3 # For Sailthru integration Shapely==1.2.16 # Geometry library, used for image click regions in capa six # Utilities for supporting Python 2 & 3 in the same codebase sorl-thumbnail==12.3 # Image thumbnail management -sortedcontainers==0.9.2 # Provides SortedListWithKey, used for lists of XBlock assets +sortedcontainers # Provides SortedKeyList, used for lists of XBlock assets sqlparse # Required by Django to run migrations.RunSQL stevedore # Support for runtime plugins, used for XBlocks and edx-platform Django app plugins unicodecsv # Easier support for CSV files with unicode text diff --git a/requirements/edx/base.txt b/requirements/edx/base.txt index 8323f25e55adbb6993d1b86459e207d77175f1a5..c80d046734cae98e6d85f9136dd624d2081efc4d 100644 --- a/requirements/edx/base.txt +++ b/requirements/edx/base.txt @@ -225,7 +225,7 @@ slumber==0.7.1 # via edx-rest-api-client social-auth-app-django==2.1.0 social-auth-core==1.7.0 sorl-thumbnail==12.3 -sortedcontainers==0.9.2 +sortedcontainers==2.1.0 soupsieve==1.8 # via beautifulsoup4 sqlparse==0.2.4 stevedore==1.30.0 diff --git a/requirements/edx/development.txt b/requirements/edx/development.txt index b03cce5f961a03d8fd5faa8fa5bf7ca090e45eda..11423952e49856492bf01c4cf144bd9cf8f007ef 100644 --- a/requirements/edx/development.txt +++ b/requirements/edx/development.txt @@ -317,7 +317,7 @@ snowballstemmer==1.2.1 # via sphinx social-auth-app-django==2.1.0 social-auth-core==1.7.0 sorl-thumbnail==12.3 -sortedcontainers==0.9.2 +sortedcontainers==2.1.0 soupsieve==1.8 sphinx==1.8.4 sphinxcontrib-websupport==1.1.0 # via sphinx diff --git a/requirements/edx/testing.txt b/requirements/edx/testing.txt index 572da49a30cbe0d1d379a1e15de4c8a96885aaad..41c571b5ee0d71121ef72349de4b8a13a919bddc 100644 --- a/requirements/edx/testing.txt +++ b/requirements/edx/testing.txt @@ -306,7 +306,7 @@ slumber==0.7.1 social-auth-app-django==2.1.0 social-auth-core==1.7.0 sorl-thumbnail==12.3 -sortedcontainers==0.9.2 +sortedcontainers==2.1.0 soupsieve==1.8 splinter==0.9.0 sqlparse==0.2.4