Skip to content

Commit

Permalink
fix: do not use course's due date when a timed exam has one specified
Browse files Browse the repository at this point in the history
24199b4 introduced course end date check to allow viewing timed exams after
course end date in self-paced courses. However, this change also means that
the students cannot submit exams once the course due date is in the past.
The exam's due date should have a higher priority, so that the students with
an individual due date extension (set through the Instructor Dashboard) can
still complete an exam in such a case.
  • Loading branch information
Agrendalath committed Oct 26, 2022
1 parent 0588aad commit 5de6d30
Show file tree
Hide file tree
Showing 5 changed files with 41 additions and 5 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@ Change Log
Unreleased
~~~~~~~~~~

[4.13.0] - 2022-10-26
~~~~~~~~~~~~~~~~~~~~~
* Do not use course's due date when a timed exam has one specified

[4.12.2] - 2022-10-19
~~~~~~~~~~~~~~~~~~~~~
* Return external id when requesting exam attempt
Expand Down
2 changes: 1 addition & 1 deletion edx_proctoring/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,6 @@
"""

# Be sure to update the version number in edx_proctoring/package.json
__version__ = '4.12.2'
__version__ = '4.13.0'

default_app_config = 'edx_proctoring.apps.EdxProctoringConfig' # pylint: disable=invalid-name
11 changes: 8 additions & 3 deletions edx_proctoring/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -882,11 +882,16 @@ def is_exam_passed_due(exam, user=None):
Return whether the due date has passed.
Uses edx_when to lookup the date for the subsection.
"""
due_date = get_exam_due_date(exam, user=user)
return (
has_due_date_passed(get_exam_due_date(exam, user=user))
# if the exam is timed and passed the course end date, it should also be considered passed due
has_due_date_passed(due_date)
# If the exam is timed and passed the course end date, it should also be considered passed due, unless
# it has a due date set. The exam's due date has a higher priority than the course's end date.
or (
not exam['is_proctored'] and not exam['is_practice_exam'] and has_end_date_passed(exam['course_id'])
not due_date
and not exam['is_proctored']
and not exam['is_practice_exam']
and has_end_date_passed(exam['course_id'])
)
)

Expand Down
27 changes: 27 additions & 0 deletions edx_proctoring/tests/test_student_view.py
Original file line number Diff line number Diff line change
Expand Up @@ -873,6 +873,33 @@ def test_timed_exam_attempt_with_past_due_datetime(self):
)
self.assertIn(self.exam_expired_msg, rendered_response)

@patch('edx_when.api.get_date_for_block')
@patch('edx_when.api.get_dates_for_course')
def test_timed_exam_attempt_with_past_course_due_date_and_future_exam_due_date(
self, mock_course_dates, mock_exam_due_date
):
"""
When the course due date is in the past, but the exam-specific due date is in the future, students should still
be able to start this exam.
"""
current_date = datetime.now(pytz.UTC)
course_end_date = current_date - timedelta(days=14)
exam_due_date = current_date + timedelta(days=14)

mock_course_dates.return_value = {('dummy', 'end'): course_end_date}
mock_exam_due_date.return_value = exam_due_date

self._create_exam_with_due_time(due_date=exam_due_date, is_proctored=False)

with freeze_time(current_date):
rendered_response = get_student_view(
user_id=self.user_id,
course_id=self.course_id,
content_id=self.content_id_for_exam_with_due_date,
context={},
)
self.assertIn(self.timed_footer_msg, rendered_response)

@patch.dict('django.conf.settings.PROCTORING_SETTINGS', {'ALLOW_TIMED_OUT_STATE': True})
def test_get_studentview_timedout(self):
"""
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "@edx/edx-proctoring",
"//": "Note that the version format is slightly different than that of the Python version when using prereleases.",
"version": "4.12.2",
"version": "4.13.0",
"main": "edx_proctoring/static/index.js",
"scripts": {
"test": "gulp test"
Expand Down

0 comments on commit 5de6d30

Please sign in to comment.