Skip to content

Commit 15d55ac

Browse files
Merge pull request #78 from edx/remove-zendesk-proctoring-setting
Remove "Create Zendesk tickets for suspicious attempts" from Proctoring Settings
2 parents 0384773 + 3b06ea7 commit 15d55ac

6 files changed

Lines changed: 9 additions & 97 deletions

File tree

README.rst

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ Troubleshooting
9797
9898
* If tutor-mfe is not starting the authoring MFE in development mode (eg. `tutor dev start authoring` fails), it may be due to
9999
using a tutor version that expects the MFE name to be frontend-app-course-authoring (the previous name of this repo). To fix
100-
this, you can rename the cloned repo directory to frontend-app-course-authoring. More information can be found in
100+
this, you can rename the cloned repo directory to frontend-app-course-authoring. More information can be found in
101101
`this forum post <https://discuss.openedx.org/t/repo-rename-frontend-app-course-authoring-frontend-app-authoring/13930/2>`__.
102102

103103

@@ -177,8 +177,6 @@ Requirements
177177

178178
* ``edx-platform`` Django settings:
179179

180-
* ``ZENDESK_*``: necessary if automatic ZenDesk ticket creation is desired
181-
182180
* `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
183181

184182
Configuration
@@ -196,7 +194,6 @@ In Studio, a new item ("Proctored Exam Settings") is added to "Other Course Sett
196194
* Enable proctored exams for the course
197195
* Allow opting out of proctored exams
198196
* Select a proctoring provider
199-
* Enable automatic creation of Zendesk tickets for "suspicious" proctored exam attempts
200197

201198
Feature: Advanced Settings
202199
==========================
@@ -239,7 +236,7 @@ Configuration
239236

240237
In additional to the standard settings, the following local configuration items are required:
241238

242-
* ``ENABLE_TAGGING_TAXONOMY_PAGES``: must be enabled (which it is by default) in order to actually enable/show the new
239+
* ``ENABLE_TAGGING_TAXONOMY_PAGES``: must be enabled (which it is by default) in order to actually enable/show the new
243240
Tagging/Taxonomy functionality.
244241

245242

@@ -273,7 +270,7 @@ Troubleshooting
273270
========================
274271

275272
* ``npm ERR! gyp ERR! build error`` while running npm install on Macs with M1 processors: Probably due to a compatibility issue of node-canvas with M1.
276-
273+
277274
Run ``brew install pkg-config pixman cairo pango libpng jpeg giflib librsvg`` before ``npm install`` to get the correct versions of the dependencies.
278275
If there is still an error, look for "no package [...] found" in the error message and install missing package via brew.
279276
(https://github.com/Automattic/node-canvas/issues/1733)

plugins/course-apps/proctoring/Settings.jsx

Lines changed: 3 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ const ProctoringSettings = ({ onClose }) => {
3232
proctoringProvider: false,
3333
escalationEmail: '',
3434
allowOptingOut: false,
35-
createZendeskTickets: false,
3635
};
3736
const [formValues, setFormValues] = useState(initialFormValues);
3837
const [loading, setLoading] = useState(true);
@@ -78,17 +77,17 @@ const ProctoringSettings = ({ onClose }) => {
7877
const value = target.type === 'checkbox' ? target.checked : target.value;
7978
const { name } = target;
8079

81-
if (['allowOptingOut', 'createZendeskTickets'].includes(name)) {
80+
if (name === 'allowOptingOut') {
8281
// Form.Radio expects string values, so convert back to a boolean here
8382
setFormValues({ ...formValues, [name]: value === 'true' });
8483
} else if (name === 'proctoringProvider') {
8584
const newFormValues = { ...formValues, proctoringProvider: value };
8685

8786
if (value === 'proctortrack') {
88-
setFormValues({ ...newFormValues, createZendeskTickets: false });
87+
setFormValues(newFormValues);
8988
setShowEscalationEmail(true);
9089
} else if (value === 'software_secure') {
91-
setFormValues({ ...newFormValues, createZendeskTickets: true });
90+
setFormValues(newFormValues);
9291
setShowEscalationEmail(false);
9392
} else if (isLtiProvider(value)) {
9493
setFormValues(newFormValues);
@@ -116,7 +115,6 @@ const ProctoringSettings = ({ onClose }) => {
116115
enable_proctored_exams: formValues.enableProctoredExams,
117116
// lti providers are managed outside edx-platform, lti_external indicates this
118117
proctoring_provider: isLtiProviderSelected ? 'lti_external' : selectedProvider,
119-
create_zendesk_tickets: formValues.createZendeskTickets,
120118
},
121119
};
122120
if (isEdxStaff) {
@@ -387,29 +385,6 @@ const ProctoringSettings = ({ onClose }) => {
387385
</Form.Group>
388386
</fieldset>
389387
)}
390-
391-
{/* CREATE ZENDESK TICKETS */}
392-
{ isEdxStaff && formValues.enableProctoredExams && !isLtiProviderSelected && (
393-
<fieldset aria-describedby="createZendeskTicketsText">
394-
<Form.Group controlId="formCreateZendeskTickets">
395-
<Form.Label as="legend" className="font-weight-bold">
396-
{intl.formatMessage(messages['authoring.proctoring.createzendesk.label'])}
397-
</Form.Label>
398-
<Form.RadioSet
399-
name="createZendeskTickets"
400-
value={formValues.createZendeskTickets.toString()}
401-
onChange={handleChange}
402-
>
403-
<Form.Radio value="true" data-testid="createZendeskTicketsYes">
404-
{intl.formatMessage(messages['authoring.proctoring.yes'])}
405-
</Form.Radio>
406-
<Form.Radio value="false" data-testid="createZendeskTicketsNo">
407-
{intl.formatMessage(messages['authoring.proctoring.no'])}
408-
</Form.Radio>
409-
</Form.RadioSet>
410-
</Form.Group>
411-
</fieldset>
412-
)}
413388
</>
414389
);
415390
}
@@ -570,7 +545,6 @@ const ProctoringSettings = ({ onClose }) => {
570545
proctoringProvider: selectedProvider,
571546
enableProctoredExams: proctoredExamSettings.enable_proctored_exams,
572547
allowOptingOut: proctoredExamSettings.allow_proctoring_opt_out,
573-
createZendeskTickets: proctoredExamSettings.create_zendesk_tickets,
574548
// The backend API may return null for the proctoringEscalationEmail value, which is the default.
575549
// In order to keep our email input component controlled, we use the empty string as the default
576550
// and perform this conversion during GETs and POSTs.

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

Lines changed: 3 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,6 @@ describe('ProctoredExamSettings', () => {
8585
allow_proctoring_opt_out: false,
8686
proctoring_provider: 'mockproc',
8787
proctoring_escalation_email: '[email protected]',
88-
create_zendesk_tickets: true,
8988
},
9089
available_proctoring_providers: ['software_secure', 'proctortrack', 'mockproc', 'lti_external'],
9190
course_start_date: '2070-01-01T00:00:00Z',
@@ -105,36 +104,6 @@ describe('ProctoredExamSettings', () => {
105104
await act(async () => render(intlWrapper(<IntlProctoredExamSettings {...defaultProps} />)));
106105
});
107106

108-
it('Updates Zendesk ticket field if proctortrack is provider', async () => {
109-
await waitFor(() => {
110-
screen.getByDisplayValue('mockproc');
111-
});
112-
const selectElement = screen.getByDisplayValue('mockproc');
113-
fireEvent.change(selectElement, { target: { value: 'proctortrack' } });
114-
const zendeskTicketInput = screen.getByTestId('createZendeskTicketsNo');
115-
expect(zendeskTicketInput.checked).toEqual(true);
116-
});
117-
118-
it('Updates Zendesk ticket field if software_secure is provider', async () => {
119-
await waitFor(() => {
120-
screen.getByDisplayValue('mockproc');
121-
});
122-
const selectElement = screen.getByDisplayValue('mockproc');
123-
fireEvent.change(selectElement, { target: { value: 'software_secure' } });
124-
const zendeskTicketInput = screen.getByTestId('createZendeskTicketsYes');
125-
expect(zendeskTicketInput.checked).toEqual(true);
126-
});
127-
128-
it('Does not update zendesk ticket field for any other provider', async () => {
129-
await waitFor(() => {
130-
screen.getByDisplayValue('mockproc');
131-
});
132-
const selectElement = screen.getByDisplayValue('mockproc');
133-
fireEvent.change(selectElement, { target: { value: 'mockproc' } });
134-
const zendeskTicketInput = screen.getByTestId('createZendeskTicketsYes');
135-
expect(zendeskTicketInput.checked).toEqual(true);
136-
});
137-
138107
it('Hides all other fields when enabledProctorExam is false when first loaded', async () => {
139108
cleanup();
140109
// Overrides the handler defined in beforeEach.
@@ -146,7 +115,6 @@ describe('ProctoredExamSettings', () => {
146115
allow_proctoring_opt_out: false,
147116
proctoring_provider: 'mockproc',
148117
proctoring_escalation_email: '[email protected]',
149-
create_zendesk_tickets: true,
150118
},
151119
available_proctoring_providers: ['software_secure', 'proctortrack', 'mockproc'],
152120
course_start_date: '2070-01-01T00:00:00Z',
@@ -161,8 +129,6 @@ describe('ProctoredExamSettings', () => {
161129
expect(screen.queryByText('Allow Opting Out of Proctored Exams')).toBeNull();
162130
expect(screen.queryByDisplayValue('mockproc')).toBeNull();
163131
expect(screen.queryByTestId('escalationEmail')).toBeNull();
164-
expect(screen.queryByTestId('createZendeskTicketsYes')).toBeNull();
165-
expect(screen.queryByTestId('createZendeskTicketsNo')).toBeNull();
166132
});
167133

168134
it('Hides all other fields when enableProctoredExams toggled to false', async () => {
@@ -172,8 +138,6 @@ describe('ProctoredExamSettings', () => {
172138
expect(screen.queryByText('Allow opting out of proctored exams')).toBeDefined();
173139
expect(screen.queryByDisplayValue('mockproc')).toBeDefined();
174140
expect(screen.queryByTestId('escalationEmail')).toBeDefined();
175-
expect(screen.queryByTestId('createZendeskTicketsYes')).toBeDefined();
176-
expect(screen.queryByTestId('createZendeskTicketsNo')).toBeDefined();
177141

178142
let enabledProctoredExamCheck = screen.getAllByLabelText('Proctored exams', { exact: false })[0];
179143
expect(enabledProctoredExamCheck.checked).toEqual(true);
@@ -183,8 +147,6 @@ describe('ProctoredExamSettings', () => {
183147
expect(screen.queryByText('Allow opting out of proctored exams')).toBeNull();
184148
expect(screen.queryByDisplayValue('mockproc')).toBeNull();
185149
expect(screen.queryByTestId('escalationEmail')).toBeNull();
186-
expect(screen.queryByTestId('createZendeskTicketsYes')).toBeNull();
187-
expect(screen.queryByTestId('createZendeskTicketsNo')).toBeNull();
188150
});
189151

190152
it('Hides unsupported fields when lti provider is selected', async () => {
@@ -194,8 +156,6 @@ describe('ProctoredExamSettings', () => {
194156
const selectElement = screen.getByDisplayValue('mockproc');
195157
fireEvent.change(selectElement, { target: { value: 'test_lti' } });
196158
expect(screen.queryByTestId('allowOptingOutRadio')).toBeNull();
197-
expect(screen.queryByTestId('createZendeskTicketsYes')).toBeNull();
198-
expect(screen.queryByTestId('createZendeskTicketsNo')).toBeNull();
199159
});
200160
});
201161

@@ -211,7 +171,6 @@ describe('ProctoredExamSettings', () => {
211171
allow_proctoring_opt_out: false,
212172
proctoring_provider: 'proctortrack',
213173
proctoring_escalation_email: '[email protected]',
214-
create_zendesk_tickets: true,
215174
},
216175
available_proctoring_providers: ['software_secure', 'proctortrack', 'mockproc', 'lti_external'],
217176
course_start_date: '2070-01-01T00:00:00Z',
@@ -383,7 +342,6 @@ describe('ProctoredExamSettings', () => {
383342
allow_proctoring_opt_out: false,
384343
proctoring_provider: 'mockproc',
385344
proctoring_escalation_email: '[email protected]',
386-
create_zendesk_tickets: true,
387345
},
388346
available_proctoring_providers: ['software_secure', 'proctortrack', 'mockproc'],
389347
course_start_date: '2099-01-01T00:00:00Z',
@@ -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', 'proctortrack', 'mockproc'],
401358
course_start_date: '2013-01-01T00:00:00Z',
@@ -527,18 +484,16 @@ describe('ProctoredExamSettings', () => {
527484
});
528485

529486
describe('Toggles field visibility based on user permissions', () => {
530-
it('Hides opting out and zendesk tickets for non edX staff', async () => {
487+
it('Hides opting out for non edX staff', async () => {
531488
setupApp(false);
532489
await act(async () => render(intlWrapper(<IntlProctoredExamSettings {...defaultProps} />)));
533490
expect(screen.queryByTestId('allowOptingOutYes')).toBeNull();
534-
expect(screen.queryByTestId('createZendeskTicketsYes')).toBeNull();
535491
});
536492

537-
it('Shows opting out and zendesk tickets for edX staff', async () => {
493+
it('Shows opting out for edX staff', async () => {
538494
setupApp(true);
539495
await act(async () => render(intlWrapper(<IntlProctoredExamSettings {...defaultProps} />)));
540496
expect(screen.queryByTestId('allowOptingOutYes')).not.toBeNull();
541-
expect(screen.queryByTestId('createZendeskTicketsYes')).not.toBeNull();
542497
});
543498
});
544499

@@ -624,7 +579,6 @@ describe('ProctoredExamSettings', () => {
624579
allow_proctoring_opt_out: false,
625580
proctoring_provider: 'proctortrack',
626581
proctoring_escalation_email: '[email protected]',
627-
create_zendesk_tickets: false,
628582
},
629583
});
630584

@@ -651,7 +605,6 @@ describe('ProctoredExamSettings', () => {
651605
enable_proctored_exams: true,
652606
allow_proctoring_opt_out: false,
653607
proctoring_provider: 'mockproc',
654-
create_zendesk_tickets: true,
655608
},
656609
});
657610

@@ -692,7 +645,6 @@ describe('ProctoredExamSettings', () => {
692645
enable_proctored_exams: true,
693646
allow_proctoring_opt_out: false,
694647
proctoring_provider: 'lti_external',
695-
create_zendesk_tickets: true,
696648
},
697649
});
698650

@@ -722,7 +674,6 @@ describe('ProctoredExamSettings', () => {
722674
enable_proctored_exams: true,
723675
allow_proctoring_opt_out: false,
724676
proctoring_provider: 'mockproc',
725-
create_zendesk_tickets: true,
726677
},
727678
});
728679

@@ -744,7 +695,6 @@ describe('ProctoredExamSettings', () => {
744695
allow_proctoring_opt_out: false,
745696
proctoring_provider: 'mockproc',
746697
proctoring_escalation_email: '[email protected]',
747-
create_zendesk_tickets: true,
748698
},
749699
available_proctoring_providers: ['software_secure', 'proctortrack', 'mockproc'],
750700
course_start_date: '2070-01-01T00:00:00Z',
@@ -762,7 +712,6 @@ describe('ProctoredExamSettings', () => {
762712
enable_proctored_exams: true,
763713
allow_proctoring_opt_out: false,
764714
proctoring_provider: 'mockproc',
765-
create_zendesk_tickets: true,
766715
},
767716
});
768717

@@ -863,7 +812,7 @@ describe('ProctoredExamSettings', () => {
863812
});
864813
});
865814

866-
it('Include Zendesk ticket in post request if user is not an admin', async () => {
815+
it('Posts valid payload if user is not an admin', async () => {
867816
// use non-admin user for test
868817
const isAdmin = false;
869818
setupApp(isAdmin);
@@ -880,7 +829,6 @@ describe('ProctoredExamSettings', () => {
880829
enable_proctored_exams: true,
881830
proctoring_provider: 'proctortrack',
882831
proctoring_escalation_email: '[email protected]',
883-
create_zendesk_tickets: false,
884832
},
885833
});
886834
});

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
@@ -1413,7 +1413,6 @@ module.exports = {
14131413
highlights_preview_only: false,
14141414
highlights_doc_url: 'https://docs.openedx.org/en/latest/educators/how-tos/course_development/manage_course_highlight_emails.html',
14151415
enable_proctored_exams: false,
1416-
create_zendesk_tickets: true,
14171416
enable_timed_exams: true,
14181417
ancestor_has_staff_lock: false,
14191418
user_partition_info: {

0 commit comments

Comments
 (0)