Commit 1bc0b323 by Calen Pennington

Explicitly create the AssetKey for all assets coming out of a ContentStore

parent 4e67c2a9
...@@ -121,8 +121,7 @@ def _assets_json(request, course_key): ...@@ -121,8 +121,7 @@ def _assets_json(request, course_key):
asset_json = [] asset_json = []
for asset in assets: for asset in assets:
asset_id = asset.get('content_son', asset['_id']) asset_location = asset['asset_key']
asset_location = StaticContent.compute_location(course_key, asset_id['name'])
# note, due to the schema change we may not have a 'thumbnail_location' in the result set # note, due to the schema change we may not have a 'thumbnail_location' in the result set
thumbnail_location = asset.get('thumbnail_location', None) thumbnail_location = asset.get('thumbnail_location', None)
if thumbnail_location: if thumbnail_location:
......
...@@ -188,23 +188,13 @@ class ContentStore(object): ...@@ -188,23 +188,13 @@ class ContentStore(object):
Returns a list of static assets for a course, followed by the total number of assets. Returns a list of static assets for a course, followed by the total number of assets.
By default all assets are returned, but start and maxresults can be provided to limit the query. By default all assets are returned, but start and maxresults can be provided to limit the query.
The return format is a list of dictionary elements. Example: The return format is a list of asset data dictionaries.
The asset data dictionaries have the following keys:
[ asset_key (:class:`opaque_keys.edx.AssetKey`): The key of the asset
displayname: The human-readable name of the asset
{u'displayname': u'profile.jpg', u'chunkSize': 262144, u'length': 85374, uploadDate (datetime.datetime): The date and time that the file was uploadDate
u'uploadDate': datetime.datetime(2012, 10, 3, 5, 41, 54, 183000), u'contentType': u'image/jpeg', contentType: The mimetype string of the asset
u'_id': {u'category': u'asset', u'name': u'profile.jpg', u'course': u'6.002x', u'tag': u'c4x', md5: An md5 hash of the asset content
u'org': u'MITx', u'revision': None}, u'md5': u'36dc53519d4b735eb6beba51cd686a0e'},
{u'displayname': u'profile.thumbnail.jpg', u'chunkSize': 262144, u'length': 4073,
u'uploadDate': datetime.datetime(2012, 10, 3, 5, 41, 54, 196000), u'contentType': u'image/jpeg',
u'_id': {u'category': u'asset', u'name': u'profile.thumbnail.jpg', u'course': u'6.002x', u'tag': u'c4x',
u'org': u'MITx', u'revision': None}, u'md5': u'ff1532598830e3feac91c2449eaa60d6'},
....
]
''' '''
raise NotImplementedError raise NotImplementedError
......
...@@ -146,9 +146,6 @@ class MongoContentStore(ContentStore): ...@@ -146,9 +146,6 @@ class MongoContentStore(ContentStore):
assets, __ = self.get_all_content_for_course(course_key) assets, __ = self.get_all_content_for_course(course_key)
for asset in assets: for asset in assets:
asset_id = asset.get('content_son', asset['_id'])
# assuming course_key's deprecated flag is controlling rather than presence or absence of 'run' in _id
asset_location = course_key.make_asset_key(asset_id['category'], asset_id['name'])
# TODO: On 6/19/14, I had to put a try/except around this # TODO: On 6/19/14, I had to put a try/except around this
# to export a course. The course failed on JSON files in # to export a course. The course failed on JSON files in
# the /static/ directory placed in it with an import. # the /static/ directory placed in it with an import.
...@@ -157,10 +154,10 @@ class MongoContentStore(ContentStore): ...@@ -157,10 +154,10 @@ class MongoContentStore(ContentStore):
# #
# When debugging course exports, this might be a good place # When debugging course exports, this might be a good place
# to look. -- pmitros # to look. -- pmitros
self.export(asset_location, output_directory) self.export(asset['asset_key'], output_directory)
for attr, value in asset.iteritems(): for attr, value in asset.iteritems():
if attr not in ['_id', 'md5', 'uploadDate', 'length', 'chunkSize']: if attr not in ['_id', 'md5', 'uploadDate', 'length', 'chunkSize', 'asset_key']:
policy.setdefault(asset_location.name, {})[attr] = value policy.setdefault(asset['asset_key'].name, {})[attr] = value
with open(assets_policy_file, 'w') as f: with open(assets_policy_file, 'w') as f:
json.dump(policy, f) json.dump(policy, f)
...@@ -175,23 +172,14 @@ class MongoContentStore(ContentStore): ...@@ -175,23 +172,14 @@ class MongoContentStore(ContentStore):
def _get_all_content_for_course(self, course_key, get_thumbnails=False, start=0, maxresults=-1, sort=None): def _get_all_content_for_course(self, course_key, get_thumbnails=False, start=0, maxresults=-1, sort=None):
''' '''
Returns a list of all static assets for a course. The return format is a list of dictionary elements. Example: Returns a list of all static assets for a course. The return format is a list of asset data dictionary elements.
[ The asset data dictionaries have the following keys:
asset_key (:class:`opaque_keys.edx.AssetKey`): The key of the asset
{u'displayname': u'profile.jpg', u'chunkSize': 262144, u'length': 85374, displayname: The human-readable name of the asset
u'uploadDate': datetime.datetime(2012, 10, 3, 5, 41, 54, 183000), u'contentType': u'image/jpeg', uploadDate (datetime.datetime): The date and time that the file was uploadDate
u'_id': {u'category': u'asset', u'name': u'profile.jpg', u'course': u'6.002x', u'tag': u'c4x', contentType: The mimetype string of the asset
u'org': u'MITx', u'revision': None}, u'md5': u'36dc53519d4b735eb6beba51cd686a0e'}, md5: An md5 hash of the asset content
{u'displayname': u'profile.thumbnail.jpg', u'chunkSize': 262144, u'length': 4073,
u'uploadDate': datetime.datetime(2012, 10, 3, 5, 41, 54, 196000), u'contentType': u'image/jpeg',
u'_id': {u'category': u'asset', u'name': u'profile.thumbnail.jpg', u'course': u'6.002x', u'tag': u'c4x',
u'org': u'MITx', u'revision': None}, u'md5': u'ff1532598830e3feac91c2449eaa60d6'},
....
]
''' '''
if maxresults > 0: if maxresults > 0:
items = self.fs_files.find( items = self.fs_files.find(
...@@ -203,7 +191,14 @@ class MongoContentStore(ContentStore): ...@@ -203,7 +191,14 @@ class MongoContentStore(ContentStore):
query_for_course(course_key, "asset" if not get_thumbnails else "thumbnail"), sort=sort query_for_course(course_key, "asset" if not get_thumbnails else "thumbnail"), sort=sort
) )
count = items.count() count = items.count()
return list(items), count assets = list(items)
# We're constructing the asset key immediately after retrieval from the database so that
# callers are insulated from knowing how our identifiers are stored.
for asset in assets:
asset_id = asset.get('content_son', asset['_id'])
asset['asset_key'] = course_key.make_asset_key(asset_id['category'], asset_id['name'])
return assets, count
def set_attr(self, asset_key, attr, value=True): def set_attr(self, asset_key, attr, value=True):
""" """
......
...@@ -66,10 +66,7 @@ def _clear_assets(location): ...@@ -66,10 +66,7 @@ def _clear_assets(location):
assets, __ = store.get_all_content_for_course(location.course_key) assets, __ = store.get_all_content_for_course(location.course_key)
for asset in assets: for asset in assets:
asset_location = AssetLocation._from_deprecated_son( asset_location = asset['asset_key']
asset.get('content_son', asset["_id"]),
location.course_key.run
)
del_cached_content(asset_location) del_cached_content(asset_location)
store.delete(asset_location) store.delete(asset_location)
......
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