Skip to main content

Proctoring subsystem for Open edX

Project description

PyPI Python CI Codecov Supported Python versions License

This is the exam proctoring subsystem for the Open edX platform.

Overview

Proctored exams are exams with time limits that learners complete while online proctoring software monitors their computers and behavior for activity that might be evidence of cheating. This Python library provides the proctoring implementation used by Open edX.

Documentation

For authoring documentation, see Including Proctored Exams In Your Course.

Installation

To install edx-proctoring:

mkvirtualenv edx-proctoring make install

To run the tests:

make test-all

For a full list of Make targets:

make help

Configuration

In order to use edx-proctoring, you must obtain an account (and secret configuration - see below) with SoftwareSecure, which provides the proctoring review services that edx-proctoring integrates with.

You will need to turn on the ENABLE_SPECIAL_EXAMS in lms.env.json and cms.env.json FEATURES dictionary:

"FEATURES": {
    :
    "ENABLE_SPECIAL_EXAMS": true,
    :
}

Also in your lms.env.json and cms.env.json file please add the following:

"PROCTORING_SETTINGS": {
    "LINK_URLS": {
        "contact_us": "{add link here}",
        "faq": "{add link here}",
        "online_proctoring_rules": "{add link here}",
        "tech_requirements": "{add link here}"
    }
},

In your lms.auth.json file, please add the following secure information:

"PROCTORING_BACKENDS": {
    "software_secure": {
        "crypto_key": "{add SoftwareSecure crypto key here}",
        "exam_register_endpoint": "{add endpoint to SoftwareSecure}",
        "exam_sponsor": "{add SoftwareSecure sponsor}",
        "organization": "{add SoftwareSecure organization}",
        "secret_key": "{add SoftwareSecure secret key}",
        "secret_key_id": "{add SoftwareSecure secret key id}",
        "software_download_url": "{add SoftwareSecure download url}"
    },
    'DEFAULT': 'software_secure'
},

You will need to restart services after these configuration changes for them to take effect.

Email Templates

edx-proctoring provides generic base email templates that are rendered and sent to learners based on changes to the status of a proctored exam attempt. They have been designed such that you may leverage Django template inheritance to customize their content to the proctoring backend. Because proctoring backend plugins are installed in edx-platform, you must create an overriding template in the edx-platform repository. The template path should be emails/proctoring/{backend}/{template_name}. Note that your template can either completely override the base template in edx-proctoring, or it can extend the base template in order to leverage the existing content of the blocks within the base template, particularly if you only need to change a portion of the template.

Debugging

To debug with PDB, run pytest with the -n0 flag. This restricts the number of processes in a way that is compatible with pytest

pytest -n0 [file-path]

License

The code in this repository is licensed under the AGPL 3.0 unless otherwise noted.

Please see LICENSE.txt for details.

How To Contribute

Contributions are very welcome.

Please read How To Contribute for details.

Even though they were written with edx-platform in mind, the guidelines should be followed for Open edX code in general.

Reporting Security Issues

Please do not report security issues in public. Please email security@edx.org.

Getting Help

Have a question about this repository, or about Open edX in general? Please refer to this list of resources if you need any assistance.

Change Log

Unreleased

[3.8.1] - 2021-04-01

  • Increase ping interval from 30 to 60 seconds.

[3.8.0] - 2021-03-31

  • Remove exam resume waffle flag references and fully roll out exam resume and grouped attempt features.

[3.7.16] - 2021-03-30

  • Reduce time for ping interval from 120 to 30 seconds.

[3.7.15] - 2021-03-24

  • Improved learner messaging on onboarding panel and submitted interstitial.

[3.7.14] - 2021-03-19

  • Fix issue where a course key object was being passed in to get_proctoring_escalation_email, rather than a string.

[3.7.13] - 2021-03-16

  • Update proctored exam error message to remove statement that the user must restart their exam from scratch, and include a proctoring escalation email rather than a link to support if applicable.

[3.7.12] - 2021-03-15

  • Update the onboarding status to take into account sections that are not accessible to the user or has a release date in the future. For sections with release dates in the future, that date will now be shown to the learner.

  • Fixed accessibility bug on Special Exam Attempts panel on instructor dashboard

[3.7.9] - 2021-03-09

  • Update onboarding status logic such that ‘approved in another course’ will take precedence over a non verified state in the requested course.

[3.7.8] - 2021-03-08

  • Add enrollment mode column to onboarding status panel on instructor dashboard

[3.7.7] - 2021-03-08

  • Add loading spinner for searching to onboarding attempt and special attempts sections on the instructor dashboard

[3.7.6] - 2021-03-05

  • Fix bug with StudentProctoredExamAttempt put handler where course_id was being incorrectly determined, preventing course staff from marking learners’ attempts as “ready_to_resume”.

[3.7.5] - 2021-03-05

  • Add more useful attributes to log messages, in a key=value format that is easier to extract, and reduce duplicate exception logs.

  • Update private.txt file path in developer docs

[3.7.4] - 2021-03-03

  • Show “approved in other course” status for learner who has a valid verified onboarding attempt in another course, on the instructor’s student onboarding status panel

[3.7.3] - 2021-03-02

  • Change use of get_active_enrollments_by_course method of the LMS Enrollments service to get_enrollments_can_take_proctored_exams, which is more performant. This shifts the responsibility of checking learners’ ability to access proctored exams to the LMS, allowing the LMS to construst a bulk query for all learners in a course with active enrollments instead of needing to execute multiple queries on a per learner basis.

[3.7.2] - 2021-03-02

  • Refactor the proctoring API function to get all verified onboarding attempts of a group of learners.

[3.7.1] - 2021-03-02

  • Update table on instructors dashboard to add accordian for multiple attempts

[3.7.0] - 2021-03-01

  • Update the learner onboarding status view to consider verified attempts from other courses.

[3.6.7] - 2021-02-24

  • Fix requirements file

[3.6.6] - 2021-02-24

  • Revert jsonfield PR

[3.6.5] - 2021-02-23

  • Bug fix to allow course staff to reset attempts

[3.6.4] - 2021-02-24

  • Switched from jsonfield2 to jsonfield as the earlier one has archived and merged back in the latter one.

[3.6.3] - 2021-02-23

  • Add a script to generate obscure_user_ids for proctoring vendors to use.

  • Update the logic for the instructor dashboard onboarding view to match the learners’ view, so that multiple onboarding exams for the same course can be considered.

[3.6.2] - 2021-02-22

  • Change learner onboarding status from “proctoring_started” to “onboarding_started” to more clearly describe the learner’s onboarding status.

[3.6.1] - 2021-02-19

  • Add time_remaining_seconds field of ProctoredExamStudentAttempt model to readonly_fields in Django admin page so it is not required when editing the model.

  • Update reference to Exception.message to use string representation of the exception, as message is no longer an attribute of the Exception class.

[3.6.0] - 2021-02-19

  • Do not override exam view for a learner taking a practice exam when the learner does not have access to proctoring. This allows the learner to see the exam content and does not allow the learner access to the proctoring software.

[3.5.1] - 2021-02-19

  • Add missing rejected status to list of onboarding attempt statuses.

[3.5.0] - 2021-02-18

  • Add new UI for instructor dashboard that groups attempts for each user and exam.

  • Add endpoint that returns a list of most recent attempts for each user and exam. Each attempt that is returned contains additional data on the past attempts associated with the user/exam.

[3.4.1] - 2021-02-17

  • Restrict the resume option on the instructor dashboard to attempts that are in an “error” state and are not for onboarding or practice exams.

[3.4.0] - 2021-02-11

  • Add a new interstitial for exam attempts in the “ready_to_resume” state to indicate to learner that their exam attempt is ready to be resumed and to prompt the learner to resume their exam.

[3.3.0] - 2021-02-11

  • Add learner onboarding view to instructor dashboard.

[3.2.1] - 2021-02-11

  • bugfix to 500 errors from proctored exam attempt status endpoint used by the LMS to drive timer functionality

[3.2.0] - 2021-02-10

  • Update to update_attempt_status function to account for multiple attempts per exam

  • Update to grade, credit, and status email updates based on multiple attempts

[3.1.0] - 2021-02-08

  • Add endpoint to return onboarding status information for users in a course.

[3.0.0] - 2021-02-05

  • Update the secret key to the proctoring specific one so we are fixing for the learners being impacted by rotated django secret.

[2.6.7] - 2021-02-04

  • Bug fix for onboarding info panel showing for all proctoring backends, independent of support for onboarding exams

[2.6.6] - 2021-02-01

  • Bug fix for issue that prevented exam resets

[2.6.5] - 2021-01-28

  • Update error interstitial to use the reset_exam_attempt flow that is used for other onboarding attempt reset

[2.6.4] - 2021-01-26

  • Fix bug that was preventing exams from being reset

  • Add exam removal endpoint to be used on the instructor dashboard in place of the current exam attempt reset endpoint as we now have multiple attempts. This new endpoint is only accessible to course and edX staff

[2.6.3] - 2021-01-26

  • Update the learner onboarding status panel on “submitted” state so learner knows they need to wait

  • Added npm-shrinkwrap.json to pin the graceful-fs to version 4.2.2 to solve “primordials” exception during gulp test

[2.6.2] - 2021-01-25

  • Update endpoint that returns onboarding exam status to account for users enrollment mode.

[2.6.1] - 2021-01-25

  • Add a dropdown component.

  • If the “data-enable-exam-resume-proctoring-improvements” data attribute on the element of the ProctoredExamAttemptView Backbone is true,

    • use the dropdown menu component on the Instructor Dashboard Proctored Exam Attempt panel for proctored exam attempts in the error state, providing the following options:

      • Resume, which transitions the exam attempt into the ready_to_resume state.

      • Reset, which behaves the same as the previous reset functionality, originally exposed via the [x] link.

    • change the [x] link to Reset for exam attempts in other states.

  • If the “data-enable-exam-resume-proctoring-improvements” data attribute on the element of the ProctoredExamAttemptView Backbone is false there is no change.

[2.6.0] - 2021-01-21

  • Replace Travis CI with Github Actions.

  • If a course has a proctoring escalation email set, emails that are sent when an exam attempt is verified or rejected will contain that email address rather than a link to support.

[2.5.13] - 2021-01-20

  • Allow staff users to modify another user’s exam attempt status via the the StudentProctoredExamAttempt view’s PUT handler only when the action is “mark_ready_to_resume” and the user ID is passed in via the request data.

[2.5.12] - 2021-01-20

  • Allow blank fields in Django admin for external_id, due_date, and backend in proctored exams.

[2.5.11] - 2021-01-19

  • Added ProctoredExam to django admin

[2.5.10] - 2021-01-15

  • Added management command to update is_attempt_active field on review models

[2.5.9] - 2021-01-13

  • Added is_attempt_active field to ProctoredExamSoftwareSecureReview and ProctoredExamSoftwareSecureReviewHistory models to note if the attempt for that review has been archived. When an attempt is archived and if it is associated with a review, this field will be set to False

[2.5.8] - 2021-01-12

  • Ignore the ProctoredExamStudentAttemptHistory table when viewing onboarding status. This fixes a bug where the status would return verified even after all attempts had been deleted.

[2.5.7] - 2021-01-08

  • Allow the creation of multiple exam attempts for a single user in a single exam, as long as the most recent attempt is ready_to_resume or resumed. When an exam is resumed, the time remaining is saved to the new attempt and is used to calculate the expiration time.

[2.5.6] - 2021-01-06

  • Updated the StudentProctoredExamAttempt view’s PUT handler to allow for a new action “mark_ready_to_resume”, which transitions exam attempts in the “error” state to a “ready_to_resume” state.

[2.5.5] - 2020-01-05

  • Cover Start System Check button on the proctoring instruction page with the conditions software download link is provided by the proctoring provider, since some providers do not has that step in the onboarding process.

  • Changed handler for exam ping to remove learner from the exam on 403 error.

  • Added time_remaining_seconds field to the exam attempt model in order to allow the remaining time on an exam attempt to be saved after it enters an error state.

  • Fix bug allowing learners access to onboarding setup after exam due date.

[2.5.4] - 2020-12-17

  • Minor template fix

[2.5.3] - 2020-12-10

  • Upgrade celery to 5.0.4

[2.5.2] - 2020-12-10

  • Fixed bug for proctoring info panel

[2.5.1] - 2020-12-10

  • Add endpoint to expose the learner’s onboarding status

[2.5.0] - 2020-12-09

  • Changed behavior of practice exam reset to create a new exam attempt instead of rolling back state of the current attempt.

  • Added new proctoring info panel to expose onboarding exam status to learners

  • Added option to reset a failed or pending onboarding exam.

[2.4.9] - 2020-11-17

  • Fix unbound local variable issue in api.get_attempt_status_summary

  • Added new action to student exam attempt PUT allowing users to reset a completed practice exam.

[2.4.8] - 2020-10-19

  • Created a separate error message for inactive users. Refined the existing error message to only show for network error or service disruption.

[2.4.7] - 2020-10-06

  • Removed the rpnowv4_flow waffle flag to cleanup code

For details of changes prior to this release, please see the GitHub commit history.

Project details


Release history Release notifications | RSS feed

This version

3.8.1

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

edx-proctoring-3.8.1.tar.gz (781.8 kB view details)

Uploaded Source

Built Distribution

edx_proctoring-3.8.1-py2.py3-none-any.whl (937.0 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file edx-proctoring-3.8.1.tar.gz.

File metadata

  • Download URL: edx-proctoring-3.8.1.tar.gz
  • Upload date:
  • Size: 781.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/3.10.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.59.0 CPython/3.9.2

File hashes

Hashes for edx-proctoring-3.8.1.tar.gz
Algorithm Hash digest
SHA256 c062bc619d71dc25136afeee4cd2c75b32b6c530b402e6cb085342c3e1170e3b
MD5 740875f2f2188067664eef8dd4219ab6
BLAKE2b-256 f301caf2f8ba39e2214f60270193cfb883223db0df8039bf556913651a799f8f

See more details on using hashes here.

Provenance

File details

Details for the file edx_proctoring-3.8.1-py2.py3-none-any.whl.

File metadata

  • Download URL: edx_proctoring-3.8.1-py2.py3-none-any.whl
  • Upload date:
  • Size: 937.0 kB
  • Tags: Python 2, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/3.10.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.59.0 CPython/3.9.2

File hashes

Hashes for edx_proctoring-3.8.1-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 96531974ba9b6e5c4e0422e8930cc12df129e6fe69f7d24922586631736a456f
MD5 34cc744ebf7008a4bc37eb525a2ccdb6
BLAKE2b-256 a1da26b879d56e46789f42e1a10f65c0e24b2bccdffc7752d297b9f4a413bb15

See more details on using hashes here.

Provenance

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page