Skip to content

Commit 13f398f

Browse files
author
Douglas Hall
committed
Merge pull request #290 from edx/afzaledx/sol-1802_zendesk_tickets_for_suspicious_proctored_attempts
(WIP) SOL-1802 Create Zendesk ticket when "Suspicious" proctored exam reviews are received from the proctoring provider
2 parents f5df57f + 931ee10 commit 13f398f

File tree

4 files changed

+27
-2
lines changed

4 files changed

+27
-2
lines changed

edx_proctoring/backends/software_secure.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
ProctoredExamReviewAlreadyExists,
2525
ProctoredExamBadReviewStatus,
2626
)
27+
from edx_proctoring.runtime import get_runtime_service
2728
from edx_proctoring.utils import locate_attempt_by_attempt_code, emit_event
2829
from edx_proctoring. models import (
2930
ProctoredExamSoftwareSecureReview,
@@ -64,6 +65,7 @@ def __init__(self, organization, exam_sponsor, exam_register_endpoint,
6465
self.send_email = send_email
6566
self.passing_review_status = ['Clean', 'Rules Violation']
6667
self.failing_review_status = ['Not Reviewed', 'Suspicious']
68+
self.notify_support_for_status = ['Suspicious']
6769

6870
def register_exam_attempt(self, exam, context):
6971
"""
@@ -261,6 +263,8 @@ def on_review_callback(self, payload):
261263
exam = serialized_exam_object.data
262264
emit_event(exam, 'review_received', attempt=attempt, override_data=data)
263265

266+
self._create_zendesk_ticket(review, serialized_exam_object, serialized_attempt_obj)
267+
264268
def on_review_saved(self, review, allow_rejects=False): # pylint: disable=arguments-differ
265269
"""
266270
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):
349353

350354
return (first_name, last_name)
351355

356+
def _create_zendesk_ticket(self, review, serialized_exam_object, serialized_attempt_obj):
357+
"""
358+
Creates a Zendesk ticket for reviews with status listed in self.notify_support_for_status
359+
"""
360+
if review.review_status in self.notify_support_for_status:
361+
instructor_service = get_runtime_service('instructor')
362+
if instructor_service:
363+
instructor_service.send_support_notification(
364+
course_id=serialized_exam_object["course_id"],
365+
exam_name=serialized_exam_object["exam_name"],
366+
student_username=serialized_attempt_obj["user"]["username"],
367+
review_status=review.review_status
368+
)
369+
352370
def _get_payload(self, exam, context):
353371
"""
354372
Constructs the data payload that Software Secure expects

edx_proctoring/backends/tests/test_software_secure.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
TEST_REVIEW_PAYLOAD
4646
)
4747

48-
from edx_proctoring.tests.test_services import MockCreditService
48+
from edx_proctoring.tests.test_services import MockCreditService, MockInstructorService
4949
from edx_proctoring.backends.software_secure import SOFTWARE_SECURE_INVALID_CHARS
5050

5151

@@ -104,6 +104,7 @@ def setUp(self):
104104
self.user.save()
105105

106106
set_runtime_service('credit', MockCreditService())
107+
set_runtime_service('instructor', MockInstructorService())
107108

108109
def tearDown(self):
109110
"""

edx_proctoring/tests/test_services.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,12 @@ def is_course_staff(self, user, course_id):
128128
"""
129129
return self.is_user_course_staff
130130

131+
def send_support_notification(self, course_id, exam_name, student_username, review_status):
132+
"""
133+
Mocked implementation of send_support_notification
134+
"""
135+
pass
136+
131137

132138
class TestProctoringService(unittest.TestCase):
133139
"""

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ def load_requirements(*requirements_paths):
3434

3535
setup(
3636
name='edx-proctoring',
37-
version='0.12.17',
37+
version='0.12.18',
3838
description='Proctoring subsystem for Open edX',
3939
long_description=open('README.md').read(),
4040
author='edX',

0 commit comments

Comments
 (0)