From 931ee10cf98e87bf234d6b971acb14cee002aecb Mon Sep 17 00:00:00 2001 From: Afzal Wali Date: Fri, 20 May 2016 18:47:59 +0500 Subject: [PATCH] Call into instructor service's method to create the zendesk ticket. --- edx_proctoring/backends/software_secure.py | 18 ++++++++++++++++++ .../backends/tests/test_software_secure.py | 3 ++- edx_proctoring/tests/test_services.py | 6 ++++++ setup.py | 2 +- 4 files changed, 27 insertions(+), 2 deletions(-) diff --git a/edx_proctoring/backends/software_secure.py b/edx_proctoring/backends/software_secure.py index d55ed92708f..49c55da82dc 100644 --- a/edx_proctoring/backends/software_secure.py +++ b/edx_proctoring/backends/software_secure.py @@ -24,6 +24,7 @@ ProctoredExamReviewAlreadyExists, ProctoredExamBadReviewStatus, ) +from edx_proctoring.runtime import get_runtime_service from edx_proctoring.utils import locate_attempt_by_attempt_code, emit_event from edx_proctoring. models import ( ProctoredExamSoftwareSecureReview, @@ -64,6 +65,7 @@ def __init__(self, organization, exam_sponsor, exam_register_endpoint, self.send_email = send_email self.passing_review_status = ['Clean', 'Rules Violation'] self.failing_review_status = ['Not Reviewed', 'Suspicious'] + self.notify_support_for_status = ['Suspicious'] def register_exam_attempt(self, exam, context): """ @@ -261,6 +263,8 @@ def on_review_callback(self, payload): exam = serialized_exam_object.data emit_event(exam, 'review_received', attempt=attempt, override_data=data) + self._create_zendesk_ticket(review, serialized_exam_object, serialized_attempt_obj) + def on_review_saved(self, review, allow_rejects=False): # pylint: disable=arguments-differ """ called when a review has been save - either through API (on_review_callback) or via Django Admin panel @@ -349,6 +353,20 @@ def _split_fullname(self, full_name): return (first_name, last_name) + def _create_zendesk_ticket(self, review, serialized_exam_object, serialized_attempt_obj): + """ + Creates a Zendesk ticket for reviews with status listed in self.notify_support_for_status + """ + if review.review_status in self.notify_support_for_status: + instructor_service = get_runtime_service('instructor') + if instructor_service: + instructor_service.send_support_notification( + course_id=serialized_exam_object["course_id"], + exam_name=serialized_exam_object["exam_name"], + student_username=serialized_attempt_obj["user"]["username"], + review_status=review.review_status + ) + def _get_payload(self, exam, context): """ Constructs the data payload that Software Secure expects diff --git a/edx_proctoring/backends/tests/test_software_secure.py b/edx_proctoring/backends/tests/test_software_secure.py index e0c7490767e..d27c25c627b 100644 --- a/edx_proctoring/backends/tests/test_software_secure.py +++ b/edx_proctoring/backends/tests/test_software_secure.py @@ -45,7 +45,7 @@ TEST_REVIEW_PAYLOAD ) -from edx_proctoring.tests.test_services import MockCreditService +from edx_proctoring.tests.test_services import MockCreditService, MockInstructorService from edx_proctoring.backends.software_secure import SOFTWARE_SECURE_INVALID_CHARS @@ -104,6 +104,7 @@ def setUp(self): self.user.save() set_runtime_service('credit', MockCreditService()) + set_runtime_service('instructor', MockInstructorService()) def tearDown(self): """ diff --git a/edx_proctoring/tests/test_services.py b/edx_proctoring/tests/test_services.py index 9a129d0d85f..a25e29d19cf 100644 --- a/edx_proctoring/tests/test_services.py +++ b/edx_proctoring/tests/test_services.py @@ -128,6 +128,12 @@ def is_course_staff(self, user, course_id): """ return self.is_user_course_staff + def send_support_notification(self, course_id, exam_name, student_username, review_status): + """ + Mocked implementation of send_support_notification + """ + pass + class TestProctoringService(unittest.TestCase): """ diff --git a/setup.py b/setup.py index c1f33bff2e6..920442b5dd4 100755 --- a/setup.py +++ b/setup.py @@ -34,7 +34,7 @@ def load_requirements(*requirements_paths): setup( name='edx-proctoring', - version='0.12.17', + version='0.12.18', description='Proctoring subsystem for Open edX', long_description=open('README.md').read(), author='edX',