Commit db8efa82 by chrisndodge

Merge pull request #130 from…

Merge pull request #130 from edx/muhhshoaib/PHX-122-remove-the-record-in-the-creditRequirementStatus-table

PHX-122
parents ef60f100 e386a7d4
...@@ -740,13 +740,28 @@ def remove_exam_attempt(attempt_id): ...@@ -740,13 +740,28 @@ def remove_exam_attempt(attempt_id):
raise StudentExamAttemptDoesNotExistsException(err_msg) raise StudentExamAttemptDoesNotExistsException(err_msg)
username = existing_attempt.user.username username = existing_attempt.user.username
user_id = existing_attempt.user.id
course_id = existing_attempt.proctored_exam.course_id course_id = existing_attempt.proctored_exam.course_id
content_id = existing_attempt.proctored_exam.content_id content_id = existing_attempt.proctored_exam.content_id
to_status = existing_attempt.status
existing_attempt.delete_exam_attempt() existing_attempt.delete_exam_attempt()
instructor_service = get_runtime_service('instructor') instructor_service = get_runtime_service('instructor')
if instructor_service: if instructor_service:
instructor_service.delete_student_attempt(username, course_id, content_id) instructor_service.delete_student_attempt(username, course_id, content_id)
# see if the status transition this changes credit requirement status
if ProctoredExamStudentAttemptStatus.needs_credit_status_update(to_status):
# trigger credit workflow, as needed
credit_service = get_runtime_service('credit')
credit_service.remove_credit_requirement_status(
user_id=user_id,
course_key_or_id=course_id,
req_namespace=u'proctored_exam',
req_name=content_id
)
def get_all_exams_for_course(course_id): def get_all_exams_for_course(course_id):
""" """
......
...@@ -487,6 +487,43 @@ class ProctoredExamApiTests(LoggedInTestCase): ...@@ -487,6 +487,43 @@ class ProctoredExamApiTests(LoggedInTestCase):
with self.assertRaises(StudentExamAttemptDoesNotExistsException): with self.assertRaises(StudentExamAttemptDoesNotExistsException):
remove_exam_attempt(proctored_exam_student_attempt.id) remove_exam_attempt(proctored_exam_student_attempt.id)
@ddt.data(
(ProctoredExamStudentAttemptStatus.verified, 'satisfied'),
(ProctoredExamStudentAttemptStatus.submitted, 'submitted'),
(ProctoredExamStudentAttemptStatus.error, 'failed')
)
@ddt.unpack
def test_remove_exam_attempt_with_status(self, to_status, requirement_status):
"""
Test to remove the exam attempt which calls
the Credit Service method `remove_credit_requirement_status`.
"""
exam_attempt = self._create_started_exam_attempt()
update_attempt_status(
exam_attempt.proctored_exam_id,
self.user.id,
to_status
)
# make sure the credit requirement status is there
credit_service = get_runtime_service('credit')
credit_status = credit_service.get_credit_state(self.user.id, exam_attempt.proctored_exam.course_id)
self.assertEqual(len(credit_status['credit_requirement_status']), 1)
self.assertEqual(
credit_status['credit_requirement_status'][0]['status'],
requirement_status
)
# now remove exam attempt which calls the credit service method 'remove_credit_requirement_status'
remove_exam_attempt(exam_attempt.proctored_exam_id)
# make sure the credit requirement status is no longer there
credit_status = credit_service.get_credit_state(self.user.id, exam_attempt.proctored_exam.course_id)
self.assertEqual(len(credit_status['credit_requirement_status']), 0)
def test_stop_a_non_started_exam(self): def test_stop_a_non_started_exam(self):
""" """
Stop an exam attempt that had not started yet. Stop an exam attempt that had not started yet.
......
...@@ -36,6 +36,7 @@ class MockCreditService(object): ...@@ -36,6 +36,7 @@ class MockCreditService(object):
return self.status return self.status
# pylint: disable=unused-argument
def set_credit_requirement_status(self, user_id, course_key_or_id, req_namespace, def set_credit_requirement_status(self, user_id, course_key_or_id, req_namespace,
req_name, status="satisfied", reason=None): req_name, status="satisfied", reason=None):
""" """
...@@ -61,6 +62,25 @@ class MockCreditService(object): ...@@ -61,6 +62,25 @@ class MockCreditService(object):
else: else:
found[0]['status'] = status found[0]['status'] = status
# pylint: disable=unused-argument
# pylint: disable=invalid-name
def remove_credit_requirement_status(self, user_id, course_key_or_id, req_namespace, req_name):
"""
Mock implementation for removing the credit requirement status.
"""
for requirement in self.status['credit_requirement_status']:
match = (
requirement['name'] == req_name and
requirement['namespace'] == req_namespace and
requirement['course_id'] == unicode(course_key_or_id)
)
if match:
self.status['credit_requirement_status'].remove(requirement)
break
return True
class MockInstructorService(object): class MockInstructorService(object):
""" """
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment