From 05663098fd70258aac08d73bf5bd76f5125e9669 Mon Sep 17 00:00:00 2001 From: DawoudSheraz Date: Wed, 28 Nov 2018 16:51:16 +0500 Subject: [PATCH] EDUCATOR-3140 prevent saving pre-1900 subsection due dates --- cms/djangoapps/contentstore/views/item.py | 9 +++++++ .../contentstore/views/tests/test_item.py | 27 +++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/cms/djangoapps/contentstore/views/item.py b/cms/djangoapps/contentstore/views/item.py index ffbee7d5d3..e6b6fa5d50 100644 --- a/cms/djangoapps/contentstore/views/item.py +++ b/cms/djangoapps/contentstore/views/item.py @@ -584,6 +584,7 @@ def _save_xblock(user, xblock, data=None, children_strings=None, metadata=None, field.write_to(xblock, value) + validate_and_update_xblock_due_date(xblock) # update the xblock and call any xblock callbacks xblock = _update_with_callback(xblock, user, old_metadata, old_content) @@ -1453,6 +1454,14 @@ def _get_release_date(xblock, user=None): return get_default_time_display(xblock.start) if xblock.start != DEFAULT_START_DATE else None +def validate_and_update_xblock_due_date(xblock): + """ + Validates the due date for the xblock, and set to None if pre-1900 due date provided + """ + if xblock.due and xblock.due.year < 1900: + xblock.due = None + + def _get_release_date_from(xblock): """ Returns a string representation of the section or subsection that sets the xblock's release date diff --git a/cms/djangoapps/contentstore/views/tests/test_item.py b/cms/djangoapps/contentstore/views/tests/test_item.py index b8d0e9db7b..5d571fe2dd 100644 --- a/cms/djangoapps/contentstore/views/tests/test_item.py +++ b/cms/djangoapps/contentstore/views/tests/test_item.py @@ -1418,6 +1418,7 @@ class TestEditItemSetup(ItemTest): self.course_update_url = reverse_usage_url("xblock_handler", self.usage_key) +@ddt.ddt class TestEditItem(TestEditItemSetup): """ Test xblock update. @@ -1474,6 +1475,32 @@ class TestEditItem(TestEditItemSetup): self.assertEqual(sequential.due, datetime(2010, 11, 22, 4, 0, tzinfo=UTC)) self.assertEqual(sequential.start, datetime(2010, 9, 12, 14, 0, tzinfo=UTC)) + @ddt.data( + '1000-01-01T00:00Z', + '0150-11-21T14:45Z', + '1899-12-31T23:59Z', + '1789-06-06T22:10Z', + '1001-01-15T19:32Z', + ) + def test_xblock_due_date_validity(self, date): + """ + Test due date for the subsection is not pre-1900 + """ + self.client.ajax_post( + self.seq_update_url, + data={'metadata': {'due': date}} + ) + sequential = self.get_item_from_modulestore(self.seq_usage_key) + xblock_info = create_xblock_info( + sequential, + include_child_info=True, + include_children_predicate=ALWAYS, + user=self.user + ) + # Both display and actual value should be None + self.assertEquals(xblock_info['due_date'], u'') + self.assertIsNone(xblock_info['due']) + def test_update_generic_fields(self): new_display_name = 'New Display Name' new_max_attempts = 2