Commit 600e7bf3 by John Eskew

Merge pull request #5953 from edx/jeskew/created_by_on_addition

Add created_on and created_by to asset metadata storage.
parents 3ae312ca 872faddb
......@@ -5,8 +5,7 @@ Classes representing asset metadata.
from datetime import datetime
import pytz
from contracts import contract, new_contract
from bisect import bisect_left, bisect_right
from opaque_keys.edx.keys import CourseKey, AssetKey
from opaque_keys.edx.keys import AssetKey
new_contract('AssetKey', AssetKey)
new_contract('datetime', datetime)
......@@ -26,12 +25,19 @@ class AssetMetadata(object):
# Default type for AssetMetadata objects. A constant for convenience.
ASSET_TYPE = 'asset'
@contract(asset_id='AssetKey', basename='basestring|None', internal_name='basestring|None', locked='bool|None', contenttype='basestring|None',
fields='dict | None', curr_version='basestring|None', prev_version='basestring|None', edited_by='int|None', edited_on='datetime|None')
@contract(asset_id='AssetKey',
basename='basestring|None', internal_name='basestring|None',
locked='bool|None', contenttype='basestring|None',
thumbnail='basestring|None', fields='dict|None',
curr_version='basestring|None', prev_version='basestring|None',
created_by='int|None', created_on='datetime|None',
edited_by='int|None', edited_on='datetime|None')
def __init__(self, asset_id,
basename=None, internal_name=None,
locked=None, contenttype=None, thumbnail=None, fields=None,
locked=None, contenttype=None,
thumbnail=None, fields=None,
curr_version=None, prev_version=None,
created_by=None, created_on=None,
edited_by=None, edited_on=None,
field_decorator=None,):
"""
......@@ -60,8 +66,12 @@ class AssetMetadata(object):
self.thumbnail = thumbnail
self.curr_version = curr_version
self.prev_version = prev_version
now = datetime.now(pytz.utc)
self.edited_by = edited_by
self.edited_on = edited_on or datetime.now(pytz.utc)
self.edited_on = edited_on or now
# created_by and created_on should only be set here.
self.created_by = created_by
self.created_on = created_on or now
self.fields = fields or {}
def __repr__(self):
......@@ -70,7 +80,8 @@ class AssetMetadata(object):
self.basename, self.internal_name,
self.locked, self.contenttype, self.fields,
self.curr_version, self.prev_version,
self.edited_by, self.edited_on
self.edited_by, self.edited_on,
self.created_by, self.created_on
))
def update(self, attr_dict):
......@@ -99,10 +110,14 @@ class AssetMetadata(object):
'contenttype': self.contenttype,
'thumbnail': self.thumbnail,
'fields': self.fields,
'curr_version': self.curr_version,
'prev_version': self.prev_version,
'edited_by': self.edited_by,
'edited_on': self.edited_on
'edit_info': {
'curr_version': self.curr_version,
'prev_version': self.prev_version,
'edited_by': self.edited_by,
'edited_on': self.edited_on,
'created_by': self.created_by,
'created_on': self.created_on
}
}
@contract(asset_doc='dict|None')
......@@ -120,7 +135,9 @@ class AssetMetadata(object):
self.contenttype = asset_doc['contenttype']
self.thumbnail = asset_doc['thumbnail']
self.fields = asset_doc['fields']
self.curr_version = asset_doc['curr_version']
self.prev_version = asset_doc['prev_version']
self.edited_by = asset_doc['edited_by']
self.edited_on = asset_doc['edited_on']
self.curr_version = asset_doc['edit_info']['curr_version']
self.prev_version = asset_doc['edit_info']['prev_version']
self.edited_by = asset_doc['edit_info']['edited_by']
self.edited_on = asset_doc['edit_info']['edited_on']
self.created_by = asset_doc['edit_info']['created_by']
self.created_on = asset_doc['edit_info']['created_on']
......@@ -364,15 +364,15 @@ class ModuleStoreAssetInterface(object):
return None
# Determine the proper sort - with defaults of ('displayname', SortOrder.ascending).
sort_field = 'filename'
key_func = itemgetter('filename')
sort_order = ModuleStoreEnum.SortOrder.ascending
if sort:
if sort[0] == 'uploadDate':
sort_field = 'edited_on'
key_func = lambda x: x['edit_info']['edited_on']
if sort[1] == ModuleStoreEnum.SortOrder.descending:
sort_order = ModuleStoreEnum.SortOrder.descending
all_assets = SortedListWithKey(course_assets.get(asset_type, []), key=itemgetter(sort_field))
all_assets = SortedListWithKey(course_assets.get(asset_type, []), key=key_func)
num_assets = len(all_assets)
start_idx = start
......
......@@ -47,11 +47,13 @@ class TestMongoAssetMetadataStorage(unittest.TestCase):
"""
Make a single test asset metadata.
"""
now = datetime.now(pytz.utc)
return AssetMetadata(
asset_loc, internal_name='EKMND332DDBK',
basename='pictures/historical', contenttype='image/jpeg',
locked=False, fields={'md5': '77631ca4f0e08419b70726a447333ab6'},
edited_by=ModuleStoreEnum.UserID.test, edited_on=datetime.now(pytz.utc),
edited_by=ModuleStoreEnum.UserID.test, edited_on=now,
created_by=ModuleStoreEnum.UserID.test, created_on=now,
curr_version='v1.0', prev_version='v0.95'
)
......@@ -66,17 +68,23 @@ class TestMongoAssetMetadataStorage(unittest.TestCase):
"""
Setup assets. Save in store if given
"""
asset_fields = ('filename', 'internal_name', 'basename', 'locked', 'edited_by', 'edited_on', 'curr_version', 'prev_version')
asset_fields = (
'filename', 'internal_name', 'basename', 'locked',
'edited_by', 'edited_on', 'created_by', 'created_on',
'curr_version', 'prev_version'
)
now = datetime.now(pytz.utc)
user_id = ModuleStoreEnum.UserID.test
all_asset_data = (
('pic1.jpg', 'EKMND332DDBK', 'pix/archive', False, ModuleStoreEnum.UserID.test, datetime.now(pytz.utc), '14', '13'),
('shout.ogg', 'KFMDONSKF39K', 'sounds', True, ModuleStoreEnum.UserID.test, datetime.now(pytz.utc), '1', None),
('code.tgz', 'ZZB2333YBDMW', 'exercises/14', False, ModuleStoreEnum.UserID.test * 2, datetime.now(pytz.utc), 'AB', 'AA'),
('dog.png', 'PUPY4242X', 'pictures/animals', True, ModuleStoreEnum.UserID.test * 3, datetime.now(pytz.utc), '5', '4'),
('not_here.txt', 'JJJCCC747', '/dev/null', False, ModuleStoreEnum.UserID.test * 4, datetime.now(pytz.utc), '50', '49'),
('asset.txt', 'JJJCCC747858', '/dev/null', False, ModuleStoreEnum.UserID.test * 4, datetime.now(pytz.utc), '50', '49'),
('roman_history.pdf', 'JASDUNSADK', 'texts/italy', True, ModuleStoreEnum.UserID.test * 7, datetime.now(pytz.utc), '1.1', '1.01'),
('weather_patterns.bmp', '928SJXX2EB', 'science', False, ModuleStoreEnum.UserID.test * 8, datetime.now(pytz.utc), '52', '51'),
('demo.swf', 'DFDFGGGG14', 'demos/easy', False, ModuleStoreEnum.UserID.test * 9, datetime.now(pytz.utc), '5', '4'),
('pic1.jpg', 'EKMND332DDBK', 'pix/archive', False, user_id, now, user_id, now, '14', '13'),
('shout.ogg', 'KFMDONSKF39K', 'sounds', True, user_id, now, user_id, now, '1', None),
('code.tgz', 'ZZB2333YBDMW', 'exercises/14', False, user_id * 2, now, user_id * 2, now, 'AB', 'AA'),
('dog.png', 'PUPY4242X', 'pictures/animals', True, user_id * 3, now, user_id * 3, now, '5', '4'),
('not_here.txt', 'JJJCCC747', '/dev/null', False, user_id * 4, now, user_id * 4, now, '50', '49'),
('asset.txt', 'JJJCCC747858', '/dev/null', False, user_id * 4, now, user_id * 4, now, '50', '49'),
('roman_history.pdf', 'JASDUNSADK', 'texts/italy', True, user_id * 7, now, user_id * 7, now, '1.1', '1.01'),
('weather_patterns.bmp', '928SJXX2EB', 'science', False, user_id * 8, now, user_id * 8, now, '52', '51'),
('demo.swf', 'DFDFGGGG14', 'demos/easy', False, user_id * 9, now, user_id * 9, now, '5', '4'),
)
for i, asset in enumerate(all_asset_data):
......@@ -204,6 +212,8 @@ class TestMongoAssetMetadataStorage(unittest.TestCase):
DISALLOWED_ATTRS = (
('asset_id', 'IAmBogus'),
('created_by', 'Smith'),
('created_on', datetime.now(pytz.utc)),
)
UNKNOWN_ATTRS = (
......
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