feat: add clear grades to course reset task
This commit is contained in:
@@ -12,6 +12,7 @@ from lms.djangoapps.courseware.courses import get_course
|
||||
from lms.djangoapps.courseware.models import StudentModule
|
||||
from lms.djangoapps.instructor.enrollment import reset_student_attempts
|
||||
from lms.djangoapps.support.models import CourseResetAudit
|
||||
from lms.djangoapps.grades.api import clear_user_course_grades
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
@@ -67,6 +68,8 @@ def reset_student_course(course_id, learner_email, reset_by_user_email):
|
||||
|
||||
# Clear block completion data
|
||||
BlockCompletion.objects.clear_learning_context_completion(user, course.id)
|
||||
# Clear a student grades for a course
|
||||
clear_user_course_grades(user.id, course.id)
|
||||
|
||||
update_audit_status(course_reset_audit, CourseResetAudit.CourseResetStatus.COMPLETE)
|
||||
except Exception as e: # pylint: disable=broad-except
|
||||
|
||||
@@ -49,6 +49,11 @@ class ResetStudentCourse(TestSubmittingProblems):
|
||||
self.mock_block_completion = completion_patcher.start()
|
||||
self.addCleanup(completion_patcher.stop)
|
||||
|
||||
# Patch clear_user_course_grades for the whole test
|
||||
grades_patcher = patch('lms.djangoapps.support.tasks.clear_user_course_grades')
|
||||
self.mock_clear_user_course_grades = grades_patcher.start()
|
||||
self.addCleanup(grades_patcher.stop)
|
||||
|
||||
@property
|
||||
def mock_clear_block_completion(self):
|
||||
""" Helper property to access the two-mock-layers-deep clear_learning_context_completion """
|
||||
@@ -144,6 +149,7 @@ class ResetStudentCourse(TestSubmittingProblems):
|
||||
])
|
||||
|
||||
self.mock_clear_block_completion.assert_called_once_with(self.student_user, self.course.id)
|
||||
self.mock_clear_user_course_grades.assert_called_once_with(self.student_user.id, self.course.id)
|
||||
course_reset_audit = CourseResetAudit.objects.get(course_enrollment=self.enrollment)
|
||||
self.assertIsNotNone(course_reset_audit.completed_at)
|
||||
self.assertEqual(course_reset_audit.status, CourseResetAudit.CourseResetStatus.COMPLETE)
|
||||
@@ -181,6 +187,7 @@ class ResetStudentCourse(TestSubmittingProblems):
|
||||
])
|
||||
|
||||
self.mock_clear_block_completion.assert_called_once_with(self.student_user, self.course.id)
|
||||
self.mock_clear_user_course_grades.assert_called_once_with(self.student_user.id, self.course.id)
|
||||
course_reset_audit = CourseResetAudit.objects.get(course_enrollment=self.enrollment)
|
||||
self.assertRaises(StudentModule.DoesNotExist, mock_reset_student_attempts)
|
||||
self.assertIsNotNone(course_reset_audit.completed_at)
|
||||
@@ -195,6 +202,7 @@ class ResetStudentCourse(TestSubmittingProblems):
|
||||
reset_student_course(self.course_id, self.student_user.email, self.user.email)
|
||||
mock_reset_student_attempts.assert_not_called()
|
||||
self.mock_clear_block_completion.assert_not_called()
|
||||
self.mock_clear_user_course_grades.assert_not_called()
|
||||
course_reset_audit = CourseResetAudit.objects.get(course_enrollment=self.enrollment)
|
||||
self.assertIsNone(course_reset_audit.completed_at)
|
||||
self.assertEqual(course_reset_audit.status, CourseResetAudit.CourseResetStatus.FAILED)
|
||||
@@ -208,6 +216,7 @@ class ResetStudentCourse(TestSubmittingProblems):
|
||||
reset_student_course(self.course_id, self.student_user.email, self.user.email)
|
||||
mock_reset_student_attempts.assert_called_once()
|
||||
self.mock_clear_block_completion.assert_not_called()
|
||||
self.mock_clear_user_course_grades.assert_not_called()
|
||||
course_reset_audit = CourseResetAudit.objects.get(course_enrollment=self.enrollment)
|
||||
self.assertIsNone(course_reset_audit.completed_at)
|
||||
self.assertEqual(course_reset_audit.status, CourseResetAudit.CourseResetStatus.FAILED)
|
||||
|
||||
@@ -2428,7 +2428,7 @@ class TestResetCourseCreateView(ResetCourseViewTestBase):
|
||||
'display_name': self.course.display_name
|
||||
})
|
||||
# The reset task should be queued
|
||||
mock_reset_student_course.delay.assert_called_once_with(self.course_id, self.learner.id, self.user.id)
|
||||
mock_reset_student_course.delay.assert_called_once_with(self.course_id, self.learner.email, self.user.email)
|
||||
# And an audit should be created as ENQUEUED
|
||||
self.assertEqual(
|
||||
self.enrollment.courseresetaudit_set.first().status,
|
||||
@@ -2453,7 +2453,7 @@ class TestResetCourseCreateView(ResetCourseViewTestBase):
|
||||
'comment': '',
|
||||
'display_name': self.course.display_name
|
||||
})
|
||||
mock_reset_student_course.delay.assert_called_once_with(self.course_id, self.learner.id, self.user.id)
|
||||
mock_reset_student_course.delay.assert_called_once_with(self.course_id, self.learner.email, self.user.email)
|
||||
|
||||
def test_course_reset_already_reset(self):
|
||||
""" A course that has an audit that hasn't failed should not be allowed to be run again """
|
||||
|
||||
@@ -160,5 +160,5 @@ class CourseResetAPIView(APIView):
|
||||
'display_name': course_enrollment.course_overview.display_name
|
||||
}
|
||||
|
||||
reset_student_course.delay(course_id, user.id, request.user.id)
|
||||
reset_student_course.delay(course_id, user.email, request.user.email)
|
||||
return Response(resp, status=201)
|
||||
|
||||
Reference in New Issue
Block a user