From 9c93cd8dd630988ac6b9b91eac41a5df7fe773bf Mon Sep 17 00:00:00 2001 From: Braden MacDonald Date: Tue, 19 Aug 2014 22:15:12 -0700 Subject: [PATCH] Fix: Display error when attempting to reset nonexistent due date extension --- lms/djangoapps/instructor/tests/test_api.py | 3 ++- lms/djangoapps/instructor/tests/test_tools.py | 23 ++++--------------- lms/djangoapps/instructor/views/tools.py | 20 ++++++++++++++++ 3 files changed, 27 insertions(+), 19 deletions(-) diff --git a/lms/djangoapps/instructor/tests/test_api.py b/lms/djangoapps/instructor/tests/test_api.py index 998208cdaf..a776a07fc7 100644 --- a/lms/djangoapps/instructor/tests/test_api.py +++ b/lms/djangoapps/instructor/tests/test_api.py @@ -47,7 +47,8 @@ from opaque_keys.edx.locations import SlashSeparatedCourseKey from shoppingcart.models import CourseRegistrationCode, RegistrationCodeRedemption, Order, PaidCourseRegistration, Coupon from course_modes.models import CourseMode -from .test_tools import msk_from_problem_urlname, get_extended_due +from .test_tools import msk_from_problem_urlname +from ..views.tools import get_extended_due @common_exceptions_400 diff --git a/lms/djangoapps/instructor/tests/test_tools.py b/lms/djangoapps/instructor/tests/test_tools.py index cdda7f95c2..aa216625a7 100644 --- a/lms/djangoapps/instructor/tests/test_tools.py +++ b/lms/djangoapps/instructor/tests/test_tools.py @@ -197,7 +197,7 @@ class TestSetDueDateExtension(ModuleStoreTestCase): self.user = user self.extended_due = functools.partial( - get_extended_due, course, student=user) + tools.get_extended_due, course, student=user) def test_set_due_date_extension(self): extended = datetime.datetime(2013, 12, 25, 0, 0, tzinfo=utc) @@ -209,7 +209,7 @@ class TestSetDueDateExtension(ModuleStoreTestCase): extended = datetime.datetime(2013, 12, 25, 0, 0, tzinfo=utc) user = UserFactory.create() # No student modules for this user tools.set_due_date_extension(self.course, self.week1, user, extended) - extended_due = functools.partial(get_extended_due, self.course, student=user) + extended_due = functools.partial(tools.get_extended_due, self.course, student=user) self.assertEqual(extended_due(self.week1), extended) self.assertEqual(extended_due(self.homework), extended) @@ -224,8 +224,11 @@ class TestSetDueDateExtension(ModuleStoreTestCase): tools.set_due_date_extension(self.course, self.week3, self.user, extended) def test_reset_due_date_extension(self): + extended = datetime.datetime(2013, 12, 25, 0, 0, tzinfo=utc) + tools.set_due_date_extension(self.course, self.week1, self.user, extended) tools.set_due_date_extension(self.course, self.week1, self.user, None) self.assertEqual(self.extended_due(self.week1), None) + self.assertEqual(self.extended_due(self.homework), None) @override_settings(MODULESTORE=TEST_DATA_MIXED_MODULESTORE) @@ -341,22 +344,6 @@ class TestDataDumps(ModuleStoreTestCase): "Extended Due Date": "2013-12-25 00:00"}]) -def get_extended_due(course, unit, student): - """ - Get the extended due date out of a student's state for a particular unit. - """ - student_module = StudentModule.objects.get( - student_id=student.id, - course_id=course.id, - module_state_key=unit.location - ) - - state = json.loads(student_module.state) - extended = state.get('extended_due', None) - if extended: - return DATE_FIELD.from_json(extended) - - def msk_from_problem_urlname(course_id, urlname, block_type='problem'): """ Convert a 'problem urlname' to a module state key (db field) diff --git a/lms/djangoapps/instructor/views/tools.py b/lms/djangoapps/instructor/views/tools.py index 567255703b..44919ca064 100644 --- a/lms/djangoapps/instructor/views/tools.py +++ b/lms/djangoapps/instructor/views/tools.py @@ -159,6 +159,22 @@ def title_or_url(node): return title +def get_extended_due(course, unit, student): + """ + Get the extended due date out of a student's state for a particular unit. + """ + student_module = StudentModule.objects.get( + student_id=student.id, + course_id=course.id, + module_state_key=unit.location + ) + + state = json.loads(student_module.state) + extended = state.get('extended_due', None) + if extended: + return DATE_FIELD.from_json(extended) + + def set_due_date_extension(course, unit, student, due_date): """ Sets a due date extension. Raises DashboardError if the unit or extended @@ -172,6 +188,10 @@ def set_due_date_extension(course, unit, student, due_date): raise DashboardError(_("Unit {0} has no due date to extend.").format(unit.location)) if due_date < original_due_date: raise DashboardError(_("An extended due date must be later than the original due date.")) + else: + # We are deleting a due date extension. Check that it exists: + if not get_extended_due(course, unit, student): + raise DashboardError(_("No due date extension is set for that student and unit.")) def set_due_date(node): """