From 5886118afe7014913ce7e179bc1fe8162d7ee644 Mon Sep 17 00:00:00 2001 From: Chris Dodge Date: Tue, 17 Sep 2013 10:35:19 -0400 Subject: [PATCH] in XML deserializations, we can get get floats for start/stop times, so we need to be able to parse those add test video with float-based end-time --- .../lib/xmodule/xmodule/tests/test_video.py | 35 +++++++++++++++++++ common/lib/xmodule/xmodule/video_module.py | 16 +++++---- .../test/data/toy/vertical/vertical_test.xml | 1 + .../data/toy/video/video_with_end_time.xml | 1 + 4 files changed, 47 insertions(+), 6 deletions(-) create mode 100644 common/test/data/toy/video/video_with_end_time.xml diff --git a/common/lib/xmodule/xmodule/tests/test_video.py b/common/lib/xmodule/xmodule/tests/test_video.py index 708c874fc3..b935acfb57 100644 --- a/common/lib/xmodule/xmodule/tests/test_video.py +++ b/common/lib/xmodule/xmodule/tests/test_video.py @@ -48,6 +48,12 @@ class VideoModuleTest(LogicTest): output = VideoDescriptor._parse_time('00:04:07') self.assertEqual(output, expected) + def test_parse_time_with_float(self): + """Ensure that times are parsed correctly into seconds.""" + expected = 247 + output = VideoDescriptor._parse_time('247.0') + self.assertEqual(output, expected) + def test_parse_youtube(self): """Test parsing old-style Youtube ID strings into a dict.""" youtube_str = '0.75:jNCf2gIqpeE,1.00:ZwkTiUPN0mg,1.25:rsq9auxASqI,1.50:kMyNdzVHHgg' @@ -412,6 +418,35 @@ class VideoDescriptorImportTestCase(unittest.TestCase): 'data': '' }) + def test_import_with_float_times(self): + """ + Ensure that Video is able to read VideoModule's model data. + """ + module_system = DummySystem(load_error_modules=True) + xml_data = """ + + """ + video = VideoDescriptor.from_xml(xml_data, module_system) + self.assert_attributes_equal(video, { + 'youtube_id_0_75': 'izygArpw-Qo', + 'youtube_id_1_0': 'p2Q6BrNhdh8', + 'youtube_id_1_25': '1EeWXzPdhSA', + 'youtube_id_1_5': 'rABDYkeK0x8', + 'show_captions': False, + 'start_time': 1.0, + 'end_time': 60.0, + 'track': 'http://www.example.com/track', + 'html5_sources': ['http://www.example.com/source.mp4'], + 'data': '' + }) + class VideoExportTestCase(unittest.TestCase): """ diff --git a/common/lib/xmodule/xmodule/video_module.py b/common/lib/xmodule/xmodule/video_module.py index 10ab6e816c..984404ef8c 100644 --- a/common/lib/xmodule/xmodule/video_module.py +++ b/common/lib/xmodule/xmodule/video_module.py @@ -385,12 +385,16 @@ class VideoDescriptor(VideoFields, TabsEditingDescriptor, EmptyDataRawDescriptor if not str_time: return '' else: - obj_time = time.strptime(str_time, '%H:%M:%S') - return datetime.timedelta( - hours=obj_time.tm_hour, - minutes=obj_time.tm_min, - seconds=obj_time.tm_sec - ).total_seconds() + try: + obj_time = time.strptime(str_time, '%H:%M:%S') + return datetime.timedelta( + hours=obj_time.tm_hour, + minutes=obj_time.tm_min, + seconds=obj_time.tm_sec + ).total_seconds() + except ValueError: + # We've seen serialized versions of float in this field + return float(str_time) def _create_youtube_string(module): diff --git a/common/test/data/toy/vertical/vertical_test.xml b/common/test/data/toy/vertical/vertical_test.xml index 68c5745f37..bcc2fc6434 100644 --- a/common/test/data/toy/vertical/vertical_test.xml +++ b/common/test/data/toy/vertical/vertical_test.xml @@ -1,6 +1,7 @@