diff --git a/README.rst b/README.rst index 4a1f2ee4b..133818538 100644 --- a/README.rst +++ b/README.rst @@ -175,10 +175,6 @@ Feature: New Proctoring Exams View Requirements ------------ -* ``edx-platform`` Django settings: - - * ``ZENDESK_*``: necessary if automatic ZenDesk ticket creation is desired - * `edx-exams `_: for this feature to work, the ``edx-exams`` IDA must be deployed and its API accessible by the browser Configuration @@ -196,7 +192,6 @@ In Studio, a new item ("Proctored Exam Settings") is added to "Other Course Sett * Enable proctored exams for the course * Allow opting out of proctored exams * Select a proctoring provider -* Enable automatic creation of Zendesk tickets for "suspicious" proctored exam attempts Feature: Advanced Settings ========================== diff --git a/plugins/course-apps/proctoring/Settings.jsx b/plugins/course-apps/proctoring/Settings.jsx index 73da08b47..fd1369f4e 100644 --- a/plugins/course-apps/proctoring/Settings.jsx +++ b/plugins/course-apps/proctoring/Settings.jsx @@ -33,7 +33,6 @@ const ProctoringSettings = ({ onClose }) => { proctoringProvider: false, escalationEmail: '', allowOptingOut: false, - createZendeskTickets: false, }; const [formValues, setFormValues] = useState(initialFormValues); const [loading, setLoading] = useState(true); @@ -80,12 +79,11 @@ const ProctoringSettings = ({ onClose }) => { const value = target.type === 'checkbox' ? target.checked : target.value; const { name } = target; - if (['allowOptingOut', 'createZendeskTickets'].includes(name)) { + if (['allowOptingOut'].includes(name)) { // Form.Radio expects string values, so convert back to a boolean here setFormValues({ ...formValues, [name]: value === 'true' }); } else if (name === 'proctoringProvider') { const newFormValues = { ...formValues, proctoringProvider: value }; - if (requiresEscalationEmailProviders.includes(value)) { setFormValues({ ...newFormValues }); setShowEscalationEmail(true); @@ -115,7 +113,6 @@ const ProctoringSettings = ({ onClose }) => { enable_proctored_exams: formValues.enableProctoredExams, // lti providers are managed outside edx-platform, lti_external indicates this proctoring_provider: isLtiProviderSelected ? 'lti_external' : selectedProvider, - create_zendesk_tickets: formValues.createZendeskTickets, }, }; if (isEdxStaff) { @@ -386,29 +383,6 @@ const ProctoringSettings = ({ onClose }) => { )} - - {/* CREATE ZENDESK TICKETS */} - { isEdxStaff && formValues.enableProctoredExams && !isLtiProviderSelected && ( -
- - - {intl.formatMessage(messages['authoring.proctoring.createzendesk.label'])} - - - - {intl.formatMessage(messages['authoring.proctoring.yes'])} - - - {intl.formatMessage(messages['authoring.proctoring.no'])} - - - -
- )} ); } @@ -571,7 +545,6 @@ const ProctoringSettings = ({ onClose }) => { proctoringProvider: selectedProvider, enableProctoredExams: proctoredExamSettings.enable_proctored_exams, allowOptingOut: proctoredExamSettings.allow_proctoring_opt_out, - createZendeskTickets: proctoredExamSettings.create_zendesk_tickets, // The backend API may return null for the proctoringEscalationEmail value, which is the default. // In order to keep our email input component controlled, we use the empty string as the default // and perform this conversion during GETs and POSTs. diff --git a/plugins/course-apps/proctoring/Settings.test.jsx b/plugins/course-apps/proctoring/Settings.test.jsx index d18cb47a3..39d85ac0a 100644 --- a/plugins/course-apps/proctoring/Settings.test.jsx +++ b/plugins/course-apps/proctoring/Settings.test.jsx @@ -78,7 +78,6 @@ describe('ProctoredExamSettings', () => { allow_proctoring_opt_out: false, proctoring_provider: 'mockproc', proctoring_escalation_email: 'test@example.com', - create_zendesk_tickets: true, }, available_proctoring_providers: ['software_secure', 'mockproc', 'lti_external'], requires_escalation_email_providers: ['test_lti'], @@ -95,36 +94,6 @@ describe('ProctoredExamSettings', () => { await act(async () => render(renderComponent())); }); - it('Updates Zendesk ticket field if software_secure is provider', async () => { - await waitFor(() => { - screen.getByDisplayValue('mockproc'); - }); - const selectElement = screen.getByDisplayValue('mockproc'); - fireEvent.change(selectElement, { target: { value: 'software_secure' } }); - const zendeskTicketInput = screen.getByTestId('createZendeskTicketsYes'); - expect(zendeskTicketInput.checked).toEqual(true); - }); - - it('Updates Zendesk ticket field if software_secure is provider', async () => { - await waitFor(() => { - screen.getByDisplayValue('mockproc'); - }); - const selectElement = screen.getByDisplayValue('mockproc'); - fireEvent.change(selectElement, { target: { value: 'software_secure' } }); - const zendeskTicketInput = screen.getByTestId('createZendeskTicketsYes'); - expect(zendeskTicketInput.checked).toEqual(true); - }); - - it('Does not update zendesk ticket field for any other provider', async () => { - await waitFor(() => { - screen.getByDisplayValue('mockproc'); - }); - const selectElement = screen.getByDisplayValue('mockproc'); - fireEvent.change(selectElement, { target: { value: 'mockproc' } }); - const zendeskTicketInput = screen.getByTestId('createZendeskTicketsYes'); - expect(zendeskTicketInput.checked).toEqual(true); - }); - it('Hides all other fields when enabledProctorExam is false when first loaded', async () => { cleanup(); // Overrides the handler defined in beforeEach. @@ -136,7 +105,6 @@ describe('ProctoredExamSettings', () => { allow_proctoring_opt_out: false, proctoring_provider: 'mockproc', proctoring_escalation_email: 'test@example.com', - create_zendesk_tickets: true, }, available_proctoring_providers: ['software_secure', 'mockproc'], requires_escalation_email_providers: [], @@ -152,8 +120,6 @@ describe('ProctoredExamSettings', () => { expect(screen.queryByText('Allow Opting Out of Proctored Exams')).toBeNull(); expect(screen.queryByDisplayValue('mockproc')).toBeNull(); expect(screen.queryByTestId('escalationEmail')).toBeNull(); - expect(screen.queryByTestId('createZendeskTicketsYes')).toBeNull(); - expect(screen.queryByTestId('createZendeskTicketsNo')).toBeNull(); }); it('Hides all other fields when enableProctoredExams toggled to false', async () => { @@ -163,8 +129,6 @@ describe('ProctoredExamSettings', () => { expect(screen.queryByText('Allow opting out of proctored exams')).toBeDefined(); expect(screen.queryByDisplayValue('mockproc')).toBeDefined(); expect(screen.queryByTestId('escalationEmail')).toBeDefined(); - expect(screen.queryByTestId('createZendeskTicketsYes')).toBeDefined(); - expect(screen.queryByTestId('createZendeskTicketsNo')).toBeDefined(); let enabledProctoredExamCheck = screen.getAllByLabelText('Proctored exams', { exact: false })[0]; expect(enabledProctoredExamCheck.checked).toEqual(true); @@ -174,8 +138,6 @@ describe('ProctoredExamSettings', () => { expect(screen.queryByText('Allow opting out of proctored exams')).toBeNull(); expect(screen.queryByDisplayValue('mockproc')).toBeNull(); expect(screen.queryByTestId('escalationEmail')).toBeNull(); - expect(screen.queryByTestId('createZendeskTicketsYes')).toBeNull(); - expect(screen.queryByTestId('createZendeskTicketsNo')).toBeNull(); }); it('Hides unsupported fields when lti provider is selected', async () => { @@ -185,8 +147,6 @@ describe('ProctoredExamSettings', () => { const selectElement = screen.getByDisplayValue('mockproc'); fireEvent.change(selectElement, { target: { value: 'test_lti' } }); expect(screen.queryByTestId('allowOptingOutRadio')).toBeNull(); - expect(screen.queryByTestId('createZendeskTicketsYes')).toBeNull(); - expect(screen.queryByTestId('createZendeskTicketsNo')).toBeNull(); }); }); @@ -202,7 +162,6 @@ describe('ProctoredExamSettings', () => { allow_proctoring_opt_out: false, proctoring_provider: 'lti_external', proctoring_escalation_email: 'test@example.com', - create_zendesk_tickets: true, }, available_proctoring_providers: ['software_secure', 'mockproc', 'lti_external'], requires_escalation_email_providers: ['test_lti'], @@ -382,7 +341,6 @@ describe('ProctoredExamSettings', () => { allow_proctoring_opt_out: false, proctoring_provider: 'mockproc', proctoring_escalation_email: 'test@example.com', - create_zendesk_tickets: true, }, available_proctoring_providers: ['software_secure', 'mockproc'], requires_escalation_email_providers: [], @@ -395,7 +353,6 @@ describe('ProctoredExamSettings', () => { allow_proctoring_opt_out: false, proctoring_provider: 'mockproc', proctoring_escalation_email: 'test@example.com', - create_zendesk_tickets: true, }, available_proctoring_providers: ['software_secure', 'mockproc'], requires_escalation_email_providers: [], @@ -529,18 +486,16 @@ describe('ProctoredExamSettings', () => { }); describe('Toggles field visibility based on user permissions', () => { - it('Hides opting out and zendesk tickets for non edX staff', async () => { + it('Hides opting out for non edX staff', async () => { setupApp(false); await act(async () => render(renderComponent())); expect(screen.queryByTestId('allowOptingOutYes')).toBeNull(); - expect(screen.queryByTestId('createZendeskTicketsYes')).toBeNull(); }); - it('Shows opting out and zendesk tickets for edX staff', async () => { + it('Shows opting out for edX staff', async () => { setupApp(true); await act(async () => render(renderComponent())); expect(screen.queryByTestId('allowOptingOutYes')).not.toBeNull(); - expect(screen.queryByTestId('createZendeskTicketsYes')).not.toBeNull(); }); }); @@ -618,7 +573,6 @@ describe('ProctoredExamSettings', () => { allow_proctoring_opt_out: false, proctoring_provider: 'mockproc', proctoring_escalation_email: 'test@example.com', - create_zendesk_tickets: true, }, available_proctoring_providers: ['software_secure', 'mockproc', 'lti_external'], requires_escalation_email_providers: ['test_lti'], @@ -642,7 +596,6 @@ describe('ProctoredExamSettings', () => { allow_proctoring_opt_out: false, proctoring_provider: 'lti_external', proctoring_escalation_email: 'test_lti@example.com', - create_zendesk_tickets: true, }, }); expect(axiosMock.history.patch.length).toBe(1); @@ -674,7 +627,6 @@ describe('ProctoredExamSettings', () => { enable_proctored_exams: true, allow_proctoring_opt_out: false, proctoring_provider: 'mockproc', - create_zendesk_tickets: true, }, }); @@ -716,7 +668,6 @@ describe('ProctoredExamSettings', () => { allow_proctoring_opt_out: false, proctoring_provider: 'lti_external', proctoring_escalation_email: 'test_lti@example.com', - create_zendesk_tickets: true, }, }); @@ -746,7 +697,6 @@ describe('ProctoredExamSettings', () => { enable_proctored_exams: true, allow_proctoring_opt_out: false, proctoring_provider: 'mockproc', - create_zendesk_tickets: true, }, }); @@ -768,7 +718,6 @@ describe('ProctoredExamSettings', () => { allow_proctoring_opt_out: false, proctoring_provider: 'mockproc', proctoring_escalation_email: 'test@example.com', - create_zendesk_tickets: true, }, available_proctoring_providers: ['software_secure', 'mockproc'], requires_escalation_email_providers: [], @@ -787,7 +736,6 @@ describe('ProctoredExamSettings', () => { enable_proctored_exams: true, allow_proctoring_opt_out: false, proctoring_provider: 'mockproc', - create_zendesk_tickets: true, }, }); @@ -887,26 +835,5 @@ describe('ProctoredExamSettings', () => { expect(document.activeElement).toEqual(successAlert); }); }); - - it('Include Zendesk ticket in post request if user is not an admin', async () => { - // use non-admin user for test - const isAdmin = false; - setupApp(isAdmin); - - await act(async () => render(renderComponent())); - // Make a change to the proctoring provider - const selectElement = screen.getByDisplayValue('mockproc'); - fireEvent.change(selectElement, { target: { value: 'software_secure' } }); - const submitButton = screen.getByTestId('submissionButton'); - fireEvent.click(submitButton); - expect(axiosMock.history.post.length).toBe(1); - expect(JSON.parse(axiosMock.history.post[0].data)).toEqual({ - proctored_exam_settings: { - enable_proctored_exams: true, - proctoring_provider: 'software_secure', - create_zendesk_tickets: true, - }, - }); - }); }); }); diff --git a/plugins/course-apps/proctoring/messages.js b/plugins/course-apps/proctoring/messages.js index b5192c1fe..ed4d652fb 100644 --- a/plugins/course-apps/proctoring/messages.js +++ b/plugins/course-apps/proctoring/messages.js @@ -81,11 +81,6 @@ const messages = defineMessages({ defaultMessage: 'Allow learners to opt out of proctoring on proctored exams', description: 'Label for radio selection allowing proctored exam opt out', }, - 'authoring.proctoring.createzendesk.label': { - id: 'authoring.proctoring.createzendesk.label', - defaultMessage: 'Create Zendesk tickets for suspicious attempts', - description: 'Label for Zendesk ticket creation radio select.', - }, 'authoring.proctoring.error.single': { id: 'authoring.proctoring.error.single', defaultMessage: 'There is 1 error in this form.', diff --git a/src/course-outline/__mocks__/courseOutlineIndex.js b/src/course-outline/__mocks__/courseOutlineIndex.js index 0c3208906..ae225b9a7 100644 --- a/src/course-outline/__mocks__/courseOutlineIndex.js +++ b/src/course-outline/__mocks__/courseOutlineIndex.js @@ -62,7 +62,6 @@ module.exports = { highlightsPreviewOnly: false, highlightsDocUrl: 'https://docs.openedx.org/en/latest/educators/how-tos/course_development/manage_course_highlight_emails.html', enableProctoredExams: true, - createZendeskTickets: true, enableTimedExams: true, childInfo: { category: 'chapter', diff --git a/src/course-unit/__mocks__/courseSectionVertical.js b/src/course-unit/__mocks__/courseSectionVertical.js index 6693598e4..fad49675f 100644 --- a/src/course-unit/__mocks__/courseSectionVertical.js +++ b/src/course-unit/__mocks__/courseSectionVertical.js @@ -1405,7 +1405,6 @@ module.exports = { highlights_preview_only: false, highlights_doc_url: 'https://docs.openedx.org/en/latest/educators/how-tos/course_development/manage_course_highlight_emails.html', enable_proctored_exams: false, - create_zendesk_tickets: true, enable_timed_exams: true, ancestor_has_staff_lock: false, user_partition_info: {