Skip to content

Commit 42acb53

Browse files
feat!: remove "Create Zendesk Tickets for suspicious attempts" setting from Proctored Exam Settings (#2517)
BREAKING CHANGE: This PR removes the deprecated “Create Zendesk Tickets for suspicious attempts” setting from the Proctored Exam Settings modal in the frontend-app-authoring MFE. This option was previously used with PSI and Zendesk to generate support tickets for suspicious exam attempts. Since both systems are retired, the setting no longer serves a purpose and has been fully removed. Part of: openedx/edx-platform#36329
1 parent 225c82d commit 42acb53

File tree

6 files changed

+3
-115
lines changed

6 files changed

+3
-115
lines changed

README.rst

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -175,10 +175,6 @@ Feature: New Proctoring Exams View
175175
Requirements
176176
------------
177177

178-
* ``edx-platform`` Django settings:
179-
180-
* ``ZENDESK_*``: necessary if automatic ZenDesk ticket creation is desired
181-
182178
* `edx-exams <https://github.com/edx/edx-exams>`_: for this feature to work, the ``edx-exams`` IDA must be deployed and its API accessible by the browser
183179

184180
Configuration
@@ -196,7 +192,6 @@ In Studio, a new item ("Proctored Exam Settings") is added to "Other Course Sett
196192
* Enable proctored exams for the course
197193
* Allow opting out of proctored exams
198194
* Select a proctoring provider
199-
* Enable automatic creation of Zendesk tickets for "suspicious" proctored exam attempts
200195

201196
Feature: Advanced Settings
202197
==========================

plugins/course-apps/proctoring/Settings.jsx

Lines changed: 1 addition & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ const ProctoringSettings = ({ onClose }) => {
3333
proctoringProvider: false,
3434
escalationEmail: '',
3535
allowOptingOut: false,
36-
createZendeskTickets: false,
3736
};
3837
const [formValues, setFormValues] = useState(initialFormValues);
3938
const [loading, setLoading] = useState(true);
@@ -80,12 +79,11 @@ const ProctoringSettings = ({ onClose }) => {
8079
const value = target.type === 'checkbox' ? target.checked : target.value;
8180
const { name } = target;
8281

83-
if (['allowOptingOut', 'createZendeskTickets'].includes(name)) {
82+
if (['allowOptingOut'].includes(name)) {
8483
// Form.Radio expects string values, so convert back to a boolean here
8584
setFormValues({ ...formValues, [name]: value === 'true' });
8685
} else if (name === 'proctoringProvider') {
8786
const newFormValues = { ...formValues, proctoringProvider: value };
88-
8987
if (requiresEscalationEmailProviders.includes(value)) {
9088
setFormValues({ ...newFormValues });
9189
setShowEscalationEmail(true);
@@ -115,7 +113,6 @@ const ProctoringSettings = ({ onClose }) => {
115113
enable_proctored_exams: formValues.enableProctoredExams,
116114
// lti providers are managed outside edx-platform, lti_external indicates this
117115
proctoring_provider: isLtiProviderSelected ? 'lti_external' : selectedProvider,
118-
create_zendesk_tickets: formValues.createZendeskTickets,
119116
},
120117
};
121118
if (isEdxStaff) {
@@ -386,29 +383,6 @@ const ProctoringSettings = ({ onClose }) => {
386383
</Form.Group>
387384
</fieldset>
388385
)}
389-
390-
{/* CREATE ZENDESK TICKETS */}
391-
{ isEdxStaff && formValues.enableProctoredExams && !isLtiProviderSelected && (
392-
<fieldset aria-describedby="createZendeskTicketsText">
393-
<Form.Group controlId="formCreateZendeskTickets">
394-
<Form.Label as="legend" className="font-weight-bold">
395-
{intl.formatMessage(messages['authoring.proctoring.createzendesk.label'])}
396-
</Form.Label>
397-
<Form.RadioSet
398-
name="createZendeskTickets"
399-
value={formValues.createZendeskTickets.toString()}
400-
onChange={handleChange}
401-
>
402-
<Form.Radio value="true" data-testid="createZendeskTicketsYes">
403-
{intl.formatMessage(messages['authoring.proctoring.yes'])}
404-
</Form.Radio>
405-
<Form.Radio value="false" data-testid="createZendeskTicketsNo">
406-
{intl.formatMessage(messages['authoring.proctoring.no'])}
407-
</Form.Radio>
408-
</Form.RadioSet>
409-
</Form.Group>
410-
</fieldset>
411-
)}
412386
</>
413387
);
414388
}
@@ -571,7 +545,6 @@ const ProctoringSettings = ({ onClose }) => {
571545
proctoringProvider: selectedProvider,
572546
enableProctoredExams: proctoredExamSettings.enable_proctored_exams,
573547
allowOptingOut: proctoredExamSettings.allow_proctoring_opt_out,
574-
createZendeskTickets: proctoredExamSettings.create_zendesk_tickets,
575548
// The backend API may return null for the proctoringEscalationEmail value, which is the default.
576549
// In order to keep our email input component controlled, we use the empty string as the default
577550
// and perform this conversion during GETs and POSTs.

plugins/course-apps/proctoring/Settings.test.jsx

Lines changed: 2 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,6 @@ describe('ProctoredExamSettings', () => {
7878
allow_proctoring_opt_out: false,
7979
proctoring_provider: 'mockproc',
8080
proctoring_escalation_email: '[email protected]',
81-
create_zendesk_tickets: true,
8281
},
8382
available_proctoring_providers: ['software_secure', 'mockproc', 'lti_external'],
8483
requires_escalation_email_providers: ['test_lti'],
@@ -95,36 +94,6 @@ describe('ProctoredExamSettings', () => {
9594
await act(async () => render(renderComponent(<ProctoredExamSettings {...defaultProps} />)));
9695
});
9796

98-
it('Updates Zendesk ticket field if software_secure is provider', async () => {
99-
await waitFor(() => {
100-
screen.getByDisplayValue('mockproc');
101-
});
102-
const selectElement = screen.getByDisplayValue('mockproc');
103-
fireEvent.change(selectElement, { target: { value: 'software_secure' } });
104-
const zendeskTicketInput = screen.getByTestId('createZendeskTicketsYes');
105-
expect(zendeskTicketInput.checked).toEqual(true);
106-
});
107-
108-
it('Updates Zendesk ticket field if software_secure is provider', async () => {
109-
await waitFor(() => {
110-
screen.getByDisplayValue('mockproc');
111-
});
112-
const selectElement = screen.getByDisplayValue('mockproc');
113-
fireEvent.change(selectElement, { target: { value: 'software_secure' } });
114-
const zendeskTicketInput = screen.getByTestId('createZendeskTicketsYes');
115-
expect(zendeskTicketInput.checked).toEqual(true);
116-
});
117-
118-
it('Does not update zendesk ticket field for any other provider', async () => {
119-
await waitFor(() => {
120-
screen.getByDisplayValue('mockproc');
121-
});
122-
const selectElement = screen.getByDisplayValue('mockproc');
123-
fireEvent.change(selectElement, { target: { value: 'mockproc' } });
124-
const zendeskTicketInput = screen.getByTestId('createZendeskTicketsYes');
125-
expect(zendeskTicketInput.checked).toEqual(true);
126-
});
127-
12897
it('Hides all other fields when enabledProctorExam is false when first loaded', async () => {
12998
cleanup();
13099
// Overrides the handler defined in beforeEach.
@@ -136,7 +105,6 @@ describe('ProctoredExamSettings', () => {
136105
allow_proctoring_opt_out: false,
137106
proctoring_provider: 'mockproc',
138107
proctoring_escalation_email: '[email protected]',
139-
create_zendesk_tickets: true,
140108
},
141109
available_proctoring_providers: ['software_secure', 'mockproc'],
142110
requires_escalation_email_providers: [],
@@ -152,8 +120,6 @@ describe('ProctoredExamSettings', () => {
152120
expect(screen.queryByText('Allow Opting Out of Proctored Exams')).toBeNull();
153121
expect(screen.queryByDisplayValue('mockproc')).toBeNull();
154122
expect(screen.queryByTestId('escalationEmail')).toBeNull();
155-
expect(screen.queryByTestId('createZendeskTicketsYes')).toBeNull();
156-
expect(screen.queryByTestId('createZendeskTicketsNo')).toBeNull();
157123
});
158124

159125
it('Hides all other fields when enableProctoredExams toggled to false', async () => {
@@ -163,8 +129,6 @@ describe('ProctoredExamSettings', () => {
163129
expect(screen.queryByText('Allow opting out of proctored exams')).toBeDefined();
164130
expect(screen.queryByDisplayValue('mockproc')).toBeDefined();
165131
expect(screen.queryByTestId('escalationEmail')).toBeDefined();
166-
expect(screen.queryByTestId('createZendeskTicketsYes')).toBeDefined();
167-
expect(screen.queryByTestId('createZendeskTicketsNo')).toBeDefined();
168132

169133
let enabledProctoredExamCheck = screen.getAllByLabelText('Proctored exams', { exact: false })[0];
170134
expect(enabledProctoredExamCheck.checked).toEqual(true);
@@ -174,8 +138,6 @@ describe('ProctoredExamSettings', () => {
174138
expect(screen.queryByText('Allow opting out of proctored exams')).toBeNull();
175139
expect(screen.queryByDisplayValue('mockproc')).toBeNull();
176140
expect(screen.queryByTestId('escalationEmail')).toBeNull();
177-
expect(screen.queryByTestId('createZendeskTicketsYes')).toBeNull();
178-
expect(screen.queryByTestId('createZendeskTicketsNo')).toBeNull();
179141
});
180142

181143
it('Hides unsupported fields when lti provider is selected', async () => {
@@ -185,8 +147,6 @@ describe('ProctoredExamSettings', () => {
185147
const selectElement = screen.getByDisplayValue('mockproc');
186148
fireEvent.change(selectElement, { target: { value: 'test_lti' } });
187149
expect(screen.queryByTestId('allowOptingOutRadio')).toBeNull();
188-
expect(screen.queryByTestId('createZendeskTicketsYes')).toBeNull();
189-
expect(screen.queryByTestId('createZendeskTicketsNo')).toBeNull();
190150
});
191151
});
192152

@@ -202,7 +162,6 @@ describe('ProctoredExamSettings', () => {
202162
allow_proctoring_opt_out: false,
203163
proctoring_provider: 'lti_external',
204164
proctoring_escalation_email: '[email protected]',
205-
create_zendesk_tickets: true,
206165
},
207166
available_proctoring_providers: ['software_secure', 'mockproc', 'lti_external'],
208167
requires_escalation_email_providers: ['test_lti'],
@@ -382,7 +341,6 @@ describe('ProctoredExamSettings', () => {
382341
allow_proctoring_opt_out: false,
383342
proctoring_provider: 'mockproc',
384343
proctoring_escalation_email: '[email protected]',
385-
create_zendesk_tickets: true,
386344
},
387345
available_proctoring_providers: ['software_secure', 'mockproc'],
388346
requires_escalation_email_providers: [],
@@ -395,7 +353,6 @@ describe('ProctoredExamSettings', () => {
395353
allow_proctoring_opt_out: false,
396354
proctoring_provider: 'mockproc',
397355
proctoring_escalation_email: '[email protected]',
398-
create_zendesk_tickets: true,
399356
},
400357
available_proctoring_providers: ['software_secure', 'mockproc'],
401358
requires_escalation_email_providers: [],
@@ -529,18 +486,16 @@ describe('ProctoredExamSettings', () => {
529486
});
530487

531488
describe('Toggles field visibility based on user permissions', () => {
532-
it('Hides opting out and zendesk tickets for non edX staff', async () => {
489+
it('Hides opting out for non edX staff', async () => {
533490
setupApp(false);
534491
await act(async () => render(renderComponent(<ProctoredExamSettings {...defaultProps} />)));
535492
expect(screen.queryByTestId('allowOptingOutYes')).toBeNull();
536-
expect(screen.queryByTestId('createZendeskTicketsYes')).toBeNull();
537493
});
538494

539-
it('Shows opting out and zendesk tickets for edX staff', async () => {
495+
it('Shows opting out for edX staff', async () => {
540496
setupApp(true);
541497
await act(async () => render(renderComponent(<ProctoredExamSettings {...defaultProps} />)));
542498
expect(screen.queryByTestId('allowOptingOutYes')).not.toBeNull();
543-
expect(screen.queryByTestId('createZendeskTicketsYes')).not.toBeNull();
544499
});
545500
});
546501

@@ -618,7 +573,6 @@ describe('ProctoredExamSettings', () => {
618573
allow_proctoring_opt_out: false,
619574
proctoring_provider: 'mockproc',
620575
proctoring_escalation_email: '[email protected]',
621-
create_zendesk_tickets: true,
622576
},
623577
available_proctoring_providers: ['software_secure', 'mockproc', 'lti_external'],
624578
requires_escalation_email_providers: ['test_lti'],
@@ -642,7 +596,6 @@ describe('ProctoredExamSettings', () => {
642596
allow_proctoring_opt_out: false,
643597
proctoring_provider: 'lti_external',
644598
proctoring_escalation_email: '[email protected]',
645-
create_zendesk_tickets: true,
646599
},
647600
});
648601
expect(axiosMock.history.patch.length).toBe(1);
@@ -674,7 +627,6 @@ describe('ProctoredExamSettings', () => {
674627
enable_proctored_exams: true,
675628
allow_proctoring_opt_out: false,
676629
proctoring_provider: 'mockproc',
677-
create_zendesk_tickets: true,
678630
},
679631
});
680632

@@ -716,7 +668,6 @@ describe('ProctoredExamSettings', () => {
716668
allow_proctoring_opt_out: false,
717669
proctoring_provider: 'lti_external',
718670
proctoring_escalation_email: '[email protected]',
719-
create_zendesk_tickets: true,
720671
},
721672
});
722673

@@ -746,7 +697,6 @@ describe('ProctoredExamSettings', () => {
746697
enable_proctored_exams: true,
747698
allow_proctoring_opt_out: false,
748699
proctoring_provider: 'mockproc',
749-
create_zendesk_tickets: true,
750700
},
751701
});
752702

@@ -768,7 +718,6 @@ describe('ProctoredExamSettings', () => {
768718
allow_proctoring_opt_out: false,
769719
proctoring_provider: 'mockproc',
770720
proctoring_escalation_email: '[email protected]',
771-
create_zendesk_tickets: true,
772721
},
773722
available_proctoring_providers: ['software_secure', 'mockproc'],
774723
requires_escalation_email_providers: [],
@@ -787,7 +736,6 @@ describe('ProctoredExamSettings', () => {
787736
enable_proctored_exams: true,
788737
allow_proctoring_opt_out: false,
789738
proctoring_provider: 'mockproc',
790-
create_zendesk_tickets: true,
791739
},
792740
});
793741

@@ -887,26 +835,5 @@ describe('ProctoredExamSettings', () => {
887835
expect(document.activeElement).toEqual(successAlert);
888836
});
889837
});
890-
891-
it('Include Zendesk ticket in post request if user is not an admin', async () => {
892-
// use non-admin user for test
893-
const isAdmin = false;
894-
setupApp(isAdmin);
895-
896-
await act(async () => render(renderComponent(<ProctoredExamSettings {...defaultProps} />)));
897-
// Make a change to the proctoring provider
898-
const selectElement = screen.getByDisplayValue('mockproc');
899-
fireEvent.change(selectElement, { target: { value: 'software_secure' } });
900-
const submitButton = screen.getByTestId('submissionButton');
901-
fireEvent.click(submitButton);
902-
expect(axiosMock.history.post.length).toBe(1);
903-
expect(JSON.parse(axiosMock.history.post[0].data)).toEqual({
904-
proctored_exam_settings: {
905-
enable_proctored_exams: true,
906-
proctoring_provider: 'software_secure',
907-
create_zendesk_tickets: true,
908-
},
909-
});
910-
});
911838
});
912839
});

plugins/course-apps/proctoring/messages.js

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -81,11 +81,6 @@ const messages = defineMessages({
8181
defaultMessage: 'Allow learners to opt out of proctoring on proctored exams',
8282
description: 'Label for radio selection allowing proctored exam opt out',
8383
},
84-
'authoring.proctoring.createzendesk.label': {
85-
id: 'authoring.proctoring.createzendesk.label',
86-
defaultMessage: 'Create Zendesk tickets for suspicious attempts',
87-
description: 'Label for Zendesk ticket creation radio select.',
88-
},
8984
'authoring.proctoring.error.single': {
9085
id: 'authoring.proctoring.error.single',
9186
defaultMessage: 'There is 1 error in this form.',

src/course-outline/__mocks__/courseOutlineIndex.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,6 @@ module.exports = {
6262
highlightsPreviewOnly: false,
6363
highlightsDocUrl: 'https://docs.openedx.org/en/latest/educators/how-tos/course_development/manage_course_highlight_emails.html',
6464
enableProctoredExams: true,
65-
createZendeskTickets: true,
6665
enableTimedExams: true,
6766
childInfo: {
6867
category: 'chapter',

src/course-unit/__mocks__/courseSectionVertical.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1405,7 +1405,6 @@ module.exports = {
14051405
highlights_preview_only: false,
14061406
highlights_doc_url: 'https://docs.openedx.org/en/latest/educators/how-tos/course_development/manage_course_highlight_emails.html',
14071407
enable_proctored_exams: false,
1408-
create_zendesk_tickets: true,
14091408
enable_timed_exams: true,
14101409
ancestor_has_staff_lock: false,
14111410
user_partition_info: {

0 commit comments

Comments
 (0)