From 58611cd1cb461e01b766bcd30c8f32798d584aa4 Mon Sep 17 00:00:00 2001 From: Jesse Stewart Date: Mon, 8 Sep 2025 11:49:43 -0400 Subject: [PATCH 01/13] feat: use actual module names --- ...ructor-dashboard-rest-api-architecture.rst | 145 ++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100644 docs/decisions/0003-instructor-dashboard-rest-api-architecture.rst diff --git a/docs/decisions/0003-instructor-dashboard-rest-api-architecture.rst b/docs/decisions/0003-instructor-dashboard-rest-api-architecture.rst new file mode 100644 index 00000000..9a2fd269 --- /dev/null +++ b/docs/decisions/0003-instructor-dashboard-rest-api-architecture.rst @@ -0,0 +1,145 @@ +# ADR-0003 Instructor Dashboard REST API Architecture + +## Decision +Implement unified Instructor Dashboard REST API with service orchestration pattern organizing 90 endpoints across 12 functional domains. + +## API Endpoints & Services + +### Course Information API +| Method | Endpoint | Services | +|--------|----------|----------| +| GET | `/api/instructor/v1/courses/{course_key}/info` | instructor, xmodule.modulestore | +| PUT | `/api/instructor/v1/courses/{course_key}/info` | instructor, xmodule.modulestore | +| GET | `/api/instructor/v1/courses/{course_key}/instructor_tasks` | instructor_task | +| GET | `/api/instructor/v1/courses/{course_key}/modes` | course_modes | +| PUT | `/api/instructor/v1/courses/{course_key}/modes/{mode_id}/price` | course_modes | + +### Membership Management API +| Method | Endpoint | Services | +|--------|----------|----------| +| GET | `/api/instructor/v1/courses/{course_key}/enrollment` | enrollments, student | +| POST | `/api/instructor/v1/courses/{course_key}/enrollment` | enrollments, student | +| DELETE | `/api/instructor/v1/courses/{course_key}/enrollment` | enrollments, student | +| POST | `/api/instructor/v1/courses/{course_key}/enrollment/batch` | bulk_enroll, bulk_email | +| POST | `/api/instructor/v1/courses/{course_key}/enrollment/csv_upload` | bulk_enroll, util | +| GET | `/api/instructor/v1/courses/{course_key}/roles` | student.auth | +| POST | `/api/instructor/v1/courses/{course_key}/roles` | student.auth | +| DELETE | `/api/instructor/v1/courses/{course_key}/roles` | student.auth | +| GET | `/api/instructor/v1/courses/{course_key}/roles/{role_type}/members` | student.auth | +| GET | `/api/instructor/v1/courses/{course_key}/beta_testers` | student.auth | +| POST | `/api/instructor/v1/courses/{course_key}/beta_testers` | student.auth | +| DELETE | `/api/instructor/v1/courses/{course_key}/beta_testers` | student.auth | +| GET | `/api/instructor/v1/courses/{course_key}/forum/members` | discussion, student.auth | +| POST | `/api/instructor/v1/courses/{course_key}/forum/members` | discussion, student.auth | +| DELETE | `/api/instructor/v1/courses/{course_key}/forum/members` | discussion, student.auth | + +### Student Administration API +| Method | Endpoint | Services | +|--------|----------|----------| +| GET | `/api/instructor/v1/courses/{course_key}/students` | student, instructor | +| GET | `/api/instructor/v1/courses/{course_key}/students/{username}` | student, instructor | +| GET | `/api/instructor/v1/courses/{course_key}/students/{username}/enrollment_status` | enrollments | +| GET | `/api/instructor/v1/courses/{course_key}/students/{username}/progress_url` | student, instructor | +| POST | `/api/instructor/v1/courses/{course_key}/students/{username}/reset_attempts` | grades, xmodule.modulestore, instructor_task | +| POST | `/api/instructor/v1/courses/{course_key}/students/{username}/reset_entrance_exam` | grades, xmodule.modulestore | +| POST | `/api/instructor/v1/courses/{course_key}/students/{username}/rescore_problem` | grades, xmodule.modulestore, instructor_task | +| POST | `/api/instructor/v1/courses/{course_key}/students/{username}/override_score` | grades, xmodule.modulestore | +| POST | `/api/instructor/v1/courses/{course_key}/students/{username}/delete_state` | student, xmodule.modulestore | +| POST | `/api/instructor/v1/courses/{course_key}/problems/{problem_id}/reset_attempts_all` | grades, xmodule.modulestore, instructor_task | +| POST | `/api/instructor/v1/courses/{course_key}/problems/{problem_id}/rescore_all` | grades, xmodule.modulestore, instructor_task | + +### Cohort Management API +| Method | Endpoint | Services | +|--------|----------|----------| +| GET | `/api/instructor/v1/courses/{course_key}/cohorts` | openedx.core.djangoapps.course_groups | +| POST | `/api/instructor/v1/courses/{course_key}/cohorts` | openedx.core.djangoapps.course_groups | +| PUT | `/api/instructor/v1/courses/{course_key}/cohorts/{cohort_id}` | openedx.core.djangoapps.course_groups | +| DELETE | `/api/instructor/v1/courses/{course_key}/cohorts/{cohort_id}` | openedx.core.djangoapps.course_groups | +| POST | `/api/instructor/v1/courses/{course_key}/cohorts/{cohort_id}/students` | openedx.core.djangoapps.course_groups | +| DELETE | `/api/instructor/v1/courses/{course_key}/cohorts/{cohort_id}/students` | openedx.core.djangoapps.course_groups | +| POST | `/api/instructor/v1/courses/{course_key}/cohorts/csv_upload` | openedx.core.djangoapps.course_groups, util | + +### Discussion Management API +| Method | Endpoint | Services | +|--------|----------|----------| +| GET | `/api/instructor/v1/courses/{course_key}/discussions/topics` | discussion | +| POST | `/api/instructor/v1/courses/{course_key}/discussions/topics` | discussion, xmodule.modulestore | +| PUT | `/api/instructor/v1/courses/{course_key}/discussions/topics/{topic_id}` | discussion | +| DELETE | `/api/instructor/v1/courses/{course_key}/discussions/topics/{topic_id}` | discussion | +| GET | `/api/instructor/v1/courses/{course_key}/discussions/settings` | discussion | +| PUT | `/api/instructor/v1/courses/{course_key}/discussions/settings` | discussion | + +### Extensions & Deadlines API +| Method | Endpoint | Services | +|--------|----------|----------| +| GET | `/api/instructor/v1/courses/{course_key}/extensions` | util.date_utils | +| POST | `/api/instructor/v1/courses/{course_key}/extensions` | util.date_utils | +| PUT | `/api/instructor/v1/courses/{course_key}/extensions/{extension_id}` | util.date_utils | +| DELETE | `/api/instructor/v1/courses/{course_key}/extensions/{extension_id}` | util.date_utils | +| GET | `/api/instructor/v1/courses/{course_key}/extensions/{username}` | util.date_utils, student | + +### Data Export API +| Method | Endpoint | Services | +|--------|----------|----------| +| GET | `/api/instructor/v1/courses/{course_key}/data_downloads` | instructor_task, util | +| POST | `/api/instructor/v1/courses/{course_key}/data_downloads` | instructor_task, util | +| GET | `/api/instructor/v1/courses/{course_key}/data_downloads/{download_id}` | instructor_task, util | +| DELETE | `/api/instructor/v1/courses/{course_key}/data_downloads/{download_id}` | instructor_task, util | +| POST | `/api/instructor/v1/courses/{course_key}/data_downloads/student_profiles` | instructor_task, student | +| POST | `/api/instructor/v1/courses/{course_key}/data_downloads/grade_report` | instructor_task, grades | +| POST | `/api/instructor/v1/courses/{course_key}/data_downloads/problem_grade_report` | instructor_task, grades | +| POST | `/api/instructor/v1/courses/{course_key}/data_downloads/course_structure` | instructor_task, xmodule.modulestore | +| POST | `/api/instructor/v1/courses/{course_key}/data_downloads/survey_results` | instructor_task, grades | + +### Bulk Email API +| Method | Endpoint | Services | +|--------|----------|----------| +| GET | `/api/instructor/v1/courses/{course_key}/bulk_email` | bulk_email | +| POST | `/api/instructor/v1/courses/{course_key}/bulk_email` | bulk_email, instructor_task | +| GET | `/api/instructor/v1/courses/{course_key}/bulk_email/{email_id}` | bulk_email | +| GET | `/api/instructor/v1/courses/{course_key}/bulk_email/{email_id}/status` | bulk_email, instructor_task | +| DELETE | `/api/instructor/v1/courses/{course_key}/bulk_email/{email_id}` | bulk_email | +| GET | `/api/instructor/v1/courses/{course_key}/email_templates` | bulk_email | + +### Special Exams API +| Method | Endpoint | Services | +|--------|----------|----------| +| GET | `/api/instructor/v1/courses/{course_key}/special_exams` | edx_proctoring, grades | +| GET | `/api/instructor/v1/courses/{course_key}/special_exams/{exam_id}` | edx_proctoring, grades | +| POST | `/api/instructor/v1/courses/{course_key}/special_exams/{exam_id}/reset/{username}` | edx_proctoring, InstructorService | +| GET | `/api/instructor/v1/courses/{course_key}/special_exams/{exam_id}/attempts` | edx_proctoring, grades | +| GET | `/api/instructor/v1/courses/{course_key}/proctoring_settings` | edx_proctoring | +| PUT | `/api/instructor/v1/courses/{course_key}/proctoring_settings` | edx_proctoring | +| POST | `/api/instructor/v1/courses/{course_key}/special_exams/{exam_id}/allowance` | edx_proctoring, student | + +### Certificates API +| Method | Endpoint | Services | +|--------|----------|----------| +| GET | `/api/instructor/v1/courses/{course_key}/certificates` | certificates | +| POST | `/api/instructor/v1/courses/{course_key}/certificates/generate` | certificates, instructor_task | +| POST | `/api/instructor/v1/courses/{course_key}/certificates/generate/{username}` | certificates, student | +| POST | `/api/instructor/v1/courses/{course_key}/certificates/generate_bulk` | certificates, instructor_task | +| GET | `/api/instructor/v1/courses/{course_key}/certificates/allowlist` | certificates | +| POST | `/api/instructor/v1/courses/{course_key}/certificates/allowlist` | certificates, student | +| DELETE | `/api/instructor/v1/courses/{course_key}/certificates/allowlist` | certificates | +| GET | `/api/instructor/v1/courses/{course_key}/certificates/{certificate_id}/status` | certificates | + +### Open Response Assessment API +| Method | Endpoint | Services | +|--------|----------|----------| +| GET | `/api/instructor/v1/courses/{course_key}/ora` | ora_staff_grader, xmodule.modulestore | +| GET | `/api/instructor/v1/courses/{course_key}/ora/{ora_id}` | ora_staff_grader, xmodule.modulestore | +| GET | `/api/instructor/v1/courses/{course_key}/ora/{ora_id}/submissions` | ora_staff_grader | +| GET | `/api/instructor/v1/courses/{course_key}/ora/{ora_id}/submissions/{submission_id}` | ora_staff_grader | +| POST | `/api/instructor/v1/courses/{course_key}/ora/{ora_id}/submissions/{submission_id}/override_grade` | ora_staff_grader | +| POST | `/api/instructor/v1/courses/{course_key}/ora/{ora_id}/submissions/{submission_id}/reset` | ora_staff_grader | + +### Analytics API +| Method | Endpoint | Services | +|--------|----------|----------| +| GET | `/api/instructor/v1/courses/{course_key}/analytics/dashboard_url` | instructor_analytics | +| GET | `/api/instructor/v1/courses/{course_key}/analytics/summary` | instructor_analytics, student | +| GET | `/api/instructor/v1/courses/{course_key}/analytics/engagement` | instructor_analytics | +| GET | `/api/instructor/v1/courses/{course_key}/analytics/performance` | instructor_analytics, grades | +| GET | `/api/instructor/v1/courses/{course_key}/analytics/enrollment_stats` | instructor_analytics, enrollments | + From 7a1398a4f11353b477dddcab08dfddcea9ad3369 Mon Sep 17 00:00:00 2001 From: Jesse Stewart Date: Mon, 8 Sep 2025 11:53:29 -0400 Subject: [PATCH 02/13] fix: md to rst --- ...tructor-dashboard-rest-api-architecture.md | 495 ++++++++++++++++++ ...ructor-dashboard-rest-api-architecture.rst | 145 ----- 2 files changed, 495 insertions(+), 145 deletions(-) create mode 100644 docs/decisions/0003-instructor-dashboard-rest-api-architecture.md delete mode 100644 docs/decisions/0003-instructor-dashboard-rest-api-architecture.rst diff --git a/docs/decisions/0003-instructor-dashboard-rest-api-architecture.md b/docs/decisions/0003-instructor-dashboard-rest-api-architecture.md new file mode 100644 index 00000000..4b896ea2 --- /dev/null +++ b/docs/decisions/0003-instructor-dashboard-rest-api-architecture.md @@ -0,0 +1,495 @@ +ADR-0003 Instructor Dashboard REST API Architecture +=================================================== + +Decision +-------- + +Implement unified Instructor Dashboard REST API with service +orchestration pattern organizing 90 endpoints across 12 functional +domains. + +API Endpoints & Services +------------------------ + +Course Information API +~~~~~~~~~~~~~~~~~~~~~~ + ++-------------------+------------------------+------------------------+ +| Method | Endpoint | Services | ++===================+========================+========================+ +| GET | ``/a | instructor, | +| | pi/instructor/v1/cours | xmodule.modulestore | +| | es/{course_key}/info`` | | ++-------------------+------------------------+------------------------+ +| PUT | ``/a | instructor, | +| | pi/instructor/v1/cours | xmodule.modulestore | +| | es/{course_key}/info`` | | ++-------------------+------------------------+------------------------+ +| GET | ``/api/instructo | instructor_task | +| | r/v1/courses/{course_k | | +| | ey}/instructor_tasks`` | | ++-------------------+------------------------+------------------------+ +| GET | ``/ap | course_modes | +| | i/instructor/v1/course | | +| | s/{course_key}/modes`` | | ++-------------------+------------------------+------------------------+ +| PUT | ``/api/instructor/v1/ | course_modes | +| | courses/{course_key}/m | | +| | odes/{mode_id}/price`` | | ++-------------------+------------------------+------------------------+ + +Membership Management API +~~~~~~~~~~~~~~~~~~~~~~~~~ + ++-------------------+------------------------+------------------------+ +| Method | Endpoint | Services | ++===================+========================+========================+ +| GET | ``/api/ins | enrollments, student | +| | tructor/v1/courses/{co | | +| | urse_key}/enrollment`` | | ++-------------------+------------------------+------------------------+ +| POST | ``/api/ins | enrollments, student | +| | tructor/v1/courses/{co | | +| | urse_key}/enrollment`` | | ++-------------------+------------------------+------------------------+ +| DELETE | ``/api/ins | enrollments, student | +| | tructor/v1/courses/{co | | +| | urse_key}/enrollment`` | | ++-------------------+------------------------+------------------------+ +| POST | ``/api/instructo | bulk_enroll, | +| | r/v1/courses/{course_k | bulk_email | +| | ey}/enrollment/batch`` | | ++-------------------+------------------------+------------------------+ +| POST | ``/api/instructor/v1/ | bulk_enroll, util | +| | courses/{course_key}/e | | +| | nrollment/csv_upload`` | | ++-------------------+------------------------+------------------------+ +| GET | ``/ap | student.auth | +| | i/instructor/v1/course | | +| | s/{course_key}/roles`` | | ++-------------------+------------------------+------------------------+ +| POST | ``/ap | student.auth | +| | i/instructor/v1/course | | +| | s/{course_key}/roles`` | | ++-------------------+------------------------+------------------------+ +| DELETE | ``/ap | student.auth | +| | i/instructor/v1/course | | +| | s/{course_key}/roles`` | | ++-------------------+------------------------+------------------------+ +| GET | ``/ | student.auth | +| | api/instructor/v1/cour | | +| | ses/{course_key}/roles | | +| | /{role_type}/members`` | | ++-------------------+------------------------+------------------------+ +| GET | ``/api/instr | student.auth | +| | uctor/v1/courses/{cour | | +| | se_key}/beta_testers`` | | ++-------------------+------------------------+------------------------+ +| POST | ``/api/instr | student.auth | +| | uctor/v1/courses/{cour | | +| | se_key}/beta_testers`` | | ++-------------------+------------------------+------------------------+ +| DELETE | ``/api/instr | student.auth | +| | uctor/v1/courses/{cour | | +| | se_key}/beta_testers`` | | ++-------------------+------------------------+------------------------+ +| GET | ``/api/instru | discussion, | +| | ctor/v1/courses/{cours | student.auth | +| | e_key}/forum/members`` | | ++-------------------+------------------------+------------------------+ +| POST | ``/api/instru | discussion, | +| | ctor/v1/courses/{cours | student.auth | +| | e_key}/forum/members`` | | ++-------------------+------------------------+------------------------+ +| DELETE | ``/api/instru | discussion, | +| | ctor/v1/courses/{cours | student.auth | +| | e_key}/forum/members`` | | ++-------------------+------------------------+------------------------+ + +Student Administration API +~~~~~~~~~~~~~~~~~~~~~~~~~~ + ++-------------------+------------------------+------------------------+ +| Method | Endpoint | Services | ++===================+========================+========================+ +| GET | ``/api/i | student, instructor | +| | nstructor/v1/courses/{ | | +| | course_key}/students`` | | ++-------------------+------------------------+------------------------+ +| GET | ``/api/instructor/v | student, instructor | +| | 1/courses/{course_key} | | +| | /students/{username}`` | | ++-------------------+------------------------+------------------------+ +| GET | ``/api/instruct | enrollments | +| | or/v1/courses/{course_ | | +| | key}/students/{usernam | | +| | e}/enrollment_status`` | | ++-------------------+------------------------+------------------------+ +| GET | ``/api/ins | student, instructor | +| | tructor/v1/courses/{co | | +| | urse_key}/students/{us | | +| | ername}/progress_url`` | | ++-------------------+------------------------+------------------------+ +| POST | ``/api/instr | grades, | +| | uctor/v1/courses/{cour | xmodule.modulestore, | +| | se_key}/students/{user | instructor_task | +| | name}/reset_attempts`` | | ++-------------------+------------------------+------------------------+ +| POST | ``/api/instructor | grades, | +| | /v1/courses/{course_ke | xmodule.modulestore | +| | y}/students/{username} | | +| | /reset_entrance_exam`` | | ++-------------------+------------------------+------------------------+ +| POST | ``/api/instru | grades, | +| | ctor/v1/courses/{cours | xmodule.modulestore, | +| | e_key}/students/{usern | instructor_task | +| | ame}/rescore_problem`` | | ++-------------------+------------------------+------------------------+ +| POST | ``/api/instr | grades, | +| | uctor/v1/courses/{cour | xmodule.modulestore | +| | se_key}/students/{user | | +| | name}/override_score`` | | ++-------------------+------------------------+------------------------+ +| POST | ``/api/ins | student, | +| | tructor/v1/courses/{co | xmodule.modulestore | +| | urse_key}/students/{us | | +| | ername}/delete_state`` | | ++-------------------+------------------------+------------------------+ +| POST | ``/api/instructor/ | grades, | +| | v1/courses/{course_key | xmodule.modulestore, | +| | }/problems/{problem_id | instructor_task | +| | }/reset_attempts_all`` | | ++-------------------+------------------------+------------------------+ +| POST | ``/api/inst | grades, | +| | ructor/v1/courses/{cou | xmodule.modulestore, | +| | rse_key}/problems/{pro | instructor_task | +| | blem_id}/rescore_all`` | | ++-------------------+------------------------+------------------------+ + +Cohort Management API +~~~~~~~~~~~~~~~~~~~~~ + ++-------------------+------------------------+------------------------+ +| Method | Endpoint | Services | ++===================+========================+========================+ +| GET | ``/api/ | openedx.core.dj | +| | instructor/v1/courses/ | angoapps.course_groups | +| | {course_key}/cohorts`` | | ++-------------------+------------------------+------------------------+ +| POST | ``/api/ | openedx.core.dj | +| | instructor/v1/courses/ | angoapps.course_groups | +| | {course_key}/cohorts`` | | ++-------------------+------------------------+------------------------+ +| PUT | ``/api/instructor/v | openedx.core.dj | +| | 1/courses/{course_key} | angoapps.course_groups | +| | /cohorts/{cohort_id}`` | | ++-------------------+------------------------+------------------------+ +| DELETE | ``/api/instructor/v | openedx.core.dj | +| | 1/courses/{course_key} | angoapps.course_groups | +| | /cohorts/{cohort_id}`` | | ++-------------------+------------------------+------------------------+ +| POST | ``/api | openedx.core.dj | +| | /instructor/v1/courses | angoapps.course_groups | +| | /{course_key}/cohorts/ | | +| | {cohort_id}/students`` | | ++-------------------+------------------------+------------------------+ +| DELETE | ``/api | openedx.core.dj | +| | /instructor/v1/courses | angoapps.course_groups | +| | /{course_key}/cohorts/ | | +| | {cohort_id}/students`` | | ++-------------------+------------------------+------------------------+ +| POST | ``/api/instructor/ | openedx.core.dja | +| | v1/courses/{course_key | ngoapps.course_groups, | +| | }/cohorts/csv_upload`` | util | ++-------------------+------------------------+------------------------+ + +Discussion Management API +~~~~~~~~~~~~~~~~~~~~~~~~~ + ++-------------------+------------------------+------------------------+ +| Method | Endpoint | Services | ++===================+========================+========================+ +| GET | ``/api/instructor/ | discussion | +| | v1/courses/{course_key | | +| | }/discussions/topics`` | | ++-------------------+------------------------+------------------------+ +| POST | ``/api/instructor/ | discussion, | +| | v1/courses/{course_key | xmodule.modulestore | +| | }/discussions/topics`` | | ++-------------------+------------------------+------------------------+ +| PUT | ``/api/ | discussion | +| | instructor/v1/courses/ | | +| | {course_key}/discussio | | +| | ns/topics/{topic_id}`` | | ++-------------------+------------------------+------------------------+ +| DELETE | ``/api/ | discussion | +| | instructor/v1/courses/ | | +| | {course_key}/discussio | | +| | ns/topics/{topic_id}`` | | ++-------------------+------------------------+------------------------+ +| GET | ``/api/instructor/v1 | discussion | +| | /courses/{course_key}/ | | +| | discussions/settings`` | | ++-------------------+------------------------+------------------------+ +| PUT | ``/api/instructor/v1 | discussion | +| | /courses/{course_key}/ | | +| | discussions/settings`` | | ++-------------------+------------------------+------------------------+ + +Extensions & Deadlines API +~~~~~~~~~~~~~~~~~~~~~~~~~~ + ++-------------------+------------------------+------------------------+ +| Method | Endpoint | Services | ++===================+========================+========================+ +| GET | ``/api/ins | util.date_utils | +| | tructor/v1/courses/{co | | +| | urse_key}/extensions`` | | ++-------------------+------------------------+------------------------+ +| POST | ``/api/ins | util.date_utils | +| | tructor/v1/courses/{co | | +| | urse_key}/extensions`` | | ++-------------------+------------------------+------------------------+ +| PUT | ``/ | util.date_utils | +| | api/instructor/v1/cour | | +| | ses/{course_key}/exten | | +| | sions/{extension_id}`` | | ++-------------------+------------------------+------------------------+ +| DELETE | ``/ | util.date_utils | +| | api/instructor/v1/cour | | +| | ses/{course_key}/exten | | +| | sions/{extension_id}`` | | ++-------------------+------------------------+------------------------+ +| GET | ``/api/instructor/v1/ | util.date_utils, | +| | courses/{course_key}/e | student | +| | xtensions/{username}`` | | ++-------------------+------------------------+------------------------+ + +Data Export API +~~~~~~~~~~~~~~~ + ++-------------------+------------------------+------------------------+ +| Method | Endpoint | Services | ++===================+========================+========================+ +| GET | ``/api/instruc | instructor_task, util | +| | tor/v1/courses/{course | | +| | _key}/data_downloads`` | | ++-------------------+------------------------+------------------------+ +| POST | ``/api/instruc | instructor_task, util | +| | tor/v1/courses/{course | | +| | _key}/data_downloads`` | | ++-------------------+------------------------+------------------------+ +| GET | ``/api | instructor_task, util | +| | /instructor/v1/courses | | +| | /{course_key}/data_dow | | +| | nloads/{download_id}`` | | ++-------------------+------------------------+------------------------+ +| DELETE | ``/api | instructor_task, util | +| | /instructor/v1/courses | | +| | /{course_key}/data_dow | | +| | nloads/{download_id}`` | | ++-------------------+------------------------+------------------------+ +| POST | ``/api/in | instructor_task, | +| | structor/v1/courses/{c | student | +| | ourse_key}/data_downlo | | +| | ads/student_profiles`` | | ++-------------------+------------------------+------------------------+ +| POST | ``/ap | instructor_task, | +| | i/instructor/v1/course | grades | +| | s/{course_key}/data_do | | +| | wnloads/grade_report`` | | ++-------------------+------------------------+------------------------+ +| POST | ``/api/instru | instructor_task, | +| | ctor/v1/courses/{cours | grades | +| | e_key}/data_downloads/ | | +| | problem_grade_report`` | | ++-------------------+------------------------+------------------------+ +| POST | ``/api/in | instructor_task, | +| | structor/v1/courses/{c | xmodule.modulestore | +| | ourse_key}/data_downlo | | +| | ads/course_structure`` | | ++-------------------+------------------------+------------------------+ +| POST | ``/api/ | instructor_task, | +| | instructor/v1/courses/ | grades | +| | {course_key}/data_down | | +| | loads/survey_results`` | | ++-------------------+------------------------+------------------------+ + +Bulk Email API +~~~~~~~~~~~~~~ + ++-------------------+------------------------+------------------------+ +| Method | Endpoint | Services | ++===================+========================+========================+ +| GET | ``/api/ins | bulk_email | +| | tructor/v1/courses/{co | | +| | urse_key}/bulk_email`` | | ++-------------------+------------------------+------------------------+ +| POST | ``/api/ins | bulk_email, | +| | tructor/v1/courses/{co | instructor_task | +| | urse_key}/bulk_email`` | | ++-------------------+------------------------+------------------------+ +| GET | ``/api/instructor/v1/ | bulk_email | +| | courses/{course_key}/b | | +| | ulk_email/{email_id}`` | | ++-------------------+------------------------+------------------------+ +| GET | ``/api | bulk_email, | +| | /instructor/v1/courses | instructor_task | +| | /{course_key}/bulk_ema | | +| | il/{email_id}/status`` | | ++-------------------+------------------------+------------------------+ +| DELETE | ``/api/instructor/v1/ | bulk_email | +| | courses/{course_key}/b | | +| | ulk_email/{email_id}`` | | ++-------------------+------------------------+------------------------+ +| GET | ``/api/instruct | bulk_email | +| | or/v1/courses/{course_ | | +| | key}/email_templates`` | | ++-------------------+------------------------+------------------------+ + +Special Exams API +~~~~~~~~~~~~~~~~~ + ++-------------------+------------------------+------------------------+ +| Method | Endpoint | Services | ++===================+========================+========================+ +| GET | ``/api/instru | edx_proctoring, grades | +| | ctor/v1/courses/{cours | | +| | e_key}/special_exams`` | | ++-------------------+------------------------+------------------------+ +| GET | ` | edx_proctoring, grades | +| | `/api/instructor/v1/co | | +| | urses/{course_key}/spe | | +| | cial_exams/{exam_id}`` | | ++-------------------+------------------------+------------------------+ +| POST | ``/api/instructor/ | edx_proctoring, | +| | v1/courses/{course_key | InstructorService | +| | }/special_exams/{exam_ | | +| | id}/reset/{username}`` | | ++-------------------+------------------------+------------------------+ +| GET | ``/api/ins | edx_proctoring, grades | +| | tructor/v1/courses/{co | | +| | urse_key}/special_exam | | +| | s/{exam_id}/attempts`` | | ++-------------------+------------------------+------------------------+ +| GET | ``/api/instructor/v | edx_proctoring | +| | 1/courses/{course_key} | | +| | /proctoring_settings`` | | ++-------------------+------------------------+------------------------+ +| PUT | ``/api/instructor/v | edx_proctoring | +| | 1/courses/{course_key} | | +| | /proctoring_settings`` | | ++-------------------+------------------------+------------------------+ +| POST | ``/api/inst | edx_proctoring, | +| | ructor/v1/courses/{cou | student | +| | rse_key}/special_exams | | +| | /{exam_id}/allowance`` | | ++-------------------+------------------------+------------------------+ + +Certificates API +~~~~~~~~~~~~~~~~ + ++-------------------+------------------------+------------------------+ +| Method | Endpoint | Services | ++===================+========================+========================+ +| GET | ``/api/instr | certificates | +| | uctor/v1/courses/{cour | | +| | se_key}/certificates`` | | ++-------------------+------------------------+------------------------+ +| POST | ``/api/instructor/v1/ | certificates, | +| | courses/{course_key}/c | instructor_task | +| | ertificates/generate`` | | ++-------------------+------------------------+------------------------+ +| POST | ``/api/ins | certificates, student | +| | tructor/v1/courses/{co | | +| | urse_key}/certificates | | +| | /generate/{username}`` | | ++-------------------+------------------------+------------------------+ +| POST | ``/a | certificates, | +| | pi/instructor/v1/cours | instructor_task | +| | es/{course_key}/certif | | +| | icates/generate_bulk`` | | ++-------------------+------------------------+------------------------+ +| GET | ``/api/instructor/v1/c | certificates | +| | ourses/{course_key}/ce | | +| | rtificates/allowlist`` | | ++-------------------+------------------------+------------------------+ +| POST | ``/api/instructor/v1/c | certificates, student | +| | ourses/{course_key}/ce | | +| | rtificates/allowlist`` | | ++-------------------+------------------------+------------------------+ +| DELETE | ``/api/instructor/v1/c | certificates | +| | ourses/{course_key}/ce | | +| | rtificates/allowlist`` | | ++-------------------+------------------------+------------------------+ +| GET | ``/api/instruc | certificates | +| | tor/v1/courses/{course | | +| | _key}/certificates/{ce | | +| | rtificate_id}/status`` | | ++-------------------+------------------------+------------------------+ + +Open Response Assessment API +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ++-------------------+------------------------+------------------------+ +| Method | Endpoint | Services | ++===================+========================+========================+ +| GET | ``/ | ora_staff_grader, | +| | api/instructor/v1/cour | xmodule.modulestore | +| | ses/{course_key}/ora`` | | ++-------------------+------------------------+------------------------+ +| GET | ``/api/instr | ora_staff_grader, | +| | uctor/v1/courses/{cour | xmodule.modulestore | +| | se_key}/ora/{ora_id}`` | | ++-------------------+------------------------+------------------------+ +| GET | `` | ora_staff_grader | +| | /api/instructor/v1/cou | | +| | rses/{course_key}/ora/ | | +| | {ora_id}/submissions`` | | ++-------------------+------------------------+------------------------+ +| GET | ``/api/instructor/ | ora_staff_grader | +| | v1/courses/{course_key | | +| | }/ora/{ora_id}/submiss | | +| | ions/{submission_id}`` | | ++-------------------+------------------------+------------------------+ +| POST | ``/api/inst | ora_staff_grader | +| | ructor/v1/courses/{cou | | +| | rse_key}/ora/{ora_id}/ | | +| | submissions/{submissio | | +| | n_id}/override_grade`` | | ++-------------------+------------------------+------------------------+ +| POST | `` | ora_staff_grader | +| | /api/instructor/v1/cou | | +| | rses/{course_key}/ora/ | | +| | {ora_id}/submissions/{ | | +| | submission_id}/reset`` | | ++-------------------+------------------------+------------------------+ + +Analytics API +~~~~~~~~~~~~~ + ++-------------------+------------------------+------------------------+ +| Method | Endpoint | Services | ++===================+========================+========================+ +| GET | ` | instructor_analytics | +| | `/api/instructor/v1/co | | +| | urses/{course_key}/ana | | +| | lytics/dashboard_url`` | | ++-------------------+------------------------+------------------------+ +| GET | ``/api/instructor | instructor_analytics, | +| | /v1/courses/{course_ke | student | +| | y}/analytics/summary`` | | ++-------------------+------------------------+------------------------+ +| GET | ``/api/instructor/v1 | instructor_analytics | +| | /courses/{course_key}/ | | +| | analytics/engagement`` | | ++-------------------+------------------------+------------------------+ +| GET | ``/api/instructor/v1/ | instructor_analytics, | +| | courses/{course_key}/a | grades | +| | nalytics/performance`` | | ++-------------------+------------------------+------------------------+ +| GET | ``/a | instructor_analytics, | +| | pi/instructor/v1/cours | enrollments | +| | es/{course_key}/analyt | | +| | ics/enrollment_stats`` | | ++-------------------+------------------------+------------------------+ diff --git a/docs/decisions/0003-instructor-dashboard-rest-api-architecture.rst b/docs/decisions/0003-instructor-dashboard-rest-api-architecture.rst deleted file mode 100644 index 9a2fd269..00000000 --- a/docs/decisions/0003-instructor-dashboard-rest-api-architecture.rst +++ /dev/null @@ -1,145 +0,0 @@ -# ADR-0003 Instructor Dashboard REST API Architecture - -## Decision -Implement unified Instructor Dashboard REST API with service orchestration pattern organizing 90 endpoints across 12 functional domains. - -## API Endpoints & Services - -### Course Information API -| Method | Endpoint | Services | -|--------|----------|----------| -| GET | `/api/instructor/v1/courses/{course_key}/info` | instructor, xmodule.modulestore | -| PUT | `/api/instructor/v1/courses/{course_key}/info` | instructor, xmodule.modulestore | -| GET | `/api/instructor/v1/courses/{course_key}/instructor_tasks` | instructor_task | -| GET | `/api/instructor/v1/courses/{course_key}/modes` | course_modes | -| PUT | `/api/instructor/v1/courses/{course_key}/modes/{mode_id}/price` | course_modes | - -### Membership Management API -| Method | Endpoint | Services | -|--------|----------|----------| -| GET | `/api/instructor/v1/courses/{course_key}/enrollment` | enrollments, student | -| POST | `/api/instructor/v1/courses/{course_key}/enrollment` | enrollments, student | -| DELETE | `/api/instructor/v1/courses/{course_key}/enrollment` | enrollments, student | -| POST | `/api/instructor/v1/courses/{course_key}/enrollment/batch` | bulk_enroll, bulk_email | -| POST | `/api/instructor/v1/courses/{course_key}/enrollment/csv_upload` | bulk_enroll, util | -| GET | `/api/instructor/v1/courses/{course_key}/roles` | student.auth | -| POST | `/api/instructor/v1/courses/{course_key}/roles` | student.auth | -| DELETE | `/api/instructor/v1/courses/{course_key}/roles` | student.auth | -| GET | `/api/instructor/v1/courses/{course_key}/roles/{role_type}/members` | student.auth | -| GET | `/api/instructor/v1/courses/{course_key}/beta_testers` | student.auth | -| POST | `/api/instructor/v1/courses/{course_key}/beta_testers` | student.auth | -| DELETE | `/api/instructor/v1/courses/{course_key}/beta_testers` | student.auth | -| GET | `/api/instructor/v1/courses/{course_key}/forum/members` | discussion, student.auth | -| POST | `/api/instructor/v1/courses/{course_key}/forum/members` | discussion, student.auth | -| DELETE | `/api/instructor/v1/courses/{course_key}/forum/members` | discussion, student.auth | - -### Student Administration API -| Method | Endpoint | Services | -|--------|----------|----------| -| GET | `/api/instructor/v1/courses/{course_key}/students` | student, instructor | -| GET | `/api/instructor/v1/courses/{course_key}/students/{username}` | student, instructor | -| GET | `/api/instructor/v1/courses/{course_key}/students/{username}/enrollment_status` | enrollments | -| GET | `/api/instructor/v1/courses/{course_key}/students/{username}/progress_url` | student, instructor | -| POST | `/api/instructor/v1/courses/{course_key}/students/{username}/reset_attempts` | grades, xmodule.modulestore, instructor_task | -| POST | `/api/instructor/v1/courses/{course_key}/students/{username}/reset_entrance_exam` | grades, xmodule.modulestore | -| POST | `/api/instructor/v1/courses/{course_key}/students/{username}/rescore_problem` | grades, xmodule.modulestore, instructor_task | -| POST | `/api/instructor/v1/courses/{course_key}/students/{username}/override_score` | grades, xmodule.modulestore | -| POST | `/api/instructor/v1/courses/{course_key}/students/{username}/delete_state` | student, xmodule.modulestore | -| POST | `/api/instructor/v1/courses/{course_key}/problems/{problem_id}/reset_attempts_all` | grades, xmodule.modulestore, instructor_task | -| POST | `/api/instructor/v1/courses/{course_key}/problems/{problem_id}/rescore_all` | grades, xmodule.modulestore, instructor_task | - -### Cohort Management API -| Method | Endpoint | Services | -|--------|----------|----------| -| GET | `/api/instructor/v1/courses/{course_key}/cohorts` | openedx.core.djangoapps.course_groups | -| POST | `/api/instructor/v1/courses/{course_key}/cohorts` | openedx.core.djangoapps.course_groups | -| PUT | `/api/instructor/v1/courses/{course_key}/cohorts/{cohort_id}` | openedx.core.djangoapps.course_groups | -| DELETE | `/api/instructor/v1/courses/{course_key}/cohorts/{cohort_id}` | openedx.core.djangoapps.course_groups | -| POST | `/api/instructor/v1/courses/{course_key}/cohorts/{cohort_id}/students` | openedx.core.djangoapps.course_groups | -| DELETE | `/api/instructor/v1/courses/{course_key}/cohorts/{cohort_id}/students` | openedx.core.djangoapps.course_groups | -| POST | `/api/instructor/v1/courses/{course_key}/cohorts/csv_upload` | openedx.core.djangoapps.course_groups, util | - -### Discussion Management API -| Method | Endpoint | Services | -|--------|----------|----------| -| GET | `/api/instructor/v1/courses/{course_key}/discussions/topics` | discussion | -| POST | `/api/instructor/v1/courses/{course_key}/discussions/topics` | discussion, xmodule.modulestore | -| PUT | `/api/instructor/v1/courses/{course_key}/discussions/topics/{topic_id}` | discussion | -| DELETE | `/api/instructor/v1/courses/{course_key}/discussions/topics/{topic_id}` | discussion | -| GET | `/api/instructor/v1/courses/{course_key}/discussions/settings` | discussion | -| PUT | `/api/instructor/v1/courses/{course_key}/discussions/settings` | discussion | - -### Extensions & Deadlines API -| Method | Endpoint | Services | -|--------|----------|----------| -| GET | `/api/instructor/v1/courses/{course_key}/extensions` | util.date_utils | -| POST | `/api/instructor/v1/courses/{course_key}/extensions` | util.date_utils | -| PUT | `/api/instructor/v1/courses/{course_key}/extensions/{extension_id}` | util.date_utils | -| DELETE | `/api/instructor/v1/courses/{course_key}/extensions/{extension_id}` | util.date_utils | -| GET | `/api/instructor/v1/courses/{course_key}/extensions/{username}` | util.date_utils, student | - -### Data Export API -| Method | Endpoint | Services | -|--------|----------|----------| -| GET | `/api/instructor/v1/courses/{course_key}/data_downloads` | instructor_task, util | -| POST | `/api/instructor/v1/courses/{course_key}/data_downloads` | instructor_task, util | -| GET | `/api/instructor/v1/courses/{course_key}/data_downloads/{download_id}` | instructor_task, util | -| DELETE | `/api/instructor/v1/courses/{course_key}/data_downloads/{download_id}` | instructor_task, util | -| POST | `/api/instructor/v1/courses/{course_key}/data_downloads/student_profiles` | instructor_task, student | -| POST | `/api/instructor/v1/courses/{course_key}/data_downloads/grade_report` | instructor_task, grades | -| POST | `/api/instructor/v1/courses/{course_key}/data_downloads/problem_grade_report` | instructor_task, grades | -| POST | `/api/instructor/v1/courses/{course_key}/data_downloads/course_structure` | instructor_task, xmodule.modulestore | -| POST | `/api/instructor/v1/courses/{course_key}/data_downloads/survey_results` | instructor_task, grades | - -### Bulk Email API -| Method | Endpoint | Services | -|--------|----------|----------| -| GET | `/api/instructor/v1/courses/{course_key}/bulk_email` | bulk_email | -| POST | `/api/instructor/v1/courses/{course_key}/bulk_email` | bulk_email, instructor_task | -| GET | `/api/instructor/v1/courses/{course_key}/bulk_email/{email_id}` | bulk_email | -| GET | `/api/instructor/v1/courses/{course_key}/bulk_email/{email_id}/status` | bulk_email, instructor_task | -| DELETE | `/api/instructor/v1/courses/{course_key}/bulk_email/{email_id}` | bulk_email | -| GET | `/api/instructor/v1/courses/{course_key}/email_templates` | bulk_email | - -### Special Exams API -| Method | Endpoint | Services | -|--------|----------|----------| -| GET | `/api/instructor/v1/courses/{course_key}/special_exams` | edx_proctoring, grades | -| GET | `/api/instructor/v1/courses/{course_key}/special_exams/{exam_id}` | edx_proctoring, grades | -| POST | `/api/instructor/v1/courses/{course_key}/special_exams/{exam_id}/reset/{username}` | edx_proctoring, InstructorService | -| GET | `/api/instructor/v1/courses/{course_key}/special_exams/{exam_id}/attempts` | edx_proctoring, grades | -| GET | `/api/instructor/v1/courses/{course_key}/proctoring_settings` | edx_proctoring | -| PUT | `/api/instructor/v1/courses/{course_key}/proctoring_settings` | edx_proctoring | -| POST | `/api/instructor/v1/courses/{course_key}/special_exams/{exam_id}/allowance` | edx_proctoring, student | - -### Certificates API -| Method | Endpoint | Services | -|--------|----------|----------| -| GET | `/api/instructor/v1/courses/{course_key}/certificates` | certificates | -| POST | `/api/instructor/v1/courses/{course_key}/certificates/generate` | certificates, instructor_task | -| POST | `/api/instructor/v1/courses/{course_key}/certificates/generate/{username}` | certificates, student | -| POST | `/api/instructor/v1/courses/{course_key}/certificates/generate_bulk` | certificates, instructor_task | -| GET | `/api/instructor/v1/courses/{course_key}/certificates/allowlist` | certificates | -| POST | `/api/instructor/v1/courses/{course_key}/certificates/allowlist` | certificates, student | -| DELETE | `/api/instructor/v1/courses/{course_key}/certificates/allowlist` | certificates | -| GET | `/api/instructor/v1/courses/{course_key}/certificates/{certificate_id}/status` | certificates | - -### Open Response Assessment API -| Method | Endpoint | Services | -|--------|----------|----------| -| GET | `/api/instructor/v1/courses/{course_key}/ora` | ora_staff_grader, xmodule.modulestore | -| GET | `/api/instructor/v1/courses/{course_key}/ora/{ora_id}` | ora_staff_grader, xmodule.modulestore | -| GET | `/api/instructor/v1/courses/{course_key}/ora/{ora_id}/submissions` | ora_staff_grader | -| GET | `/api/instructor/v1/courses/{course_key}/ora/{ora_id}/submissions/{submission_id}` | ora_staff_grader | -| POST | `/api/instructor/v1/courses/{course_key}/ora/{ora_id}/submissions/{submission_id}/override_grade` | ora_staff_grader | -| POST | `/api/instructor/v1/courses/{course_key}/ora/{ora_id}/submissions/{submission_id}/reset` | ora_staff_grader | - -### Analytics API -| Method | Endpoint | Services | -|--------|----------|----------| -| GET | `/api/instructor/v1/courses/{course_key}/analytics/dashboard_url` | instructor_analytics | -| GET | `/api/instructor/v1/courses/{course_key}/analytics/summary` | instructor_analytics, student | -| GET | `/api/instructor/v1/courses/{course_key}/analytics/engagement` | instructor_analytics | -| GET | `/api/instructor/v1/courses/{course_key}/analytics/performance` | instructor_analytics, grades | -| GET | `/api/instructor/v1/courses/{course_key}/analytics/enrollment_stats` | instructor_analytics, enrollments | - From d82cdd854c4a8d3fb8cc97b1041e73cee253c524 Mon Sep 17 00:00:00 2001 From: Jesse Stewart Date: Mon, 8 Sep 2025 11:54:13 -0400 Subject: [PATCH 03/13] fix: md to rst --- ...ure.md => 0003-instructor-dashboard-rest-api-architecture.rst} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/decisions/{0003-instructor-dashboard-rest-api-architecture.md => 0003-instructor-dashboard-rest-api-architecture.rst} (100%) diff --git a/docs/decisions/0003-instructor-dashboard-rest-api-architecture.md b/docs/decisions/0003-instructor-dashboard-rest-api-architecture.rst similarity index 100% rename from docs/decisions/0003-instructor-dashboard-rest-api-architecture.md rename to docs/decisions/0003-instructor-dashboard-rest-api-architecture.rst From 5702ea53532422df3edba353ba96cc2175af9edf Mon Sep 17 00:00:00 2001 From: Jesse Stewart Date: Mon, 8 Sep 2025 12:06:43 -0400 Subject: [PATCH 04/13] fix: formatting of rst file --- ...ructor-dashboard-rest-api-architecture.rst | 680 ++++++------------ 1 file changed, 230 insertions(+), 450 deletions(-) diff --git a/docs/decisions/0003-instructor-dashboard-rest-api-architecture.rst b/docs/decisions/0003-instructor-dashboard-rest-api-architecture.rst index 4b896ea2..30b858ec 100644 --- a/docs/decisions/0003-instructor-dashboard-rest-api-architecture.rst +++ b/docs/decisions/0003-instructor-dashboard-rest-api-architecture.rst @@ -4,492 +4,272 @@ ADR-0003 Instructor Dashboard REST API Architecture Decision -------- -Implement unified Instructor Dashboard REST API with service -orchestration pattern organizing 90 endpoints across 12 functional -domains. +Implement unified Instructor Dashboard REST API with service orchestration +pattern organizing 90 endpoints across 12 functional domains. API Endpoints & Services ------------------------ Course Information API -~~~~~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^^^^^ -+-------------------+------------------------+------------------------+ -| Method | Endpoint | Services | -+===================+========================+========================+ -| GET | ``/a | instructor, | -| | pi/instructor/v1/cours | xmodule.modulestore | -| | es/{course_key}/info`` | | -+-------------------+------------------------+------------------------+ -| PUT | ``/a | instructor, | -| | pi/instructor/v1/cours | xmodule.modulestore | -| | es/{course_key}/info`` | | -+-------------------+------------------------+------------------------+ -| GET | ``/api/instructo | instructor_task | -| | r/v1/courses/{course_k | | -| | ey}/instructor_tasks`` | | -+-------------------+------------------------+------------------------+ -| GET | ``/ap | course_modes | -| | i/instructor/v1/course | | -| | s/{course_key}/modes`` | | -+-------------------+------------------------+------------------------+ -| PUT | ``/api/instructor/v1/ | course_modes | -| | courses/{course_key}/m | | -| | odes/{mode_id}/price`` | | -+-------------------+------------------------+------------------------+ ++--------+------------------------------------------------------------+---------------------------------------------+ +| Method | Endpoint | Services | ++========+============================================================+=============================================+ +| GET | /api/instructor/v1/courses/{course_key}/info | instructor, xmodule.modulestore | ++--------+------------------------------------------------------------+---------------------------------------------+ +| PUT | /api/instructor/v1/courses/{course_key}/info | instructor, xmodule.modulestore | ++--------+------------------------------------------------------------+---------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/instructor_tasks | instructor_task | ++--------+------------------------------------------------------------+---------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/modes | course_modes | ++--------+------------------------------------------------------------+---------------------------------------------+ +| PUT | /api/instructor/v1/courses/{course_key}/modes/{mode_id}/price | course_modes | ++--------+------------------------------------------------------------+---------------------------------------------+ Membership Management API -~~~~~~~~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^^^^^^^^ -+-------------------+------------------------+------------------------+ -| Method | Endpoint | Services | -+===================+========================+========================+ -| GET | ``/api/ins | enrollments, student | -| | tructor/v1/courses/{co | | -| | urse_key}/enrollment`` | | -+-------------------+------------------------+------------------------+ -| POST | ``/api/ins | enrollments, student | -| | tructor/v1/courses/{co | | -| | urse_key}/enrollment`` | | -+-------------------+------------------------+------------------------+ -| DELETE | ``/api/ins | enrollments, student | -| | tructor/v1/courses/{co | | -| | urse_key}/enrollment`` | | -+-------------------+------------------------+------------------------+ -| POST | ``/api/instructo | bulk_enroll, | -| | r/v1/courses/{course_k | bulk_email | -| | ey}/enrollment/batch`` | | -+-------------------+------------------------+------------------------+ -| POST | ``/api/instructor/v1/ | bulk_enroll, util | -| | courses/{course_key}/e | | -| | nrollment/csv_upload`` | | -+-------------------+------------------------+------------------------+ -| GET | ``/ap | student.auth | -| | i/instructor/v1/course | | -| | s/{course_key}/roles`` | | -+-------------------+------------------------+------------------------+ -| POST | ``/ap | student.auth | -| | i/instructor/v1/course | | -| | s/{course_key}/roles`` | | -+-------------------+------------------------+------------------------+ -| DELETE | ``/ap | student.auth | -| | i/instructor/v1/course | | -| | s/{course_key}/roles`` | | -+-------------------+------------------------+------------------------+ -| GET | ``/ | student.auth | -| | api/instructor/v1/cour | | -| | ses/{course_key}/roles | | -| | /{role_type}/members`` | | -+-------------------+------------------------+------------------------+ -| GET | ``/api/instr | student.auth | -| | uctor/v1/courses/{cour | | -| | se_key}/beta_testers`` | | -+-------------------+------------------------+------------------------+ -| POST | ``/api/instr | student.auth | -| | uctor/v1/courses/{cour | | -| | se_key}/beta_testers`` | | -+-------------------+------------------------+------------------------+ -| DELETE | ``/api/instr | student.auth | -| | uctor/v1/courses/{cour | | -| | se_key}/beta_testers`` | | -+-------------------+------------------------+------------------------+ -| GET | ``/api/instru | discussion, | -| | ctor/v1/courses/{cours | student.auth | -| | e_key}/forum/members`` | | -+-------------------+------------------------+------------------------+ -| POST | ``/api/instru | discussion, | -| | ctor/v1/courses/{cours | student.auth | -| | e_key}/forum/members`` | | -+-------------------+------------------------+------------------------+ -| DELETE | ``/api/instru | discussion, | -| | ctor/v1/courses/{cours | student.auth | -| | e_key}/forum/members`` | | -+-------------------+------------------------+------------------------+ ++--------+--------------------------------------------------------------------+--------------------------------+ +| Method | Endpoint | Services | ++========+====================================================================+================================+ +| GET | /api/instructor/v1/courses/{course_key}/enrollment | enrollments, student | ++--------+--------------------------------------------------------------------+--------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/enrollment | enrollments, student | ++--------+--------------------------------------------------------------------+--------------------------------+ +| DELETE | /api/instructor/v1/courses/{course_key}/enrollment | enrollments, student | ++--------+--------------------------------------------------------------------+--------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/enrollment/batch | bulk_enroll, bulk_email | ++--------+--------------------------------------------------------------------+--------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/enrollment/csv_upload | bulk_enroll, util | ++--------+--------------------------------------------------------------------+--------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/roles | student.auth | ++--------+--------------------------------------------------------------------+--------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/roles | student.auth | ++--------+--------------------------------------------------------------------+--------------------------------+ +| DELETE | /api/instructor/v1/courses/{course_key}/roles | student.auth | ++--------+--------------------------------------------------------------------+--------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/roles/{role_type}/members | student.auth | ++--------+--------------------------------------------------------------------+--------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/beta_testers | student.auth | ++--------+--------------------------------------------------------------------+--------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/beta_testers | student.auth | ++--------+--------------------------------------------------------------------+--------------------------------+ +| DELETE | /api/instructor/v1/courses/{course_key}/beta_testers | student.auth | ++--------+--------------------------------------------------------------------+--------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/forum/members | discussion, student.auth | ++--------+--------------------------------------------------------------------+--------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/forum/members | discussion, student.auth | ++--------+--------------------------------------------------------------------+--------------------------------+ +| DELETE | /api/instructor/v1/courses/{course_key}/forum/members | discussion, student.auth | ++--------+--------------------------------------------------------------------+--------------------------------+ Student Administration API -~~~~~~~~~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^^^^^^^^^ -+-------------------+------------------------+------------------------+ -| Method | Endpoint | Services | -+===================+========================+========================+ -| GET | ``/api/i | student, instructor | -| | nstructor/v1/courses/{ | | -| | course_key}/students`` | | -+-------------------+------------------------+------------------------+ -| GET | ``/api/instructor/v | student, instructor | -| | 1/courses/{course_key} | | -| | /students/{username}`` | | -+-------------------+------------------------+------------------------+ -| GET | ``/api/instruct | enrollments | -| | or/v1/courses/{course_ | | -| | key}/students/{usernam | | -| | e}/enrollment_status`` | | -+-------------------+------------------------+------------------------+ -| GET | ``/api/ins | student, instructor | -| | tructor/v1/courses/{co | | -| | urse_key}/students/{us | | -| | ername}/progress_url`` | | -+-------------------+------------------------+------------------------+ -| POST | ``/api/instr | grades, | -| | uctor/v1/courses/{cour | xmodule.modulestore, | -| | se_key}/students/{user | instructor_task | -| | name}/reset_attempts`` | | -+-------------------+------------------------+------------------------+ -| POST | ``/api/instructor | grades, | -| | /v1/courses/{course_ke | xmodule.modulestore | -| | y}/students/{username} | | -| | /reset_entrance_exam`` | | -+-------------------+------------------------+------------------------+ -| POST | ``/api/instru | grades, | -| | ctor/v1/courses/{cours | xmodule.modulestore, | -| | e_key}/students/{usern | instructor_task | -| | ame}/rescore_problem`` | | -+-------------------+------------------------+------------------------+ -| POST | ``/api/instr | grades, | -| | uctor/v1/courses/{cour | xmodule.modulestore | -| | se_key}/students/{user | | -| | name}/override_score`` | | -+-------------------+------------------------+------------------------+ -| POST | ``/api/ins | student, | -| | tructor/v1/courses/{co | xmodule.modulestore | -| | urse_key}/students/{us | | -| | ername}/delete_state`` | | -+-------------------+------------------------+------------------------+ -| POST | ``/api/instructor/ | grades, | -| | v1/courses/{course_key | xmodule.modulestore, | -| | }/problems/{problem_id | instructor_task | -| | }/reset_attempts_all`` | | -+-------------------+------------------------+------------------------+ -| POST | ``/api/inst | grades, | -| | ructor/v1/courses/{cou | xmodule.modulestore, | -| | rse_key}/problems/{pro | instructor_task | -| | blem_id}/rescore_all`` | | -+-------------------+------------------------+------------------------+ ++--------+----------------------------------------------------------------------------+--------------------------------------------------+ +| Method | Endpoint | Services | ++========+============================================================================+==================================================+ +| GET | /api/instructor/v1/courses/{course_key}/students | student, instructor | ++--------+----------------------------------------------------------------------------+--------------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/students/{username} | student, instructor | ++--------+----------------------------------------------------------------------------+--------------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/students/{username}/enrollment_status | enrollments | ++--------+----------------------------------------------------------------------------+--------------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/students/{username}/progress_url | student, instructor | ++--------+----------------------------------------------------------------------------+--------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/students/{username}/reset_attempts | grades, xmodule.modulestore, instructor_task | ++--------+----------------------------------------------------------------------------+--------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/students/{username}/reset_entrance_exam | grades, xmodule.modulestore | ++--------+----------------------------------------------------------------------------+--------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/students/{username}/rescore_problem | grades, xmodule.modulestore, instructor_task | ++--------+----------------------------------------------------------------------------+--------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/students/{username}/override_score | grades, xmodule.modulestore | ++--------+----------------------------------------------------------------------------+--------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/students/{username}/delete_state | student, xmodule.modulestore | ++--------+----------------------------------------------------------------------------+--------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/problems/{problem_id}/reset_attempts_all | grades, xmodule.modulestore, instructor_task | ++--------+----------------------------------------------------------------------------+--------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/problems/{problem_id}/rescore_all | grades, xmodule.modulestore, instructor_task | ++--------+----------------------------------------------------------------------------+--------------------------------------------------+ Cohort Management API -~~~~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^^^^ -+-------------------+------------------------+------------------------+ -| Method | Endpoint | Services | -+===================+========================+========================+ -| GET | ``/api/ | openedx.core.dj | -| | instructor/v1/courses/ | angoapps.course_groups | -| | {course_key}/cohorts`` | | -+-------------------+------------------------+------------------------+ -| POST | ``/api/ | openedx.core.dj | -| | instructor/v1/courses/ | angoapps.course_groups | -| | {course_key}/cohorts`` | | -+-------------------+------------------------+------------------------+ -| PUT | ``/api/instructor/v | openedx.core.dj | -| | 1/courses/{course_key} | angoapps.course_groups | -| | /cohorts/{cohort_id}`` | | -+-------------------+------------------------+------------------------+ -| DELETE | ``/api/instructor/v | openedx.core.dj | -| | 1/courses/{course_key} | angoapps.course_groups | -| | /cohorts/{cohort_id}`` | | -+-------------------+------------------------+------------------------+ -| POST | ``/api | openedx.core.dj | -| | /instructor/v1/courses | angoapps.course_groups | -| | /{course_key}/cohorts/ | | -| | {cohort_id}/students`` | | -+-------------------+------------------------+------------------------+ -| DELETE | ``/api | openedx.core.dj | -| | /instructor/v1/courses | angoapps.course_groups | -| | /{course_key}/cohorts/ | | -| | {cohort_id}/students`` | | -+-------------------+------------------------+------------------------+ -| POST | ``/api/instructor/ | openedx.core.dja | -| | v1/courses/{course_key | ngoapps.course_groups, | -| | }/cohorts/csv_upload`` | util | -+-------------------+------------------------+------------------------+ ++--------+------------------------------------------------------------------------------------+--------------------------------------------+ +| Method | Endpoint | Services | ++========+====================================================================================+============================================+ +| GET | /api/instructor/v1/courses/{course_key}/cohorts | openedx.core.djangoapps.course_groups | ++--------+------------------------------------------------------------------------------------+--------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/cohorts | openedx.core.djangoapps.course_groups | ++--------+------------------------------------------------------------------------------------+--------------------------------------------+ +| PUT | /api/instructor/v1/courses/{course_key}/cohorts/{cohort_id} | openedx.core.djangoapps.course_groups | ++--------+------------------------------------------------------------------------------------+--------------------------------------------+ +| DELETE | /api/instructor/v1/courses/{course_key}/cohorts/{cohort_id} | openedx.core.djangoapps.course_groups | ++--------+------------------------------------------------------------------------------------+--------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/cohorts/{cohort_id}/students | openedx.core.djangoapps.course_groups | ++--------+------------------------------------------------------------------------------------+--------------------------------------------+ +| DELETE | /api/instructor/v1/courses/{course_key}/cohorts/{cohort_id}/students | openedx.core.djangoapps.course_groups | ++--------+------------------------------------------------------------------------------------+--------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/cohorts/csv_upload | openedx.core.djangoapps.course_groups, util| ++--------+------------------------------------------------------------------------------------+--------------------------------------------+ Discussion Management API -~~~~~~~~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^^^^^^^^ -+-------------------+------------------------+------------------------+ -| Method | Endpoint | Services | -+===================+========================+========================+ -| GET | ``/api/instructor/ | discussion | -| | v1/courses/{course_key | | -| | }/discussions/topics`` | | -+-------------------+------------------------+------------------------+ -| POST | ``/api/instructor/ | discussion, | -| | v1/courses/{course_key | xmodule.modulestore | -| | }/discussions/topics`` | | -+-------------------+------------------------+------------------------+ -| PUT | ``/api/ | discussion | -| | instructor/v1/courses/ | | -| | {course_key}/discussio | | -| | ns/topics/{topic_id}`` | | -+-------------------+------------------------+------------------------+ -| DELETE | ``/api/ | discussion | -| | instructor/v1/courses/ | | -| | {course_key}/discussio | | -| | ns/topics/{topic_id}`` | | -+-------------------+------------------------+------------------------+ -| GET | ``/api/instructor/v1 | discussion | -| | /courses/{course_key}/ | | -| | discussions/settings`` | | -+-------------------+------------------------+------------------------+ -| PUT | ``/api/instructor/v1 | discussion | -| | /courses/{course_key}/ | | -| | discussions/settings`` | | -+-------------------+------------------------+------------------------+ ++--------+------------------------------------------------------------------------------------+-----------------------------------------+ +| Method | Endpoint | Services | ++========+====================================================================================+=========================================+ +| GET | /api/instructor/v1/courses/{course_key}/discussions/topics | discussion | ++--------+------------------------------------------------------------------------------------+-----------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/discussions/topics | discussion, xmodule.modulestore | ++--------+------------------------------------------------------------------------------------+-----------------------------------------+ +| PUT | /api/instructor/v1/courses/{course_key}/discussions/topics/{topic_id} | discussion | ++--------+------------------------------------------------------------------------------------+-----------------------------------------+ +| DELETE | /api/instructor/v1/courses/{course_key}/discussions/topics/{topic_id} | discussion | ++--------+------------------------------------------------------------------------------------+-----------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/discussions/settings | discussion | ++--------+------------------------------------------------------------------------------------+-----------------------------------------+ +| PUT | /api/instructor/v1/courses/{course_key}/discussions/settings | discussion | ++--------+------------------------------------------------------------------------------------+-----------------------------------------+ Extensions & Deadlines API -~~~~~~~~~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^^^^^^^^^ -+-------------------+------------------------+------------------------+ -| Method | Endpoint | Services | -+===================+========================+========================+ -| GET | ``/api/ins | util.date_utils | -| | tructor/v1/courses/{co | | -| | urse_key}/extensions`` | | -+-------------------+------------------------+------------------------+ -| POST | ``/api/ins | util.date_utils | -| | tructor/v1/courses/{co | | -| | urse_key}/extensions`` | | -+-------------------+------------------------+------------------------+ -| PUT | ``/ | util.date_utils | -| | api/instructor/v1/cour | | -| | ses/{course_key}/exten | | -| | sions/{extension_id}`` | | -+-------------------+------------------------+------------------------+ -| DELETE | ``/ | util.date_utils | -| | api/instructor/v1/cour | | -| | ses/{course_key}/exten | | -| | sions/{extension_id}`` | | -+-------------------+------------------------+------------------------+ -| GET | ``/api/instructor/v1/ | util.date_utils, | -| | courses/{course_key}/e | student | -| | xtensions/{username}`` | | -+-------------------+------------------------+------------------------+ ++--------+-----------------------------------------------------------------------------------+----------------------------------+ +| Method | Endpoint | Services | ++========+===================================================================================+==================================+ +| GET | /api/instructor/v1/courses/{course_key}/extensions | util.date_utils | ++--------+-----------------------------------------------------------------------------------+----------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/extensions | util.date_utils | ++--------+-----------------------------------------------------------------------------------+----------------------------------+ +| PUT | /api/instructor/v1/courses/{course_key}/extensions/{extension_id} | util.date_utils | ++--------+-----------------------------------------------------------------------------------+----------------------------------+ +| DELETE | /api/instructor/v1/courses/{course_key}/extensions/{extension_id} | util.date_utils | ++--------+-----------------------------------------------------------------------------------+----------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/extensions/{username} | util.date_utils, student | ++--------+-----------------------------------------------------------------------------------+----------------------------------+ Data Export API -~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^ -+-------------------+------------------------+------------------------+ -| Method | Endpoint | Services | -+===================+========================+========================+ -| GET | ``/api/instruc | instructor_task, util | -| | tor/v1/courses/{course | | -| | _key}/data_downloads`` | | -+-------------------+------------------------+------------------------+ -| POST | ``/api/instruc | instructor_task, util | -| | tor/v1/courses/{course | | -| | _key}/data_downloads`` | | -+-------------------+------------------------+------------------------+ -| GET | ``/api | instructor_task, util | -| | /instructor/v1/courses | | -| | /{course_key}/data_dow | | -| | nloads/{download_id}`` | | -+-------------------+------------------------+------------------------+ -| DELETE | ``/api | instructor_task, util | -| | /instructor/v1/courses | | -| | /{course_key}/data_dow | | -| | nloads/{download_id}`` | | -+-------------------+------------------------+------------------------+ -| POST | ``/api/in | instructor_task, | -| | structor/v1/courses/{c | student | -| | ourse_key}/data_downlo | | -| | ads/student_profiles`` | | -+-------------------+------------------------+------------------------+ -| POST | ``/ap | instructor_task, | -| | i/instructor/v1/course | grades | -| | s/{course_key}/data_do | | -| | wnloads/grade_report`` | | -+-------------------+------------------------+------------------------+ -| POST | ``/api/instru | instructor_task, | -| | ctor/v1/courses/{cours | grades | -| | e_key}/data_downloads/ | | -| | problem_grade_report`` | | -+-------------------+------------------------+------------------------+ -| POST | ``/api/in | instructor_task, | -| | structor/v1/courses/{c | xmodule.modulestore | -| | ourse_key}/data_downlo | | -| | ads/course_structure`` | | -+-------------------+------------------------+------------------------+ -| POST | ``/api/ | instructor_task, | -| | instructor/v1/courses/ | grades | -| | {course_key}/data_down | | -| | loads/survey_results`` | | -+-------------------+------------------------+------------------------+ ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+ +| Method | Endpoint | Services | ++========+===================================================================================+==============================================+ +| GET | /api/instructor/v1/courses/{course_key}/data_downloads | instructor_task, util | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/data_downloads | instructor_task, util | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/data_downloads/{download_id} | instructor_task, util | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+ +| DELETE | /api/instructor/v1/courses/{course_key}/data_downloads/{download_id} | instructor_task, util | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/data_downloads/student_profiles | instructor_task, student | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/data_downloads/grade_report | instructor_task, grades | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/data_downloads/problem_grade_report | instructor_task, grades | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/data_downloads/course_structure | instructor_task, xmodule.modulestore | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/data_downloads/survey_results | instructor_task, grades | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+ Bulk Email API -~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^ -+-------------------+------------------------+------------------------+ -| Method | Endpoint | Services | -+===================+========================+========================+ -| GET | ``/api/ins | bulk_email | -| | tructor/v1/courses/{co | | -| | urse_key}/bulk_email`` | | -+-------------------+------------------------+------------------------+ -| POST | ``/api/ins | bulk_email, | -| | tructor/v1/courses/{co | instructor_task | -| | urse_key}/bulk_email`` | | -+-------------------+------------------------+------------------------+ -| GET | ``/api/instructor/v1/ | bulk_email | -| | courses/{course_key}/b | | -| | ulk_email/{email_id}`` | | -+-------------------+------------------------+------------------------+ -| GET | ``/api | bulk_email, | -| | /instructor/v1/courses | instructor_task | -| | /{course_key}/bulk_ema | | -| | il/{email_id}/status`` | | -+-------------------+------------------------+------------------------+ -| DELETE | ``/api/instructor/v1/ | bulk_email | -| | courses/{course_key}/b | | -| | ulk_email/{email_id}`` | | -+-------------------+------------------------+------------------------+ -| GET | ``/api/instruct | bulk_email | -| | or/v1/courses/{course_ | | -| | key}/email_templates`` | | -+-------------------+------------------------+------------------------+ ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+ +| Method | Endpoint | Services | ++========+===================================================================================+==============================================+ +| GET | /api/instructor/v1/courses/{course_key}/bulk_email | bulk_email | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/bulk_email | bulk_email, instructor_task | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/bulk_email/{email_id} | bulk_email | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/bulk_email/{email_id}/status | bulk_email, instructor_task | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+ +| DELETE | /api/instructor/v1/courses/{course_key}/bulk_email/{email_id} | bulk_email | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/email_templates | bulk_email | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+ Special Exams API -~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^ -+-------------------+------------------------+------------------------+ -| Method | Endpoint | Services | -+===================+========================+========================+ -| GET | ``/api/instru | edx_proctoring, grades | -| | ctor/v1/courses/{cours | | -| | e_key}/special_exams`` | | -+-------------------+------------------------+------------------------+ -| GET | ` | edx_proctoring, grades | -| | `/api/instructor/v1/co | | -| | urses/{course_key}/spe | | -| | cial_exams/{exam_id}`` | | -+-------------------+------------------------+------------------------+ -| POST | ``/api/instructor/ | edx_proctoring, | -| | v1/courses/{course_key | InstructorService | -| | }/special_exams/{exam_ | | -| | id}/reset/{username}`` | | -+-------------------+------------------------+------------------------+ -| GET | ``/api/ins | edx_proctoring, grades | -| | tructor/v1/courses/{co | | -| | urse_key}/special_exam | | -| | s/{exam_id}/attempts`` | | -+-------------------+------------------------+------------------------+ -| GET | ``/api/instructor/v | edx_proctoring | -| | 1/courses/{course_key} | | -| | /proctoring_settings`` | | -+-------------------+------------------------+------------------------+ -| PUT | ``/api/instructor/v | edx_proctoring | -| | 1/courses/{course_key} | | -| | /proctoring_settings`` | | -+-------------------+------------------------+------------------------+ -| POST | ``/api/inst | edx_proctoring, | -| | ructor/v1/courses/{cou | student | -| | rse_key}/special_exams | | -| | /{exam_id}/allowance`` | | -+-------------------+------------------------+------------------------+ ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+ +| Method | Endpoint | Services | ++========+===================================================================================+==============================================+ +| GET | /api/instructor/v1/courses/{course_key}/special_exams | edx_proctoring, grades | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/special_exams/{exam_id} | edx_proctoring, grades | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/special_exams/{exam_id}/reset/{username} | edx_proctoring, InstructorService | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/special_exams/{exam_id}/attempts | edx_proctoring, grades | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/proctoring_settings | edx_proctoring | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+ +| PUT | /api/instructor/v1/courses/{course_key}/proctoring_settings | edx_proctoring | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/special_exams/{exam_id}/allowance | edx_proctoring, student | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+ Certificates API -~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^ -+-------------------+------------------------+------------------------+ -| Method | Endpoint | Services | -+===================+========================+========================+ -| GET | ``/api/instr | certificates | -| | uctor/v1/courses/{cour | | -| | se_key}/certificates`` | | -+-------------------+------------------------+------------------------+ -| POST | ``/api/instructor/v1/ | certificates, | -| | courses/{course_key}/c | instructor_task | -| | ertificates/generate`` | | -+-------------------+------------------------+------------------------+ -| POST | ``/api/ins | certificates, student | -| | tructor/v1/courses/{co | | -| | urse_key}/certificates | | -| | /generate/{username}`` | | -+-------------------+------------------------+------------------------+ -| POST | ``/a | certificates, | -| | pi/instructor/v1/cours | instructor_task | -| | es/{course_key}/certif | | -| | icates/generate_bulk`` | | -+-------------------+------------------------+------------------------+ -| GET | ``/api/instructor/v1/c | certificates | -| | ourses/{course_key}/ce | | -| | rtificates/allowlist`` | | -+-------------------+------------------------+------------------------+ -| POST | ``/api/instructor/v1/c | certificates, student | -| | ourses/{course_key}/ce | | -| | rtificates/allowlist`` | | -+-------------------+------------------------+------------------------+ -| DELETE | ``/api/instructor/v1/c | certificates | -| | ourses/{course_key}/ce | | -| | rtificates/allowlist`` | | -+-------------------+------------------------+------------------------+ -| GET | ``/api/instruc | certificates | -| | tor/v1/courses/{course | | -| | _key}/certificates/{ce | | -| | rtificate_id}/status`` | | -+-------------------+------------------------+------------------------+ ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+ +| Method | Endpoint | Services | ++========+===================================================================================+==============================================+ +| GET | /api/instructor/v1/courses/{course_key}/certificates | certificates | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/certificates/generate | certificates, instructor_task | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/certificates/generate/{username} | certificates, student | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/certificates/generate_bulk | certificates, instructor_task | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/certificates/allowlist | certificates | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/certificates/allowlist | certificates, student | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+ +| DELETE | /api/instructor/v1/courses/{course_key}/certificates/allowlist | certificates | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/certificates/{certificate_id}/status | certificates | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+ Open Response Assessment API -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -+-------------------+------------------------+------------------------+ -| Method | Endpoint | Services | -+===================+========================+========================+ -| GET | ``/ | ora_staff_grader, | -| | api/instructor/v1/cour | xmodule.modulestore | -| | ses/{course_key}/ora`` | | -+-------------------+------------------------+------------------------+ -| GET | ``/api/instr | ora_staff_grader, | -| | uctor/v1/courses/{cour | xmodule.modulestore | -| | se_key}/ora/{ora_id}`` | | -+-------------------+------------------------+------------------------+ -| GET | `` | ora_staff_grader | -| | /api/instructor/v1/cou | | -| | rses/{course_key}/ora/ | | -| | {ora_id}/submissions`` | | -+-------------------+------------------------+------------------------+ -| GET | ``/api/instructor/ | ora_staff_grader | -| | v1/courses/{course_key | | -| | }/ora/{ora_id}/submiss | | -| | ions/{submission_id}`` | | -+-------------------+------------------------+------------------------+ -| POST | ``/api/inst | ora_staff_grader | -| | ructor/v1/courses/{cou | | -| | rse_key}/ora/{ora_id}/ | | -| | submissions/{submissio | | -| | n_id}/override_grade`` | | -+-------------------+------------------------+------------------------+ -| POST | `` | ora_staff_grader | -| | /api/instructor/v1/cou | | -| | rses/{course_key}/ora/ | | -| | {ora_id}/submissions/{ | | -| | submission_id}/reset`` | | -+-------------------+------------------------+------------------------+ ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+ +| Method | Endpoint | Services | ++========+===================================================================================+==============================================+ +| GET | /api/instructor/v1/courses/{course_key}/ora | ora_staff_grader, xmodule.modulestore | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/ora/{ora_id} | ora_staff_grader, xmodule.modulestore | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/ora/{ora_id}/submissions | ora_staff_grader | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/ora/{ora_id}/submissions/{submission_id} | ora_staff_grader | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/ora/{ora_id}/submissions/{submission_id}/override_grade | ora_staff_grader | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/ora/{ora_id}/submissions/{submission_id}/reset | ora_staff_grader | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+ Analytics API -~~~~~~~~~~~~~ +^^^^^^^^^^^^^ -+-------------------+------------------------+------------------------+ -| Method | Endpoint | Services | -+===================+========================+========================+ -| GET | ` | instructor_analytics | -| | `/api/instructor/v1/co | | -| | urses/{course_key}/ana | | -| | lytics/dashboard_url`` | | -+-------------------+------------------------+------------------------+ -| GET | ``/api/instructor | instructor_analytics, | -| | /v1/courses/{course_ke | student | -| | y}/analytics/summary`` | | -+-------------------+------------------------+------------------------+ -| GET | ``/api/instructor/v1 | instructor_analytics | -| | /courses/{course_key}/ | | -| | analytics/engagement`` | | -+-------------------+------------------------+------------------------+ -| GET | ``/api/instructor/v1/ | instructor_analytics, | -| | courses/{course_key}/a | grades | -| | nalytics/performance`` | | -+-------------------+------------------------+------------------------+ -| GET | ``/a | instructor_analytics, | -| | pi/instructor/v1/cours | enrollments | -| | es/{course_key}/analyt | | -| | ics/enrollment_stats`` | | -+-------------------+------------------------+------------------------+ ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+ +| Method | Endpoint | Services | ++========+===================================================================================+==============================================+ +| GET | /api/instructor/v1/courses/{course_key}/analytics/dashboard_url | instructor_analytics | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/analytics/summary | instructor_analytics, student | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/analytics/engagement | instructor_analytics | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/analytics/performance | instructor_analytics, grades | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/analytics/enrollment_stats | instructor_analytics, enrollments | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+ From 3413830c451e75faddb988edbde7cc97d904d2ff Mon Sep 17 00:00:00 2001 From: Jesse Stewart Date: Mon, 8 Sep 2025 12:19:48 -0400 Subject: [PATCH 05/13] fix: formatting of rst file --- ...ructor-dashboard-rest-api-architecture.rst | 200 +++++++++--------- 1 file changed, 100 insertions(+), 100 deletions(-) diff --git a/docs/decisions/0003-instructor-dashboard-rest-api-architecture.rst b/docs/decisions/0003-instructor-dashboard-rest-api-architecture.rst index 30b858ec..4e80eb91 100644 --- a/docs/decisions/0003-instructor-dashboard-rest-api-architecture.rst +++ b/docs/decisions/0003-instructor-dashboard-rest-api-architecture.rst @@ -13,19 +13,19 @@ API Endpoints & Services Course Information API ^^^^^^^^^^^^^^^^^^^^^^ -+--------+------------------------------------------------------------+---------------------------------------------+ -| Method | Endpoint | Services | -+========+============================================================+=============================================+ -| GET | /api/instructor/v1/courses/{course_key}/info | instructor, xmodule.modulestore | -+--------+------------------------------------------------------------+---------------------------------------------+ -| PUT | /api/instructor/v1/courses/{course_key}/info | instructor, xmodule.modulestore | -+--------+------------------------------------------------------------+---------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/instructor_tasks | instructor_task | -+--------+------------------------------------------------------------+---------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/modes | course_modes | -+--------+------------------------------------------------------------+---------------------------------------------+ -| PUT | /api/instructor/v1/courses/{course_key}/modes/{mode_id}/price | course_modes | -+--------+------------------------------------------------------------+---------------------------------------------+ ++--------+---------------------------------------------------------------+---------------------------------------------+ +| Method | Endpoint | Services | ++========+===============================================================+=============================================+ +| GET | /api/instructor/v1/courses/{course_key}/info | instructor, xmodule.modulestore | ++--------+---------------------------------------------------------------+---------------------------------------------+ +| PUT | /api/instructor/v1/courses/{course_key}/info | instructor, xmodule.modulestore | ++--------+---------------------------------------------------------------+---------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/instructor_tasks | instructor_task | ++--------+---------------------------------------------------------------+---------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/modes | course_modes | ++--------+---------------------------------------------------------------+---------------------------------------------+ +| PUT | /api/instructor/v1/courses/{course_key}/modes/{mode_id}/price | course_modes | ++--------+---------------------------------------------------------------+---------------------------------------------+ Membership Management API ^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -67,31 +67,31 @@ Membership Management API Student Administration API ^^^^^^^^^^^^^^^^^^^^^^^^^^ -+--------+----------------------------------------------------------------------------+--------------------------------------------------+ -| Method | Endpoint | Services | -+========+============================================================================+==================================================+ -| GET | /api/instructor/v1/courses/{course_key}/students | student, instructor | -+--------+----------------------------------------------------------------------------+--------------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/students/{username} | student, instructor | -+--------+----------------------------------------------------------------------------+--------------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/students/{username}/enrollment_status | enrollments | -+--------+----------------------------------------------------------------------------+--------------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/students/{username}/progress_url | student, instructor | -+--------+----------------------------------------------------------------------------+--------------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/students/{username}/reset_attempts | grades, xmodule.modulestore, instructor_task | -+--------+----------------------------------------------------------------------------+--------------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/students/{username}/reset_entrance_exam | grades, xmodule.modulestore | -+--------+----------------------------------------------------------------------------+--------------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/students/{username}/rescore_problem | grades, xmodule.modulestore, instructor_task | -+--------+----------------------------------------------------------------------------+--------------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/students/{username}/override_score | grades, xmodule.modulestore | -+--------+----------------------------------------------------------------------------+--------------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/students/{username}/delete_state | student, xmodule.modulestore | -+--------+----------------------------------------------------------------------------+--------------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/problems/{problem_id}/reset_attempts_all | grades, xmodule.modulestore, instructor_task | -+--------+----------------------------------------------------------------------------+--------------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/problems/{problem_id}/rescore_all | grades, xmodule.modulestore, instructor_task | -+--------+----------------------------------------------------------------------------+--------------------------------------------------+ ++--------+----------------------------------------------------------------------------------+--------------------------------------------------+ +| Method | Endpoint | Services | ++========+==================================================================================+==================================================+ +| GET | /api/instructor/v1/courses/{course_key}/students | student, instructor | ++--------+----------------------------------------------------------------------------------+--------------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/students/{username} | student, instructor | ++--------+----------------------------------------------------------------------------------+--------------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/students/{username}/enrollment_status | enrollments | ++--------+----------------------------------------------------------------------------------+--------------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/students/{username}/progress_url | student, instructor | ++--------+----------------------------------------------------------------------------------+--------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/students/{username}/reset_attempts | grades, xmodule.modulestore, instructor_task | ++--------+----------------------------------------------------------------------------------+--------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/students/{username}/reset_entrance_exam | grades, xmodule.modulestore | ++--------+----------------------------------------------------------------------------------+--------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/students/{username}/rescore_problem | grades, xmodule.modulestore, instructor_task | ++--------+----------------------------------------------------------------------------------+--------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/students/{username}/override_score | grades, xmodule.modulestore | ++--------+----------------------------------------------------------------------------------+--------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/students/{username}/delete_state | student, xmodule.modulestore | ++--------+----------------------------------------------------------------------------------+--------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/problems/{problem_id}/reset_attempts_all | grades, xmodule.modulestore, instructor_task | ++--------+----------------------------------------------------------------------------------+--------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/problems/{problem_id}/rescore_all | grades, xmodule.modulestore, instructor_task | ++--------+----------------------------------------------------------------------------------+--------------------------------------------------+ Cohort Management API ^^^^^^^^^^^^^^^^^^^^^ @@ -99,19 +99,19 @@ Cohort Management API +--------+------------------------------------------------------------------------------------+--------------------------------------------+ | Method | Endpoint | Services | +========+====================================================================================+============================================+ -| GET | /api/instructor/v1/courses/{course_key}/cohorts | openedx.core.djangoapps.course_groups | +| GET | /api/instructor/v1/courses/{course_key}/cohorts | openedx.core.djangoapps.course_groups | +--------+------------------------------------------------------------------------------------+--------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/cohorts | openedx.core.djangoapps.course_groups | +| POST | /api/instructor/v1/courses/{course_key}/cohorts | openedx.core.djangoapps.course_groups | +--------+------------------------------------------------------------------------------------+--------------------------------------------+ -| PUT | /api/instructor/v1/courses/{course_key}/cohorts/{cohort_id} | openedx.core.djangoapps.course_groups | +| PUT | /api/instructor/v1/courses/{course_key}/cohorts/{cohort_id} | openedx.core.djangoapps.course_groups | +--------+------------------------------------------------------------------------------------+--------------------------------------------+ -| DELETE | /api/instructor/v1/courses/{course_key}/cohorts/{cohort_id} | openedx.core.djangoapps.course_groups | +| DELETE | /api/instructor/v1/courses/{course_key}/cohorts/{cohort_id} | openedx.core.djangoapps.course_groups | +--------+------------------------------------------------------------------------------------+--------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/cohorts/{cohort_id}/students | openedx.core.djangoapps.course_groups | +| POST | /api/instructor/v1/courses/{course_key}/cohorts/{cohort_id}/students | openedx.core.djangoapps.course_groups | +--------+------------------------------------------------------------------------------------+--------------------------------------------+ -| DELETE | /api/instructor/v1/courses/{course_key}/cohorts/{cohort_id}/students | openedx.core.djangoapps.course_groups | +| DELETE | /api/instructor/v1/courses/{course_key}/cohorts/{cohort_id}/students | openedx.core.djangoapps.course_groups | +--------+------------------------------------------------------------------------------------+--------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/cohorts/csv_upload | openedx.core.djangoapps.course_groups, util| +| POST | /api/instructor/v1/courses/{course_key}/cohorts/csv_upload | openedx.core.djangoapps.course_groups, util| +--------+------------------------------------------------------------------------------------+--------------------------------------------+ Discussion Management API @@ -139,15 +139,15 @@ Extensions & Deadlines API +--------+-----------------------------------------------------------------------------------+----------------------------------+ | Method | Endpoint | Services | +========+===================================================================================+==================================+ -| GET | /api/instructor/v1/courses/{course_key}/extensions | util.date_utils | +| GET | /api/instructor/v1/courses/{course_key}/extensions | util.date_utils | +--------+-----------------------------------------------------------------------------------+----------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/extensions | util.date_utils | +| POST | /api/instructor/v1/courses/{course_key}/extensions | util.date_utils | +--------+-----------------------------------------------------------------------------------+----------------------------------+ -| PUT | /api/instructor/v1/courses/{course_key}/extensions/{extension_id} | util.date_utils | +| PUT | /api/instructor/v1/courses/{course_key}/extensions/{extension_id} | util.date_utils | +--------+-----------------------------------------------------------------------------------+----------------------------------+ -| DELETE | /api/instructor/v1/courses/{course_key}/extensions/{extension_id} | util.date_utils | +| DELETE | /api/instructor/v1/courses/{course_key}/extensions/{extension_id} | util.date_utils | +--------+-----------------------------------------------------------------------------------+----------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/extensions/{username} | util.date_utils, student | +| GET | /api/instructor/v1/courses/{course_key}/extensions/{username} | util.date_utils, student | +--------+-----------------------------------------------------------------------------------+----------------------------------+ Data Export API @@ -156,23 +156,23 @@ Data Export API +--------+-----------------------------------------------------------------------------------+----------------------------------------------+ | Method | Endpoint | Services | +========+===================================================================================+==============================================+ -| GET | /api/instructor/v1/courses/{course_key}/data_downloads | instructor_task, util | +| GET | /api/instructor/v1/courses/{course_key}/data_downloads | instructor_task, util | +--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/data_downloads | instructor_task, util | +| POST | /api/instructor/v1/courses/{course_key}/data_downloads | instructor_task, util | +--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/data_downloads/{download_id} | instructor_task, util | +| GET | /api/instructor/v1/courses/{course_key}/data_downloads/{download_id} | instructor_task, util | +--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| DELETE | /api/instructor/v1/courses/{course_key}/data_downloads/{download_id} | instructor_task, util | +| DELETE | /api/instructor/v1/courses/{course_key}/data_downloads/{download_id} | instructor_task, util | +--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/data_downloads/student_profiles | instructor_task, student | +| POST | /api/instructor/v1/courses/{course_key}/data_downloads/student_profiles | instructor_task, student | +--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/data_downloads/grade_report | instructor_task, grades | +| POST | /api/instructor/v1/courses/{course_key}/data_downloads/grade_report | instructor_task, grades | +--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/data_downloads/problem_grade_report | instructor_task, grades | +| POST | /api/instructor/v1/courses/{course_key}/data_downloads/problem_grade_report | instructor_task, grades | +--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/data_downloads/course_structure | instructor_task, xmodule.modulestore | +| POST | /api/instructor/v1/courses/{course_key}/data_downloads/course_structure | instructor_task, xmodule.modulestore | +--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/data_downloads/survey_results | instructor_task, grades | +| POST | /api/instructor/v1/courses/{course_key}/data_downloads/survey_results | instructor_task, grades | +--------+-----------------------------------------------------------------------------------+----------------------------------------------+ Bulk Email API @@ -181,17 +181,17 @@ Bulk Email API +--------+-----------------------------------------------------------------------------------+----------------------------------------------+ | Method | Endpoint | Services | +========+===================================================================================+==============================================+ -| GET | /api/instructor/v1/courses/{course_key}/bulk_email | bulk_email | +| GET | /api/instructor/v1/courses/{course_key}/bulk_email | bulk_email | +--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/bulk_email | bulk_email, instructor_task | +| POST | /api/instructor/v1/courses/{course_key}/bulk_email | bulk_email, instructor_task | +--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/bulk_email/{email_id} | bulk_email | +| GET | /api/instructor/v1/courses/{course_key}/bulk_email/{email_id} | bulk_email | +--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/bulk_email/{email_id}/status | bulk_email, instructor_task | +| GET | /api/instructor/v1/courses/{course_key}/bulk_email/{email_id}/status | bulk_email, instructor_task | +--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| DELETE | /api/instructor/v1/courses/{course_key}/bulk_email/{email_id} | bulk_email | +| DELETE | /api/instructor/v1/courses/{course_key}/bulk_email/{email_id} | bulk_email | +--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/email_templates | bulk_email | +| GET | /api/instructor/v1/courses/{course_key}/email_templates | bulk_email | +--------+-----------------------------------------------------------------------------------+----------------------------------------------+ Special Exams API @@ -200,19 +200,19 @@ Special Exams API +--------+-----------------------------------------------------------------------------------+----------------------------------------------+ | Method | Endpoint | Services | +========+===================================================================================+==============================================+ -| GET | /api/instructor/v1/courses/{course_key}/special_exams | edx_proctoring, grades | +| GET | /api/instructor/v1/courses/{course_key}/special_exams | edx_proctoring, grades | +--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/special_exams/{exam_id} | edx_proctoring, grades | +| GET | /api/instructor/v1/courses/{course_key}/special_exams/{exam_id} | edx_proctoring, grades | +--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/special_exams/{exam_id}/reset/{username} | edx_proctoring, InstructorService | +| POST | /api/instructor/v1/courses/{course_key}/special_exams/{exam_id}/reset/{username} | edx_proctoring, InstructorService | +--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/special_exams/{exam_id}/attempts | edx_proctoring, grades | +| GET | /api/instructor/v1/courses/{course_key}/special_exams/{exam_id}/attempts | edx_proctoring, grades | +--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/proctoring_settings | edx_proctoring | +| GET | /api/instructor/v1/courses/{course_key}/proctoring_settings | edx_proctoring | +--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| PUT | /api/instructor/v1/courses/{course_key}/proctoring_settings | edx_proctoring | +| PUT | /api/instructor/v1/courses/{course_key}/proctoring_settings | edx_proctoring | +--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/special_exams/{exam_id}/allowance | edx_proctoring, student | +| POST | /api/instructor/v1/courses/{course_key}/special_exams/{exam_id}/allowance | edx_proctoring, student | +--------+-----------------------------------------------------------------------------------+----------------------------------------------+ Certificates API @@ -221,41 +221,41 @@ Certificates API +--------+-----------------------------------------------------------------------------------+----------------------------------------------+ | Method | Endpoint | Services | +========+===================================================================================+==============================================+ -| GET | /api/instructor/v1/courses/{course_key}/certificates | certificates | +| GET | /api/instructor/v1/courses/{course_key}/certificates | certificates | +--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/certificates/generate | certificates, instructor_task | +| POST | /api/instructor/v1/courses/{course_key}/certificates/generate | certificates, instructor_task | +--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/certificates/generate/{username} | certificates, student | +| POST | /api/instructor/v1/courses/{course_key}/certificates/generate/{username} | certificates, student | +--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/certificates/generate_bulk | certificates, instructor_task | +| POST | /api/instructor/v1/courses/{course_key}/certificates/generate_bulk | certificates, instructor_task | +--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/certificates/allowlist | certificates | +| GET | /api/instructor/v1/courses/{course_key}/certificates/allowlist | certificates | +--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/certificates/allowlist | certificates, student | +| POST | /api/instructor/v1/courses/{course_key}/certificates/allowlist | certificates, student | +--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| DELETE | /api/instructor/v1/courses/{course_key}/certificates/allowlist | certificates | +| DELETE | /api/instructor/v1/courses/{course_key}/certificates/allowlist | certificates | +--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/certificates/{certificate_id}/status | certificates | +| GET | /api/instructor/v1/courses/{course_key}/certificates/{certificate_id}/status | certificates | +--------+-----------------------------------------------------------------------------------+----------------------------------------------+ Open Response Assessment API ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| Method | Endpoint | Services | -+========+===================================================================================+==============================================+ -| GET | /api/instructor/v1/courses/{course_key}/ora | ora_staff_grader, xmodule.modulestore | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/ora/{ora_id} | ora_staff_grader, xmodule.modulestore | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/ora/{ora_id}/submissions | ora_staff_grader | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/ora/{ora_id}/submissions/{submission_id} | ora_staff_grader | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/ora/{ora_id}/submissions/{submission_id}/override_grade | ora_staff_grader | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/ora/{ora_id}/submissions/{submission_id}/reset | ora_staff_grader | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+ ++--------+-------------------------------------------------------------------------------------------------+----------------------------------------------+ +| Method | Endpoint | Services | ++========+=================================================================================================+==============================================+ +| GET | /api/instructor/v1/courses/{course_key}/ora | ora_staff_grader, xmodule.modulestore | ++--------+-------------------------------------------------------------------------------------------------+----------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/ora/{ora_id} | ora_staff_grader, xmodule.modulestore | ++--------+-------------------------------------------------------------------------------------------------+----------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/ora/{ora_id}/submissions | ora_staff_grader | ++--------+-------------------------------------------------------------------------------------------------+----------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/ora/{ora_id}/submissions/{submission_id} | ora_staff_grader | ++--------+-------------------------------------------------------------------------------------------------+----------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/ora/{ora_id}/submissions/{submission_id}/override_grade | ora_staff_grader | ++--------+-------------------------------------------------------------------------------------------------+----------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/ora/{ora_id}/submissions/{submission_id}/reset | ora_staff_grader | ++--------+-------------------------------------------------------------------------------------------------+----------------------------------------------+ Analytics API ^^^^^^^^^^^^^ @@ -263,13 +263,13 @@ Analytics API +--------+-----------------------------------------------------------------------------------+----------------------------------------------+ | Method | Endpoint | Services | +========+===================================================================================+==============================================+ -| GET | /api/instructor/v1/courses/{course_key}/analytics/dashboard_url | instructor_analytics | +| GET | /api/instructor/v1/courses/{course_key}/analytics/dashboard_url | instructor_analytics | +--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/analytics/summary | instructor_analytics, student | +| GET | /api/instructor/v1/courses/{course_key}/analytics/summary | instructor_analytics, student | +--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/analytics/engagement | instructor_analytics | +| GET | /api/instructor/v1/courses/{course_key}/analytics/engagement | instructor_analytics | +--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/analytics/performance | instructor_analytics, grades | +| GET | /api/instructor/v1/courses/{course_key}/analytics/performance | instructor_analytics, grades | +--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/analytics/enrollment_stats | instructor_analytics, enrollments | +| GET | /api/instructor/v1/courses/{course_key}/analytics/enrollment_stats | instructor_analytics, enrollments | +--------+-----------------------------------------------------------------------------------+----------------------------------------------+ From 6966faacfa84a96f9d2e844f1c13087753b4c2aa Mon Sep 17 00:00:00 2001 From: Jesse Stewart Date: Mon, 8 Sep 2025 17:23:15 -0400 Subject: [PATCH 06/13] feat: add existing apis --- ...ructor-dashboard-rest-api-architecture.rst | 433 +++++++++--------- 1 file changed, 217 insertions(+), 216 deletions(-) diff --git a/docs/decisions/0003-instructor-dashboard-rest-api-architecture.rst b/docs/decisions/0003-instructor-dashboard-rest-api-architecture.rst index 4e80eb91..e8afb834 100644 --- a/docs/decisions/0003-instructor-dashboard-rest-api-architecture.rst +++ b/docs/decisions/0003-instructor-dashboard-rest-api-architecture.rst @@ -13,263 +13,264 @@ API Endpoints & Services Course Information API ^^^^^^^^^^^^^^^^^^^^^^ -+--------+---------------------------------------------------------------+---------------------------------------------+ -| Method | Endpoint | Services | -+========+===============================================================+=============================================+ -| GET | /api/instructor/v1/courses/{course_key}/info | instructor, xmodule.modulestore | -+--------+---------------------------------------------------------------+---------------------------------------------+ -| PUT | /api/instructor/v1/courses/{course_key}/info | instructor, xmodule.modulestore | -+--------+---------------------------------------------------------------+---------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/instructor_tasks | instructor_task | -+--------+---------------------------------------------------------------+---------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/modes | course_modes | -+--------+---------------------------------------------------------------+---------------------------------------------+ -| PUT | /api/instructor/v1/courses/{course_key}/modes/{mode_id}/price | course_modes | -+--------+---------------------------------------------------------------+---------------------------------------------+ ++--------+---------------------------------------------------------------+---------------------------------------------+-----------+---------------------------------------------+ +| Method | Endpoint | Services | Status | Existing API Path | ++========+===============================================================+=============================================+===========+=============================================+ +| GET | /api/instructor/v1/courses/{course_key}/info | instructor, xmodule.modulestore | Missing | N/A | ++--------+---------------------------------------------------------------+---------------------------------------------+-----------+---------------------------------------------+ +| PUT | /api/instructor/v1/courses/{course_key}/info | instructor, xmodule.modulestore | Missing | N/A | ++--------+---------------------------------------------------------------+---------------------------------------------+-----------+---------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/instructor_tasks | instructor_task | Partial | /api/instructor/v1/tasks/{course_id} | ++--------+---------------------------------------------------------------+---------------------------------------------+-----------+---------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/modes | course_modes | Missing | N/A | ++--------+---------------------------------------------------------------+---------------------------------------------+-----------+---------------------------------------------+ +| PUT | /api/instructor/v1/courses/{course_key}/modes/{mode_id}/price | course_modes | Missing | N/A | ++--------+---------------------------------------------------------------+---------------------------------------------+-----------+---------------------------------------------+ Membership Management API ^^^^^^^^^^^^^^^^^^^^^^^^^ -+--------+--------------------------------------------------------------------+--------------------------------+ -| Method | Endpoint | Services | -+========+====================================================================+================================+ -| GET | /api/instructor/v1/courses/{course_key}/enrollment | enrollments, student | -+--------+--------------------------------------------------------------------+--------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/enrollment | enrollments, student | -+--------+--------------------------------------------------------------------+--------------------------------+ -| DELETE | /api/instructor/v1/courses/{course_key}/enrollment | enrollments, student | -+--------+--------------------------------------------------------------------+--------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/enrollment/batch | bulk_enroll, bulk_email | -+--------+--------------------------------------------------------------------+--------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/enrollment/csv_upload | bulk_enroll, util | -+--------+--------------------------------------------------------------------+--------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/roles | student.auth | -+--------+--------------------------------------------------------------------+--------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/roles | student.auth | -+--------+--------------------------------------------------------------------+--------------------------------+ -| DELETE | /api/instructor/v1/courses/{course_key}/roles | student.auth | -+--------+--------------------------------------------------------------------+--------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/roles/{role_type}/members | student.auth | -+--------+--------------------------------------------------------------------+--------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/beta_testers | student.auth | -+--------+--------------------------------------------------------------------+--------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/beta_testers | student.auth | -+--------+--------------------------------------------------------------------+--------------------------------+ -| DELETE | /api/instructor/v1/courses/{course_key}/beta_testers | student.auth | -+--------+--------------------------------------------------------------------+--------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/forum/members | discussion, student.auth | -+--------+--------------------------------------------------------------------+--------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/forum/members | discussion, student.auth | -+--------+--------------------------------------------------------------------+--------------------------------+ -| DELETE | /api/instructor/v1/courses/{course_key}/forum/members | discussion, student.auth | -+--------+--------------------------------------------------------------------+--------------------------------+ ++--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+ +| Method | Endpoint | Services | Status | Existing API Path | ++========+====================================================================+================================+===========+===================================================================+ +| GET | /api/instructor/v1/courses/{course_key}/enrollment | enrollments, student | Missing | N/A | ++--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/enrollment | enrollments, student | Partial | /courses/{course_id}/instructor/api/students_update_enrollment | ++--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+ +| DELETE | /api/instructor/v1/courses/{course_key}/enrollment | enrollments, student | Missing | N/A | ++--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/enrollment/batch | bulk_enroll, bulk_email | Partial | /courses/{course_id}/instructor/api/register_and_enroll_students | ++--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/enrollment/csv_upload | bulk_enroll, util | Missing | N/A | ++--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/roles | student.auth | Missing | N/A | ++--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/roles | student.auth | Partial | /courses/{course_id}/instructor/api/modify_access | ++--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+ +| DELETE | /api/instructor/v1/courses/{course_key}/roles | student.auth | Missing | N/A | ++--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/roles/{role_type}/members | student.auth | Partial | /courses/{course_id}/instructor/api/list_course_role_members | ++--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/beta_testers | student.auth | Missing | N/A | ++--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/beta_testers | student.auth | Partial | /courses/{course_id}/instructor/api/bulk_beta_modify_access | ++--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+ +| DELETE | /api/instructor/v1/courses/{course_key}/beta_testers | student.auth | Missing | N/A | ++--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/forum/members | discussion, student.auth | Partial | /courses/{course_id}/instructor/api/list_forum_members | ++--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/forum/members | discussion, student.auth | Partial | /courses/{course_id}/instructor/api/update_forum_role_membership | ++--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+ +| DELETE | /api/instructor/v1/courses/{course_key}/forum/members | discussion, student.auth | Missing | N/A | ++--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+ Student Administration API ^^^^^^^^^^^^^^^^^^^^^^^^^^ -+--------+----------------------------------------------------------------------------------+--------------------------------------------------+ -| Method | Endpoint | Services | -+========+==================================================================================+==================================================+ -| GET | /api/instructor/v1/courses/{course_key}/students | student, instructor | -+--------+----------------------------------------------------------------------------------+--------------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/students/{username} | student, instructor | -+--------+----------------------------------------------------------------------------------+--------------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/students/{username}/enrollment_status | enrollments | -+--------+----------------------------------------------------------------------------------+--------------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/students/{username}/progress_url | student, instructor | -+--------+----------------------------------------------------------------------------------+--------------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/students/{username}/reset_attempts | grades, xmodule.modulestore, instructor_task | -+--------+----------------------------------------------------------------------------------+--------------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/students/{username}/reset_entrance_exam | grades, xmodule.modulestore | -+--------+----------------------------------------------------------------------------------+--------------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/students/{username}/rescore_problem | grades, xmodule.modulestore, instructor_task | -+--------+----------------------------------------------------------------------------------+--------------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/students/{username}/override_score | grades, xmodule.modulestore | -+--------+----------------------------------------------------------------------------------+--------------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/students/{username}/delete_state | student, xmodule.modulestore | -+--------+----------------------------------------------------------------------------------+--------------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/problems/{problem_id}/reset_attempts_all | grades, xmodule.modulestore, instructor_task | -+--------+----------------------------------------------------------------------------------+--------------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/problems/{problem_id}/rescore_all | grades, xmodule.modulestore, instructor_task | -+--------+----------------------------------------------------------------------------------+--------------------------------------------------+ ++--------+----------------------------------------------------------------------------------+--------------------------------------------------+-----------+-------------------------------------------------------------------------------+ +| Method | Endpoint | Services | Status | Existing API Path | ++========+==================================================================================+==================================================+===========+===============================================================================+ +| GET | /api/instructor/v1/courses/{course_key}/students | student, instructor | Missing | N/A | ++--------+----------------------------------------------------------------------------------+--------------------------------------------------+-----------+-------------------------------------------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/students/{username} | student, instructor | Missing | N/A | ++--------+----------------------------------------------------------------------------------+--------------------------------------------------+-----------+-------------------------------------------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/students/{username}/enrollment_status | enrollments | Exists | /courses/{course_id}/instructor/api/get_student_enrollment_status | ++--------+----------------------------------------------------------------------------------+--------------------------------------------------+-----------+-------------------------------------------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/students/{username}/progress_url | student, instructor | Exists | /courses/{course_id}/instructor/api/get_student_progress_url | ++--------+----------------------------------------------------------------------------------+--------------------------------------------------+-----------+-------------------------------------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/students/{username}/reset_attempts | grades, xmodule.modulestore, instructor_task | Exists | /courses/{course_id}/instructor/api/reset_student_attempts | ++--------+----------------------------------------------------------------------------------+--------------------------------------------------+-----------+-------------------------------------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/students/{username}/reset_entrance_exam | grades, xmodule.modulestore | Exists | /courses/{course_id}/instructor/api/reset_student_attempts_for_entrance_exam | ++--------+----------------------------------------------------------------------------------+--------------------------------------------------+-----------+-------------------------------------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/students/{username}/rescore_problem | grades, xmodule.modulestore, instructor_task | Exists | /courses/{course_id}/instructor/api/rescore_problem | ++--------+----------------------------------------------------------------------------------+--------------------------------------------------+-----------+-------------------------------------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/students/{username}/override_score | grades, xmodule.modulestore | Exists | /courses/{course_id}/instructor/api/override_problem_score | ++--------+----------------------------------------------------------------------------------+--------------------------------------------------+-----------+-------------------------------------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/students/{username}/delete_state | student, xmodule.modulestore | Missing | N/A | ++--------+----------------------------------------------------------------------------------+--------------------------------------------------+-----------+-------------------------------------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/problems/{problem_id}/reset_attempts_all | grades, xmodule.modulestore, instructor_task | Missing | N/A | ++--------+----------------------------------------------------------------------------------+--------------------------------------------------+-----------+-------------------------------------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/problems/{problem_id}/rescore_all | grades, xmodule.modulestore, instructor_task | Missing | N/A | ++--------+----------------------------------------------------------------------------------+--------------------------------------------------+-----------+-------------------------------------------------------------------------------+ Cohort Management API ^^^^^^^^^^^^^^^^^^^^^ -+--------+------------------------------------------------------------------------------------+--------------------------------------------+ -| Method | Endpoint | Services | -+========+====================================================================================+============================================+ -| GET | /api/instructor/v1/courses/{course_key}/cohorts | openedx.core.djangoapps.course_groups | -+--------+------------------------------------------------------------------------------------+--------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/cohorts | openedx.core.djangoapps.course_groups | -+--------+------------------------------------------------------------------------------------+--------------------------------------------+ -| PUT | /api/instructor/v1/courses/{course_key}/cohorts/{cohort_id} | openedx.core.djangoapps.course_groups | -+--------+------------------------------------------------------------------------------------+--------------------------------------------+ -| DELETE | /api/instructor/v1/courses/{course_key}/cohorts/{cohort_id} | openedx.core.djangoapps.course_groups | -+--------+------------------------------------------------------------------------------------+--------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/cohorts/{cohort_id}/students | openedx.core.djangoapps.course_groups | -+--------+------------------------------------------------------------------------------------+--------------------------------------------+ -| DELETE | /api/instructor/v1/courses/{course_key}/cohorts/{cohort_id}/students | openedx.core.djangoapps.course_groups | -+--------+------------------------------------------------------------------------------------+--------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/cohorts/csv_upload | openedx.core.djangoapps.course_groups, util| -+--------+------------------------------------------------------------------------------------+--------------------------------------------+ ++--------+------------------------------------------------------------------------------------+--------------------------------------------+-----------+-------------------------------------------------------------------+ +| Method | Endpoint | Services | Status | Existing API Path | ++========+====================================================================================+============================================+===========+===================================================================+ +| GET | /api/instructor/v1/courses/{course_key}/cohorts | openedx.core.djangoapps.course_groups | Missing | N/A | ++--------+------------------------------------------------------------------------------------+--------------------------------------------+-----------+-------------------------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/cohorts | openedx.core.djangoapps.course_groups | Missing | N/A | ++--------+------------------------------------------------------------------------------------+--------------------------------------------+-----------+-------------------------------------------------------------------+ +| PUT | /api/instructor/v1/courses/{course_key}/cohorts/{cohort_id} | openedx.core.djangoapps.course_groups | Missing | N/A | ++--------+------------------------------------------------------------------------------------+--------------------------------------------+-----------+-------------------------------------------------------------------+ +| DELETE | /api/instructor/v1/courses/{course_key}/cohorts/{cohort_id} | openedx.core.djangoapps.course_groups | Missing | N/A | ++--------+------------------------------------------------------------------------------------+--------------------------------------------+-----------+-------------------------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/cohorts/{cohort_id}/students | openedx.core.djangoapps.course_groups | Missing | N/A | ++--------+------------------------------------------------------------------------------------+--------------------------------------------+-----------+-------------------------------------------------------------------+ +| DELETE | /api/instructor/v1/courses/{course_key}/cohorts/{cohort_id}/students | openedx.core.djangoapps.course_groups | Missing | N/A | ++--------+------------------------------------------------------------------------------------+--------------------------------------------+-----------+-------------------------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/cohorts/csv_upload | openedx.core.djangoapps.course_groups, util| Partial | /courses/{course_id}/instructor/api/add_users_to_cohorts | ++--------+------------------------------------------------------------------------------------+--------------------------------------------+-----------+-------------------------------------------------------------------+ Discussion Management API ^^^^^^^^^^^^^^^^^^^^^^^^^ -+--------+------------------------------------------------------------------------------------+-----------------------------------------+ -| Method | Endpoint | Services | -+========+====================================================================================+=========================================+ -| GET | /api/instructor/v1/courses/{course_key}/discussions/topics | discussion | -+--------+------------------------------------------------------------------------------------+-----------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/discussions/topics | discussion, xmodule.modulestore | -+--------+------------------------------------------------------------------------------------+-----------------------------------------+ -| PUT | /api/instructor/v1/courses/{course_key}/discussions/topics/{topic_id} | discussion | -+--------+------------------------------------------------------------------------------------+-----------------------------------------+ -| DELETE | /api/instructor/v1/courses/{course_key}/discussions/topics/{topic_id} | discussion | -+--------+------------------------------------------------------------------------------------+-----------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/discussions/settings | discussion | -+--------+------------------------------------------------------------------------------------+-----------------------------------------+ -| PUT | /api/instructor/v1/courses/{course_key}/discussions/settings | discussion | -+--------+------------------------------------------------------------------------------------+-----------------------------------------+ ++--------+------------------------------------------------------------------------------------+-----------------------------------------+-----------+----------------------------------------------------------+ +| Method | Endpoint | Services | Status | Existing API Path | ++========+====================================================================================+=========================================+===========+==========================================================+ +| GET | /api/instructor/v1/courses/{course_key}/discussions/topics | discussion | Missing | N/A | ++--------+------------------------------------------------------------------------------------+-----------------------------------------+-----------+----------------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/discussions/topics | discussion, xmodule.modulestore | Missing | N/A | ++--------+------------------------------------------------------------------------------------+-----------------------------------------+-----------+----------------------------------------------------------+ +| PUT | /api/instructor/v1/courses/{course_key}/discussions/topics/{topic_id} | discussion | Missing | N/A | ++--------+------------------------------------------------------------------------------------+-----------------------------------------+-----------+----------------------------------------------------------+ +| DELETE | /api/instructor/v1/courses/{course_key}/discussions/topics/{topic_id} | discussion | Missing | N/A | ++--------+------------------------------------------------------------------------------------+-----------------------------------------+-----------+----------------------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/discussions/settings | discussion | Missing | N/A | ++--------+------------------------------------------------------------------------------------+-----------------------------------------+-----------+----------------------------------------------------------+ +| PUT | /api/instructor/v1/courses/{course_key}/discussions/settings | discussion | Missing | N/A | ++--------+------------------------------------------------------------------------------------+-----------------------------------------+-----------+----------------------------------------------------------+ Extensions & Deadlines API ^^^^^^^^^^^^^^^^^^^^^^^^^^ -+--------+-----------------------------------------------------------------------------------+----------------------------------+ -| Method | Endpoint | Services | -+========+===================================================================================+==================================+ -| GET | /api/instructor/v1/courses/{course_key}/extensions | util.date_utils | -+--------+-----------------------------------------------------------------------------------+----------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/extensions | util.date_utils | -+--------+-----------------------------------------------------------------------------------+----------------------------------+ -| PUT | /api/instructor/v1/courses/{course_key}/extensions/{extension_id} | util.date_utils | -+--------+-----------------------------------------------------------------------------------+----------------------------------+ -| DELETE | /api/instructor/v1/courses/{course_key}/extensions/{extension_id} | util.date_utils | -+--------+-----------------------------------------------------------------------------------+----------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/extensions/{username} | util.date_utils, student | -+--------+-----------------------------------------------------------------------------------+----------------------------------+ ++--------+-----------------------------------------------------------------------------------+----------------------------------+-----------+-------------------------------------------------------------------+ +| Method | Endpoint | Services | Status | Existing API Path | ++========+===================================================================================+==================================+===========+===================================================================+ +| GET | /api/instructor/v1/courses/{course_key}/extensions | util.date_utils | Missing | N/A | ++--------+-----------------------------------------------------------------------------------+----------------------------------+-----------+-------------------------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/extensions | util.date_utils | Partial | /courses/{course_id}/instructor/api/change_due_date | ++--------+-----------------------------------------------------------------------------------+----------------------------------+-----------+-------------------------------------------------------------------+ +| PUT | /api/instructor/v1/courses/{course_key}/extensions/{extension_id} | util.date_utils | Missing | N/A | ++--------+-----------------------------------------------------------------------------------+----------------------------------+-----------+-------------------------------------------------------------------+ +| DELETE | /api/instructor/v1/courses/{course_key}/extensions/{extension_id} | util.date_utils | Partial | /courses/{course_id}/instructor/api/reset_due_date | ++--------+-----------------------------------------------------------------------------------+----------------------------------+-----------+-------------------------------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/extensions/{username} | util.date_utils, student | Exists | /courses/{course_id}/instructor/api/show_student_extensions | ++--------+-----------------------------------------------------------------------------------+----------------------------------+-----------+-------------------------------------------------------------------+ Data Export API ^^^^^^^^^^^^^^^ -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| Method | Endpoint | Services | -+========+===================================================================================+==============================================+ -| GET | /api/instructor/v1/courses/{course_key}/data_downloads | instructor_task, util | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/data_downloads | instructor_task, util | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/data_downloads/{download_id} | instructor_task, util | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| DELETE | /api/instructor/v1/courses/{course_key}/data_downloads/{download_id} | instructor_task, util | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/data_downloads/student_profiles | instructor_task, student | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/data_downloads/grade_report | instructor_task, grades | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/data_downloads/problem_grade_report | instructor_task, grades | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/data_downloads/course_structure | instructor_task, xmodule.modulestore | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/data_downloads/survey_results | instructor_task, grades | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+ ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+ +| Method | Endpoint | Services | Status | Existing API Path | ++========+===================================================================================+==============================================+===========+===================================================================+ +| GET | /api/instructor/v1/courses/{course_key}/data_downloads | instructor_task, util | Partial | /api/instructor/v1/reports/{course_id} | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/data_downloads | instructor_task, util | Missing | N/A | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/data_downloads/{download_id} | instructor_task, util | Missing | N/A | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+ +| DELETE | /api/instructor/v1/courses/{course_key}/data_downloads/{download_id} | instructor_task, util | Missing | N/A | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/data_downloads/student_profiles | instructor_task, student | Missing | N/A | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/data_downloads/grade_report | instructor_task, grades | Exists | /courses/{course_id}/instructor/api/calculate_grades_csv | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/data_downloads/problem_grade_report | instructor_task, grades | Exists | /courses/{course_id}/instructor/api/problem_grade_report | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/data_downloads/course_structure | instructor_task, xmodule.modulestore | Missing | N/A | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/data_downloads/survey_results | instructor_task, grades | Exists | /courses/{course_id}/instructor/api/get_course_survey_results | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+ Bulk Email API ^^^^^^^^^^^^^^ -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| Method | Endpoint | Services | -+========+===================================================================================+==============================================+ -| GET | /api/instructor/v1/courses/{course_key}/bulk_email | bulk_email | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/bulk_email | bulk_email, instructor_task | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/bulk_email/{email_id} | bulk_email | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/bulk_email/{email_id}/status | bulk_email, instructor_task | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| DELETE | /api/instructor/v1/courses/{course_key}/bulk_email/{email_id} | bulk_email | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/email_templates | bulk_email | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+ ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+ +| Method | Endpoint | Services | Status | Existing API Path | ++========+===================================================================================+==============================================+===========+===================================================================+ +| GET | /api/instructor/v1/courses/{course_key}/bulk_email | bulk_email | Missing | N/A | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/bulk_email | bulk_email, instructor_task | Exists | /courses/{course_id}/instructor/api/send_email | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/bulk_email/{email_id} | bulk_email | Missing | N/A | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/bulk_email/{email_id}/status | bulk_email, instructor_task | Partial | /courses/{course_id}/instructor/api/list_background_email_tasks | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+ +| DELETE | /api/instructor/v1/courses/{course_key}/bulk_email/{email_id} | bulk_email | Missing | N/A | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/email_templates | bulk_email | Exists | /courses/{course_id}/instructor/api/list_email_content | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+ Special Exams API ^^^^^^^^^^^^^^^^^ -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| Method | Endpoint | Services | -+========+===================================================================================+==============================================+ -| GET | /api/instructor/v1/courses/{course_key}/special_exams | edx_proctoring, grades | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/special_exams/{exam_id} | edx_proctoring, grades | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/special_exams/{exam_id}/reset/{username} | edx_proctoring, InstructorService | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/special_exams/{exam_id}/attempts | edx_proctoring, grades | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/proctoring_settings | edx_proctoring | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| PUT | /api/instructor/v1/courses/{course_key}/proctoring_settings | edx_proctoring | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/special_exams/{exam_id}/allowance | edx_proctoring, student | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+ ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+ +| Method | Endpoint | Services | Status | Existing API Path | ++========+===================================================================================+==============================================+===========+===================================================================+ +| GET | /api/instructor/v1/courses/{course_key}/special_exams | edx_proctoring, grades | Missing | N/A | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/special_exams/{exam_id} | edx_proctoring, grades | Missing | N/A | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/special_exams/{exam_id}/reset/{username} | edx_proctoring, InstructorService | Missing | N/A | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/special_exams/{exam_id}/attempts | edx_proctoring, grades | Partial | /courses/{course_id}/instructor/api/get_proctored_exam_results | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/proctoring_settings | edx_proctoring | Missing | N/A | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+ +| PUT | /api/instructor/v1/courses/{course_key}/proctoring_settings | edx_proctoring | Missing | N/A | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/special_exams/{exam_id}/allowance | edx_proctoring, student | Missing | N/A | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+ Certificates API ^^^^^^^^^^^^^^^^ -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| Method | Endpoint | Services | -+========+===================================================================================+==============================================+ -| GET | /api/instructor/v1/courses/{course_key}/certificates | certificates | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/certificates/generate | certificates, instructor_task | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/certificates/generate/{username} | certificates, student | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/certificates/generate_bulk | certificates, instructor_task | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/certificates/allowlist | certificates | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/certificates/allowlist | certificates, student | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| DELETE | /api/instructor/v1/courses/{course_key}/certificates/allowlist | certificates | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/certificates/{certificate_id}/status | certificates | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+ ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+--------------------------------------------------------------------------+ +| Method | Endpoint | Services | Status | Existing API Path | ++========+===================================================================================+==============================================+===========+==========================================================================+ +| GET | /api/instructor/v1/courses/{course_key}/certificates | certificates | Partial | /courses/{course_id}/instructor/api/get_issued_certificates | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+--------------------------------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/certificates/generate | certificates, instructor_task | Exists | /courses/{course_id}/instructor/api/start_certificate_generation | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+--------------------------------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/certificates/generate/{username} | certificates, student | Missing | N/A | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+--------------------------------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/certificates/generate_bulk | certificates, instructor_task | Exists | /courses/{course_id}/instructor/api/generate_bulk_certificate_exceptions | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+--------------------------------------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/certificates/allowlist | certificates | Missing | N/A | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+--------------------------------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/certificates/allowlist | certificates, student | Partial | /courses/{course_id}/instructor/api/certificate_exception_view | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+--------------------------------------------------------------------------+ +| DELETE | /api/instructor/v1/courses/{course_key}/certificates/allowlist | certificates | Missing | N/A | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+--------------------------------------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/certificates/{certificate_id}/status | certificates | Missing | N/A | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+--------------------------------------------------------------------------+ Open Response Assessment API ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -+--------+-------------------------------------------------------------------------------------------------+----------------------------------------------+ -| Method | Endpoint | Services | -+========+=================================================================================================+==============================================+ -| GET | /api/instructor/v1/courses/{course_key}/ora | ora_staff_grader, xmodule.modulestore | -+--------+-------------------------------------------------------------------------------------------------+----------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/ora/{ora_id} | ora_staff_grader, xmodule.modulestore | -+--------+-------------------------------------------------------------------------------------------------+----------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/ora/{ora_id}/submissions | ora_staff_grader | -+--------+-------------------------------------------------------------------------------------------------+----------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/ora/{ora_id}/submissions/{submission_id} | ora_staff_grader | -+--------+-------------------------------------------------------------------------------------------------+----------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/ora/{ora_id}/submissions/{submission_id}/override_grade | ora_staff_grader | -+--------+-------------------------------------------------------------------------------------------------+----------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/ora/{ora_id}/submissions/{submission_id}/reset | ora_staff_grader | -+--------+-------------------------------------------------------------------------------------------------+----------------------------------------------+ + ++--------+-------------------------------------------------------------------------------------------------+----------------------------------------------+-----------+--------------------------------------------------------+ +| Method | Endpoint | Services | Status | Existing API Path | ++========+=================================================================================================+==============================================+===========+========================================================+ +| GET | /api/instructor/v1/courses/{course_key}/ora | ora_staff_grader, xmodule.modulestore | Missing | N/A | ++--------+-------------------------------------------------------------------------------------------------+----------------------------------------------+-----------+--------------------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/ora/{ora_id} | ora_staff_grader, xmodule.modulestore | Missing | N/A | ++--------+-------------------------------------------------------------------------------------------------+----------------------------------------------+-----------+--------------------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/ora/{ora_id}/submissions | ora_staff_grader | Missing | N/A | ++--------+-------------------------------------------------------------------------------------------------+----------------------------------------------+-----------+--------------------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/ora/{ora_id}/submissions/{submission_id} | ora_staff_grader | Missing | N/A | ++--------+-------------------------------------------------------------------------------------------------+----------------------------------------------+-----------+--------------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/ora/{ora_id}/submissions/{submission_id}/override_grade | ora_staff_grader | Missing | N/A | ++--------+-------------------------------------------------------------------------------------------------+----------------------------------------------+-----------+--------------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/ora/{ora_id}/submissions/{submission_id}/reset | ora_staff_grader | Partial | /courses/{course_id}/instructor/api/export_ora2_data | ++--------+-------------------------------------------------------------------------------------------------+----------------------------------------------+-----------+--------------------------------------------------------+ Analytics API ^^^^^^^^^^^^^ -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| Method | Endpoint | Services | -+========+===================================================================================+==============================================+ -| GET | /api/instructor/v1/courses/{course_key}/analytics/dashboard_url | instructor_analytics | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/analytics/summary | instructor_analytics, student | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/analytics/engagement | instructor_analytics | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/analytics/performance | instructor_analytics, grades | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/analytics/enrollment_stats | instructor_analytics, enrollments | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+ ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+----------------------------------------------------------+ +| Method | Endpoint | Services | Status | Existing API Path | ++========+===================================================================================+==============================================+===========+==========================================================+ +| GET | /api/instructor/v1/courses/{course_key}/analytics/dashboard_url | instructor_analytics | Missing | N/A | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+----------------------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/analytics/summary | instructor_analytics, student | Missing | N/A | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+----------------------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/analytics/engagement | instructor_analytics | Missing | N/A | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+----------------------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/analytics/performance | instructor_analytics, grades | Missing | N/A | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+----------------------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/analytics/enrollment_stats | instructor_analytics, enrollments | Missing | N/A | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+----------------------------------------------------------+ From 2ec5ad592741b7dd838e18febdd30586d642ddc3 Mon Sep 17 00:00:00 2001 From: Jesse Stewart Date: Mon, 6 Oct 2025 12:53:04 -0400 Subject: [PATCH 07/13] docs: update api adr according to pr feedback --- ...ructor-dashboard-rest-api-architecture.rst | 426 +++++++++--------- 1 file changed, 208 insertions(+), 218 deletions(-) diff --git a/docs/decisions/0003-instructor-dashboard-rest-api-architecture.rst b/docs/decisions/0003-instructor-dashboard-rest-api-architecture.rst index e8afb834..a4e56f06 100644 --- a/docs/decisions/0003-instructor-dashboard-rest-api-architecture.rst +++ b/docs/decisions/0003-instructor-dashboard-rest-api-architecture.rst @@ -7,270 +7,260 @@ Decision Implement unified Instructor Dashboard REST API with service orchestration pattern organizing 90 endpoints across 12 functional domains. -API Endpoints & Services ------------------------- +Terminology +----------- + +**Services**: The Django apps and modules that each endpoint implementation will interact with to fulfill requests. This documents backend dependencies. + +**Status**: + - **Missing**: No existing endpoint provides this functionality + - **Partial**: An existing endpoint provides similar functionality but requires modification + - **Exists**: An existing endpoint fully provides this functionality + +API Endpoints +------------- Course Information API ^^^^^^^^^^^^^^^^^^^^^^ -+--------+---------------------------------------------------------------+---------------------------------------------+-----------+---------------------------------------------+ -| Method | Endpoint | Services | Status | Existing API Path | -+========+===============================================================+=============================================+===========+=============================================+ -| GET | /api/instructor/v1/courses/{course_key}/info | instructor, xmodule.modulestore | Missing | N/A | -+--------+---------------------------------------------------------------+---------------------------------------------+-----------+---------------------------------------------+ -| PUT | /api/instructor/v1/courses/{course_key}/info | instructor, xmodule.modulestore | Missing | N/A | -+--------+---------------------------------------------------------------+---------------------------------------------+-----------+---------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/instructor_tasks | instructor_task | Partial | /api/instructor/v1/tasks/{course_id} | -+--------+---------------------------------------------------------------+---------------------------------------------+-----------+---------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/modes | course_modes | Missing | N/A | -+--------+---------------------------------------------------------------+---------------------------------------------+-----------+---------------------------------------------+ -| PUT | /api/instructor/v1/courses/{course_key}/modes/{mode_id}/price | course_modes | Missing | N/A | -+--------+---------------------------------------------------------------+---------------------------------------------+-----------+---------------------------------------------+ +While ``/api/courses/v1/`` provides learner-facing course information, these instructor-specific endpoints provide administrative data (enrollment counts by mode, instructor tasks, pricing management) that require instructor permissions. + ++--------+---------------------------------------------------------------+---------------------------------------------+-----------+---------------------------------------------+-------------------------------------------------------------------------+ +| Method | Endpoint | Services | Status | Existing API Path | Description | ++========+===============================================================+=============================================+===========+=============================================+=========================================================================+ +| GET | /api/instructor/v1/courses/{course_key} | instructor, xmodule.modulestore | Missing | N/A | Retrieve course metadata including enrollment counts and settings | ++--------+---------------------------------------------------------------+---------------------------------------------+-----------+---------------------------------------------+-------------------------------------------------------------------------+ +| PATCH | /api/instructor/v1/courses/{course_key} | instructor, xmodule.modulestore | Missing | N/A | Update course settings (partial update) | ++--------+---------------------------------------------------------------+---------------------------------------------+-----------+---------------------------------------------+-------------------------------------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/instructor_tasks | instructor_task | Partial | /api/instructor/v1/tasks/{course_id} | List background tasks for the course | ++--------+---------------------------------------------------------------+---------------------------------------------+-----------+---------------------------------------------+-------------------------------------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/modes | course_modes | Missing | N/A | Retrieve enrollment modes and pricing for the course | ++--------+---------------------------------------------------------------+---------------------------------------------+-----------+---------------------------------------------+-------------------------------------------------------------------------+ +| PATCH | /api/instructor/v1/courses/{course_key}/modes/{mode_id}/price | course_modes | Missing | N/A | Update pricing for a specific enrollment mode | ++--------+---------------------------------------------------------------+---------------------------------------------+-----------+---------------------------------------------+-------------------------------------------------------------------------+ Membership Management API ^^^^^^^^^^^^^^^^^^^^^^^^^ -+--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+ -| Method | Endpoint | Services | Status | Existing API Path | -+========+====================================================================+================================+===========+===================================================================+ -| GET | /api/instructor/v1/courses/{course_key}/enrollment | enrollments, student | Missing | N/A | -+--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/enrollment | enrollments, student | Partial | /courses/{course_id}/instructor/api/students_update_enrollment | -+--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+ -| DELETE | /api/instructor/v1/courses/{course_key}/enrollment | enrollments, student | Missing | N/A | -+--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/enrollment/batch | bulk_enroll, bulk_email | Partial | /courses/{course_id}/instructor/api/register_and_enroll_students | -+--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/enrollment/csv_upload | bulk_enroll, util | Missing | N/A | -+--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/roles | student.auth | Missing | N/A | -+--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/roles | student.auth | Partial | /courses/{course_id}/instructor/api/modify_access | -+--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+ -| DELETE | /api/instructor/v1/courses/{course_key}/roles | student.auth | Missing | N/A | -+--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/roles/{role_type}/members | student.auth | Partial | /courses/{course_id}/instructor/api/list_course_role_members | -+--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/beta_testers | student.auth | Missing | N/A | -+--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/beta_testers | student.auth | Partial | /courses/{course_id}/instructor/api/bulk_beta_modify_access | -+--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+ -| DELETE | /api/instructor/v1/courses/{course_key}/beta_testers | student.auth | Missing | N/A | -+--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/forum/members | discussion, student.auth | Partial | /courses/{course_id}/instructor/api/list_forum_members | -+--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/forum/members | discussion, student.auth | Partial | /courses/{course_id}/instructor/api/update_forum_role_membership | -+--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+ -| DELETE | /api/instructor/v1/courses/{course_key}/forum/members | discussion, student.auth | Missing | N/A | -+--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+ +The ``GET /enrollments`` endpoint may return large datasets (thousands to hundreds of thousands of entries). Implementation must include pagination and performance optimization. + ++--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+----------------------------------------------------------------------------------------------+ +| Method | Endpoint | Services | Status | Existing API Path | Description | ++========+====================================================================+================================+===========+===================================================================+==============================================================================================+ +| GET | /api/instructor/v1/courses/{course_key}/enrollments | enrollments, student | Missing | N/A | List all enrollments in the course (supports filtering by username, email) | ++--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+----------------------------------------------------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/enrollments | enrollments, student | Partial | /courses/{course_id}/instructor/api/students_update_enrollment | Enroll or unenroll a single student | ++--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+----------------------------------------------------------------------------------------------+ +| DELETE | /api/instructor/v1/courses/{course_key}/enrollments | enrollments, student | Missing | N/A | Unenroll student(s) specified by query parameters | ++--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+----------------------------------------------------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/enrollments/batch | bulk_enroll, bulk_email | Partial | /courses/{course_id}/instructor/api/register_and_enroll_students | Bulk enroll/unenroll students (auto-register if needed, send email notification) | ++--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+----------------------------------------------------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/enrollments/csv_upload | bulk_enroll, util | Missing | N/A | Upload CSV file to bulk enroll/unenroll students | ++--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+----------------------------------------------------------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/roles/{role_type}/members | student.auth | Partial | /courses/{course_id}/instructor/api/list_course_role_members | List users with a specific course role (staff, instructor, beta_tester, etc.) | ++--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+----------------------------------------------------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/roles/{username} | student.auth | Partial | /courses/{course_id}/instructor/api/modify_access | Grant a course role to a user (role specified in request body) | ++--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+----------------------------------------------------------------------------------------------+ +| DELETE | /api/instructor/v1/courses/{course_key}/roles/{username} | student.auth | Missing | N/A | Revoke a course role from a user (role specified in request body) | ++--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+----------------------------------------------------------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/beta_testers | student.auth | Missing | N/A | List all beta testers for the course | ++--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+----------------------------------------------------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/beta_testers | student.auth | Partial | /courses/{course_id}/instructor/api/bulk_beta_modify_access | Bulk add users to beta tester role | ++--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+----------------------------------------------------------------------------------------------+ +| DELETE | /api/instructor/v1/courses/{course_key}/beta_testers | student.auth | Missing | N/A | Bulk remove users from beta tester role | ++--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+----------------------------------------------------------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/forum/members | discussion, student.auth | Partial | /courses/{course_id}/instructor/api/list_forum_members | List users with forum moderation roles | ++--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+----------------------------------------------------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/forum/members | discussion, student.auth | Partial | /courses/{course_id}/instructor/api/update_forum_role_membership | Grant forum moderation role to users | ++--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+----------------------------------------------------------------------------------------------+ +| DELETE | /api/instructor/v1/courses/{course_key}/forum/members | discussion, student.auth | Missing | N/A | Revoke forum moderation role from users | ++--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+----------------------------------------------------------------------------------------------+ Student Administration API ^^^^^^^^^^^^^^^^^^^^^^^^^^ -+--------+----------------------------------------------------------------------------------+--------------------------------------------------+-----------+-------------------------------------------------------------------------------+ -| Method | Endpoint | Services | Status | Existing API Path | -+========+==================================================================================+==================================================+===========+===============================================================================+ -| GET | /api/instructor/v1/courses/{course_key}/students | student, instructor | Missing | N/A | -+--------+----------------------------------------------------------------------------------+--------------------------------------------------+-----------+-------------------------------------------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/students/{username} | student, instructor | Missing | N/A | -+--------+----------------------------------------------------------------------------------+--------------------------------------------------+-----------+-------------------------------------------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/students/{username}/enrollment_status | enrollments | Exists | /courses/{course_id}/instructor/api/get_student_enrollment_status | -+--------+----------------------------------------------------------------------------------+--------------------------------------------------+-----------+-------------------------------------------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/students/{username}/progress_url | student, instructor | Exists | /courses/{course_id}/instructor/api/get_student_progress_url | -+--------+----------------------------------------------------------------------------------+--------------------------------------------------+-----------+-------------------------------------------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/students/{username}/reset_attempts | grades, xmodule.modulestore, instructor_task | Exists | /courses/{course_id}/instructor/api/reset_student_attempts | -+--------+----------------------------------------------------------------------------------+--------------------------------------------------+-----------+-------------------------------------------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/students/{username}/reset_entrance_exam | grades, xmodule.modulestore | Exists | /courses/{course_id}/instructor/api/reset_student_attempts_for_entrance_exam | -+--------+----------------------------------------------------------------------------------+--------------------------------------------------+-----------+-------------------------------------------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/students/{username}/rescore_problem | grades, xmodule.modulestore, instructor_task | Exists | /courses/{course_id}/instructor/api/rescore_problem | -+--------+----------------------------------------------------------------------------------+--------------------------------------------------+-----------+-------------------------------------------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/students/{username}/override_score | grades, xmodule.modulestore | Exists | /courses/{course_id}/instructor/api/override_problem_score | -+--------+----------------------------------------------------------------------------------+--------------------------------------------------+-----------+-------------------------------------------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/students/{username}/delete_state | student, xmodule.modulestore | Missing | N/A | -+--------+----------------------------------------------------------------------------------+--------------------------------------------------+-----------+-------------------------------------------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/problems/{problem_id}/reset_attempts_all | grades, xmodule.modulestore, instructor_task | Missing | N/A | -+--------+----------------------------------------------------------------------------------+--------------------------------------------------+-----------+-------------------------------------------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/problems/{problem_id}/rescore_all | grades, xmodule.modulestore, instructor_task | Missing | N/A | -+--------+----------------------------------------------------------------------------------+--------------------------------------------------+-----------+-------------------------------------------------------------------------------+ +The ``GET /students/{username}`` endpoint will include ``enrollment_status`` and ``progress_url`` fields in the response. Separate endpoints for these single attributes are not needed. + ++--------+----------------------------------------------------------------------------------+--------------------------------------------------+-----------+-------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------+ +| Method | Endpoint | Services | Status | Existing API Path | Description | ++========+==================================================================================+==================================================+===========+===============================================================================+=============================================================================================+ +| GET | /api/instructor/v1/courses/{course_key}/students | student, instructor | Missing | N/A | List all students enrolled in the course (supports filtering and pagination) | ++--------+----------------------------------------------------------------------------------+--------------------------------------------------+-----------+-------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/students/{username} | student, instructor, enrollments | Partial | /courses/{course_id}/instructor/api/get_student_enrollment_status | Retrieve student info including enrollment status and progress URL | +| | | | | /courses/{course_id}/instructor/api/get_student_progress_url | | ++--------+----------------------------------------------------------------------------------+--------------------------------------------------+-----------+-------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/students/{username}/reset_attempts | grades, xmodule.modulestore, instructor_task | Exists | /courses/{course_id}/instructor/api/reset_student_attempts | Reset student's attempts for a specific problem (requires problem location in body) | ++--------+----------------------------------------------------------------------------------+--------------------------------------------------+-----------+-------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/students/{username}/reset_entrance_exam | grades, xmodule.modulestore | Exists | /courses/{course_id}/instructor/api/reset_student_attempts_for_entrance_exam | Reset student's entrance exam attempts and allow retake | ++--------+----------------------------------------------------------------------------------+--------------------------------------------------+-----------+-------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/students/{username}/rescore_problem | grades, xmodule.modulestore, instructor_task | Exists | /courses/{course_id}/instructor/api/rescore_problem | Rescore a specific problem for a student (requires problem location in body) | ++--------+----------------------------------------------------------------------------------+--------------------------------------------------+-----------+-------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/students/{username}/override_score | grades, xmodule.modulestore | Exists | /courses/{course_id}/instructor/api/override_problem_score | Manually override a student's score for a specific problem | ++--------+----------------------------------------------------------------------------------+--------------------------------------------------+-----------+-------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/students/{username}/delete_state | student, xmodule.modulestore | Missing | N/A | Delete student's state/progress for a specific problem or unit | ++--------+----------------------------------------------------------------------------------+--------------------------------------------------+-----------+-------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/problems/{problem_id}/reset_attempts_all | grades, xmodule.modulestore, instructor_task | Missing | N/A | Reset attempts for all students for a specific problem | ++--------+----------------------------------------------------------------------------------+--------------------------------------------------+-----------+-------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/problems/{problem_id}/rescore_all | grades, xmodule.modulestore, instructor_task | Missing | N/A | Rescore a specific problem for all students in the course | ++--------+----------------------------------------------------------------------------------+--------------------------------------------------+-----------+-------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------+ Cohort Management API ^^^^^^^^^^^^^^^^^^^^^ -+--------+------------------------------------------------------------------------------------+--------------------------------------------+-----------+-------------------------------------------------------------------+ -| Method | Endpoint | Services | Status | Existing API Path | -+========+====================================================================================+============================================+===========+===================================================================+ -| GET | /api/instructor/v1/courses/{course_key}/cohorts | openedx.core.djangoapps.course_groups | Missing | N/A | -+--------+------------------------------------------------------------------------------------+--------------------------------------------+-----------+-------------------------------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/cohorts | openedx.core.djangoapps.course_groups | Missing | N/A | -+--------+------------------------------------------------------------------------------------+--------------------------------------------+-----------+-------------------------------------------------------------------+ -| PUT | /api/instructor/v1/courses/{course_key}/cohorts/{cohort_id} | openedx.core.djangoapps.course_groups | Missing | N/A | -+--------+------------------------------------------------------------------------------------+--------------------------------------------+-----------+-------------------------------------------------------------------+ -| DELETE | /api/instructor/v1/courses/{course_key}/cohorts/{cohort_id} | openedx.core.djangoapps.course_groups | Missing | N/A | -+--------+------------------------------------------------------------------------------------+--------------------------------------------+-----------+-------------------------------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/cohorts/{cohort_id}/students | openedx.core.djangoapps.course_groups | Missing | N/A | -+--------+------------------------------------------------------------------------------------+--------------------------------------------+-----------+-------------------------------------------------------------------+ -| DELETE | /api/instructor/v1/courses/{course_key}/cohorts/{cohort_id}/students | openedx.core.djangoapps.course_groups | Missing | N/A | -+--------+------------------------------------------------------------------------------------+--------------------------------------------+-----------+-------------------------------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/cohorts/csv_upload | openedx.core.djangoapps.course_groups, util| Partial | /courses/{course_id}/instructor/api/add_users_to_cohorts | -+--------+------------------------------------------------------------------------------------+--------------------------------------------+-----------+-------------------------------------------------------------------+ +The existing Cohort API at ``/api/cohorts/v1/`` provides full cohort management functionality. The instructor dashboard should use these existing endpoints rather than creating instructor-specific duplicates. See https://courses.edx.org/api-docs/ for complete API documentation. Discussion Management API ^^^^^^^^^^^^^^^^^^^^^^^^^ -+--------+------------------------------------------------------------------------------------+-----------------------------------------+-----------+----------------------------------------------------------+ -| Method | Endpoint | Services | Status | Existing API Path | -+========+====================================================================================+=========================================+===========+==========================================================+ -| GET | /api/instructor/v1/courses/{course_key}/discussions/topics | discussion | Missing | N/A | -+--------+------------------------------------------------------------------------------------+-----------------------------------------+-----------+----------------------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/discussions/topics | discussion, xmodule.modulestore | Missing | N/A | -+--------+------------------------------------------------------------------------------------+-----------------------------------------+-----------+----------------------------------------------------------+ -| PUT | /api/instructor/v1/courses/{course_key}/discussions/topics/{topic_id} | discussion | Missing | N/A | -+--------+------------------------------------------------------------------------------------+-----------------------------------------+-----------+----------------------------------------------------------+ -| DELETE | /api/instructor/v1/courses/{course_key}/discussions/topics/{topic_id} | discussion | Missing | N/A | -+--------+------------------------------------------------------------------------------------+-----------------------------------------+-----------+----------------------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/discussions/settings | discussion | Missing | N/A | -+--------+------------------------------------------------------------------------------------+-----------------------------------------+-----------+----------------------------------------------------------+ -| PUT | /api/instructor/v1/courses/{course_key}/discussions/settings | discussion | Missing | N/A | -+--------+------------------------------------------------------------------------------------+-----------------------------------------+-----------+----------------------------------------------------------+ +The existing Discussion API at ``/api/discussion/v1/`` provides full discussion management functionality including course topics (``GET /discussion/v2/course_topics/{course_id}``), settings (``GET/PATCH /discussion/v1/courses/{course_id}/settings``), and role management (``GET/POST /discussion/v1/courses/{course_id}/roles/{rolename}/``). The instructor dashboard should use these existing REST endpoints. Additionally, ``/api/discussions/v0/`` provides discussion provider configuration. No instructor-specific discussion endpoints are needed. Extensions & Deadlines API ^^^^^^^^^^^^^^^^^^^^^^^^^^ -+--------+-----------------------------------------------------------------------------------+----------------------------------+-----------+-------------------------------------------------------------------+ -| Method | Endpoint | Services | Status | Existing API Path | -+========+===================================================================================+==================================+===========+===================================================================+ -| GET | /api/instructor/v1/courses/{course_key}/extensions | util.date_utils | Missing | N/A | -+--------+-----------------------------------------------------------------------------------+----------------------------------+-----------+-------------------------------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/extensions | util.date_utils | Partial | /courses/{course_id}/instructor/api/change_due_date | -+--------+-----------------------------------------------------------------------------------+----------------------------------+-----------+-------------------------------------------------------------------+ -| PUT | /api/instructor/v1/courses/{course_key}/extensions/{extension_id} | util.date_utils | Missing | N/A | -+--------+-----------------------------------------------------------------------------------+----------------------------------+-----------+-------------------------------------------------------------------+ -| DELETE | /api/instructor/v1/courses/{course_key}/extensions/{extension_id} | util.date_utils | Partial | /courses/{course_id}/instructor/api/reset_due_date | -+--------+-----------------------------------------------------------------------------------+----------------------------------+-----------+-------------------------------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/extensions/{username} | util.date_utils, student | Exists | /courses/{course_id}/instructor/api/show_student_extensions | -+--------+-----------------------------------------------------------------------------------+----------------------------------+-----------+-------------------------------------------------------------------+ +These endpoints manage instructor-granted due date extensions (per-student deadline overrides), which are distinct from the learner-facing course deadline APIs at ``/api/course_experience/v1/``. Extensions are instructor-specific administrative operations requiring instructor permissions. + ++--------+-----------------------------------------------------------------------------------+----------------------------------+-----------+-------------------------------------------------------------------+-----------------------------------------------------------------------------------------+ +| Method | Endpoint | Services | Status | Existing API Path | Description | ++========+===================================================================================+==================================+===========+===================================================================+=========================================================================================+ +| GET | /api/instructor/v1/courses/{course_key}/extensions | util.date_utils | Missing | N/A | List all due date extensions for a unit (requires unit usage_key in query params) | ++--------+-----------------------------------------------------------------------------------+----------------------------------+-----------+-------------------------------------------------------------------+-----------------------------------------------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/extensions | util.date_utils | Partial | /courses/{course_id}/instructor/api/change_due_date | Grant a due date extension to a student for a specific unit | ++--------+-----------------------------------------------------------------------------------+----------------------------------+-----------+-------------------------------------------------------------------+-----------------------------------------------------------------------------------------+ +| PATCH | /api/instructor/v1/courses/{course_key}/extensions/{extension_id} | util.date_utils | Missing | N/A | Update an existing due date extension | ++--------+-----------------------------------------------------------------------------------+----------------------------------+-----------+-------------------------------------------------------------------+-----------------------------------------------------------------------------------------+ +| DELETE | /api/instructor/v1/courses/{course_key}/extensions/{extension_id} | util.date_utils | Partial | /courses/{course_id}/instructor/api/reset_due_date | Remove a due date extension (revert to original deadline) | ++--------+-----------------------------------------------------------------------------------+----------------------------------+-----------+-------------------------------------------------------------------+-----------------------------------------------------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/extensions/{username} | util.date_utils, student | Exists | /courses/{course_id}/instructor/api/show_student_extensions | List all due date extensions granted to a specific student | ++--------+-----------------------------------------------------------------------------------+----------------------------------+-----------+-------------------------------------------------------------------+-----------------------------------------------------------------------------------------+ Data Export API ^^^^^^^^^^^^^^^ -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+ -| Method | Endpoint | Services | Status | Existing API Path | -+========+===================================================================================+==============================================+===========+===================================================================+ -| GET | /api/instructor/v1/courses/{course_key}/data_downloads | instructor_task, util | Partial | /api/instructor/v1/reports/{course_id} | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/data_downloads | instructor_task, util | Missing | N/A | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/data_downloads/{download_id} | instructor_task, util | Missing | N/A | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+ -| DELETE | /api/instructor/v1/courses/{course_key}/data_downloads/{download_id} | instructor_task, util | Missing | N/A | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/data_downloads/student_profiles | instructor_task, student | Missing | N/A | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/data_downloads/grade_report | instructor_task, grades | Exists | /courses/{course_id}/instructor/api/calculate_grades_csv | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/data_downloads/problem_grade_report | instructor_task, grades | Exists | /courses/{course_id}/instructor/api/problem_grade_report | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/data_downloads/course_structure | instructor_task, xmodule.modulestore | Missing | N/A | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/data_downloads/survey_results | instructor_task, grades | Exists | /courses/{course_id}/instructor/api/get_course_survey_results | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+ +Report generation uses POST endpoints for each specific report type (e.g., ``/downloads/grade_report``). There is no generic ``POST /downloads`` endpoint - each report type has its own endpoint. + ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ +| Method | Endpoint | Services | Status | Existing API Path | Description | ++========+===================================================================================+==============================================+===========+===================================================================+==================================================================================================+ +| GET | /api/instructor/v1/courses/{course_key}/downloads | instructor_task, util | Partial | /api/instructor/v1/reports/{course_id} | List all available report downloads (generated reports ready for download) | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/downloads/{download_id} | instructor_task, util | Missing | N/A | Retrieve metadata and download URL for a specific report | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ +| DELETE | /api/instructor/v1/courses/{course_key}/downloads/{download_id} | instructor_task, util | Missing | N/A | Delete a generated report file | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/downloads/student_profiles | instructor_task, student | Missing | N/A | Generate CSV report of student profile information | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/downloads/grade_report | instructor_task, grades | Exists | /courses/{course_id}/instructor/api/calculate_grades_csv | Generate CSV grade report for all enrolled students | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/downloads/problem_grade_report | instructor_task, grades | Exists | /courses/{course_id}/instructor/api/problem_grade_report | Generate CSV report of problem-level grades for all students | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/downloads/course_structure | instructor_task, xmodule.modulestore | Missing | N/A | Generate JSON/CSV export of course structure | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/downloads/survey_results | instructor_task, grades | Exists | /courses/{course_id}/instructor/api/get_course_survey_results | Generate CSV report of survey results | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+--------------------------------------------------------------------------------------------------+ Bulk Email API ^^^^^^^^^^^^^^ -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+ -| Method | Endpoint | Services | Status | Existing API Path | -+========+===================================================================================+==============================================+===========+===================================================================+ -| GET | /api/instructor/v1/courses/{course_key}/bulk_email | bulk_email | Missing | N/A | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/bulk_email | bulk_email, instructor_task | Exists | /courses/{course_id}/instructor/api/send_email | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/bulk_email/{email_id} | bulk_email | Missing | N/A | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/bulk_email/{email_id}/status | bulk_email, instructor_task | Partial | /courses/{course_id}/instructor/api/list_background_email_tasks | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+ -| DELETE | /api/instructor/v1/courses/{course_key}/bulk_email/{email_id} | bulk_email | Missing | N/A | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/email_templates | bulk_email | Exists | /courses/{course_id}/instructor/api/list_email_content | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+ +No REST API currently exists for bulk email operations. The existing ``bulk_email`` module provides internal APIs but not RESTful endpoints. These instructor-specific endpoints will provide the first REST API for bulk email functionality. + ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+-------------------------------------------------------------------------------------------+ +| Method | Endpoint | Services | Status | Existing API Path | Description | ++========+===================================================================================+==============================================+===========+===================================================================+===========================================================================================+ +| GET | /api/instructor/v1/courses/{course_key}/bulk_email | bulk_email | Missing | N/A | List all sent bulk emails for the course | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+-------------------------------------------------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/bulk_email | bulk_email, instructor_task | Exists | /courses/{course_id}/instructor/api/send_email | Send bulk email to students (supports targeting by cohort, enrollment track, etc.) | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+-------------------------------------------------------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/bulk_email/{email_id} | bulk_email | Missing | N/A | Retrieve details of a specific bulk email | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+-------------------------------------------------------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/bulk_email/{email_id}/status | bulk_email, instructor_task | Partial | /courses/{course_id}/instructor/api/list_background_email_tasks | Get send status for a bulk email (pending, in-progress, completed) | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+-------------------------------------------------------------------------------------------+ +| DELETE | /api/instructor/v1/courses/{course_key}/bulk_email/{email_id} | bulk_email | Missing | N/A | Cancel a pending bulk email or delete email record | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+-------------------------------------------------------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/email_templates | bulk_email | Exists | /courses/{course_id}/instructor/api/list_email_content | List previously sent emails (serves as templates for new emails) | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+-------------------------------------------------------------------------------------------+ Special Exams API ^^^^^^^^^^^^^^^^^ -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+ -| Method | Endpoint | Services | Status | Existing API Path | -+========+===================================================================================+==============================================+===========+===================================================================+ -| GET | /api/instructor/v1/courses/{course_key}/special_exams | edx_proctoring, grades | Missing | N/A | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/special_exams/{exam_id} | edx_proctoring, grades | Missing | N/A | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/special_exams/{exam_id}/reset/{username} | edx_proctoring, InstructorService | Missing | N/A | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/special_exams/{exam_id}/attempts | edx_proctoring, grades | Partial | /courses/{course_id}/instructor/api/get_proctored_exam_results | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/proctoring_settings | edx_proctoring | Missing | N/A | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+ -| PUT | /api/instructor/v1/courses/{course_key}/proctoring_settings | edx_proctoring | Missing | N/A | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/special_exams/{exam_id}/allowance | edx_proctoring, student | Missing | N/A | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+ +Proctoring functionality is provided by the ``edx-proctoring`` plugin. These endpoints provide instructor-facing operations for managing proctored exams, accommodations, and reviewing attempts. Consider whether these should be added to the proctoring plugin's API or kept in the instructor API for consistency. + ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+-------------------------------------------------------------------------------------------+ +| Method | Endpoint | Services | Status | Existing API Path | Description | ++========+===================================================================================+==============================================+===========+===================================================================+===========================================================================================+ +| GET | /api/instructor/v1/courses/{course_key}/special_exams | edx_proctoring, grades | Missing | N/A | List all proctored/timed exams in the course | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+-------------------------------------------------------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/special_exams/{exam_id} | edx_proctoring, grades | Missing | N/A | Retrieve details and statistics for a specific special exam | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+-------------------------------------------------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/special_exams/{exam_id}/reset/{username} | edx_proctoring, InstructorService | Missing | N/A | Reset a student's proctored exam attempt | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+-------------------------------------------------------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/special_exams/{exam_id}/attempts | edx_proctoring, grades | Partial | /courses/{course_id}/instructor/api/get_proctored_exam_results | List all attempts for a proctored exam with review status | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+-------------------------------------------------------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/proctoring_settings | edx_proctoring | Missing | N/A | Retrieve proctoring configuration for the course | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+-------------------------------------------------------------------------------------------+ +| PATCH | /api/instructor/v1/courses/{course_key}/proctoring_settings | edx_proctoring | Missing | N/A | Update proctoring settings for the course | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+-------------------------------------------------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/special_exams/{exam_id}/allowance | edx_proctoring, student | Missing | N/A | Grant time extension or accommodation for a student on a proctored exam | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+-------------------------------------------------------------------+-------------------------------------------------------------------------------------------+ Certificates API ^^^^^^^^^^^^^^^^ -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+--------------------------------------------------------------------------+ -| Method | Endpoint | Services | Status | Existing API Path | -+========+===================================================================================+==============================================+===========+==========================================================================+ -| GET | /api/instructor/v1/courses/{course_key}/certificates | certificates | Partial | /courses/{course_id}/instructor/api/get_issued_certificates | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+--------------------------------------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/certificates/generate | certificates, instructor_task | Exists | /courses/{course_id}/instructor/api/start_certificate_generation | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+--------------------------------------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/certificates/generate/{username} | certificates, student | Missing | N/A | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+--------------------------------------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/certificates/generate_bulk | certificates, instructor_task | Exists | /courses/{course_id}/instructor/api/generate_bulk_certificate_exceptions | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+--------------------------------------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/certificates/allowlist | certificates | Missing | N/A | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+--------------------------------------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/certificates/allowlist | certificates, student | Partial | /courses/{course_id}/instructor/api/certificate_exception_view | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+--------------------------------------------------------------------------+ -| DELETE | /api/instructor/v1/courses/{course_key}/certificates/allowlist | certificates | Missing | N/A | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+--------------------------------------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/certificates/{certificate_id}/status | certificates | Missing | N/A | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+--------------------------------------------------------------------------+ +While ``/api/certificates/v0/`` provides learner-facing certificate retrieval, these instructor-specific endpoints provide administrative operations (certificate generation, allowlist management, bulk operations) that require instructor permissions. + ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+--------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+ +| Method | Endpoint | Services | Status | Existing API Path | Description | ++========+===================================================================================+==============================================+===========+==========================================================================+====================================================================================================+ +| GET | /api/instructor/v1/courses/{course_key}/certificates | certificates | Partial | /courses/{course_id}/instructor/api/get_issued_certificates | List issued certificates for the course | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+--------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/certificates/generate | certificates, instructor_task | Exists | /courses/{course_id}/instructor/api/start_certificate_generation | Generate certificates for all eligible students | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+--------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/certificates/generate/{username} | certificates, student | Missing | N/A | Generate certificate for a specific student | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+--------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/certificates/generate_bulk | certificates, instructor_task | Exists | /courses/{course_id}/instructor/api/generate_bulk_certificate_exceptions | Bulk generate certificates for students on the allowlist | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+--------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/certificates/allowlist | certificates | Missing | N/A | List students on the certificate allowlist (students who can receive certs despite not passing) | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+--------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/certificates/allowlist | certificates, student | Partial | /courses/{course_id}/instructor/api/certificate_exception_view | Add student(s) to certificate allowlist | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+--------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+ +| DELETE | /api/instructor/v1/courses/{course_key}/certificates/allowlist | certificates | Missing | N/A | Remove student(s) from certificate allowlist | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+--------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/certificates/{certificate_id}/status | certificates | Missing | N/A | Get generation status for a specific certificate | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+--------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+ Open Response Assessment API ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +The ``ora_staff_grader`` module provides ORA grading functionality. These endpoints expose instructor-facing operations for managing ORA submissions, overriding grades, and resetting attempts. -+--------+-------------------------------------------------------------------------------------------------+----------------------------------------------+-----------+--------------------------------------------------------+ -| Method | Endpoint | Services | Status | Existing API Path | -+========+=================================================================================================+==============================================+===========+========================================================+ -| GET | /api/instructor/v1/courses/{course_key}/ora | ora_staff_grader, xmodule.modulestore | Missing | N/A | -+--------+-------------------------------------------------------------------------------------------------+----------------------------------------------+-----------+--------------------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/ora/{ora_id} | ora_staff_grader, xmodule.modulestore | Missing | N/A | -+--------+-------------------------------------------------------------------------------------------------+----------------------------------------------+-----------+--------------------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/ora/{ora_id}/submissions | ora_staff_grader | Missing | N/A | -+--------+-------------------------------------------------------------------------------------------------+----------------------------------------------+-----------+--------------------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/ora/{ora_id}/submissions/{submission_id} | ora_staff_grader | Missing | N/A | -+--------+-------------------------------------------------------------------------------------------------+----------------------------------------------+-----------+--------------------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/ora/{ora_id}/submissions/{submission_id}/override_grade | ora_staff_grader | Missing | N/A | -+--------+-------------------------------------------------------------------------------------------------+----------------------------------------------+-----------+--------------------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/ora/{ora_id}/submissions/{submission_id}/reset | ora_staff_grader | Partial | /courses/{course_id}/instructor/api/export_ora2_data | -+--------+-------------------------------------------------------------------------------------------------+----------------------------------------------+-----------+--------------------------------------------------------+ ++--------+-------------------------------------------------------------------------------------------------+----------------------------------------------+-----------+--------------------------------------------------------+-------------------------------------------------------------------------------------------+ +| Method | Endpoint | Services | Status | Existing API Path | Description | ++========+=================================================================================================+==============================================+===========+========================================================+===========================================================================================+ +| GET | /api/instructor/v1/courses/{course_key}/ora | ora_staff_grader, xmodule.modulestore | Missing | N/A | List all ORA problems in the course | ++--------+-------------------------------------------------------------------------------------------------+----------------------------------------------+-----------+--------------------------------------------------------+-------------------------------------------------------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/ora/{ora_id} | ora_staff_grader, xmodule.modulestore | Missing | N/A | Retrieve details and statistics for a specific ORA problem | ++--------+-------------------------------------------------------------------------------------------------+----------------------------------------------+-----------+--------------------------------------------------------+-------------------------------------------------------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/ora/{ora_id}/submissions | ora_staff_grader | Missing | N/A | List all student submissions for an ORA problem | ++--------+-------------------------------------------------------------------------------------------------+----------------------------------------------+-----------+--------------------------------------------------------+-------------------------------------------------------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/ora/{ora_id}/submissions/{submission_id} | ora_staff_grader | Missing | N/A | Retrieve details for a specific ORA submission | ++--------+-------------------------------------------------------------------------------------------------+----------------------------------------------+-----------+--------------------------------------------------------+-------------------------------------------------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/ora/{ora_id}/submissions/{submission_id}/override_grade | ora_staff_grader | Missing | N/A | Manually override the grade for an ORA submission | ++--------+-------------------------------------------------------------------------------------------------+----------------------------------------------+-----------+--------------------------------------------------------+-------------------------------------------------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/ora/{ora_id}/submissions/{submission_id}/reset | ora_staff_grader | Partial | /courses/{course_id}/instructor/api/export_ora2_data | Reset an ORA submission (allow student to resubmit) | ++--------+-------------------------------------------------------------------------------------------------+----------------------------------------------+-----------+--------------------------------------------------------+-------------------------------------------------------------------------------------------+ Analytics API ^^^^^^^^^^^^^ -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+----------------------------------------------------------+ -| Method | Endpoint | Services | Status | Existing API Path | -+========+===================================================================================+==============================================+===========+==========================================================+ -| GET | /api/instructor/v1/courses/{course_key}/analytics/dashboard_url | instructor_analytics | Missing | N/A | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+----------------------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/analytics/summary | instructor_analytics, student | Missing | N/A | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+----------------------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/analytics/engagement | instructor_analytics | Missing | N/A | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+----------------------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/analytics/performance | instructor_analytics, grades | Missing | N/A | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+----------------------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/analytics/enrollment_stats | instructor_analytics, enrollments | Missing | N/A | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+----------------------------------------------------------+ +The analytics dashboard URL will be included in the ``GET /api/instructor/v1/courses/{course_key}`` response as ``analytics_dashboard_url``. + ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+----------------------------------------------------------+-------------------------------------------------------------------------------------------+ +| Method | Endpoint | Services | Status | Existing API Path | Description | ++========+===================================================================================+==============================================+===========+==========================================================+===========================================================================================+ +| GET | /api/instructor/v1/courses/{course_key}/analytics/summary | instructor_analytics, student | Missing | N/A | Retrieve high-level analytics summary (enrollment, engagement, performance metrics) | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+----------------------------------------------------------+-------------------------------------------------------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/analytics/engagement | instructor_analytics | Missing | N/A | Retrieve student engagement metrics (activity, time spent, participation) | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+----------------------------------------------------------+-------------------------------------------------------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/analytics/performance | instructor_analytics, grades | Missing | N/A | Retrieve performance metrics (grades distribution, problem completion rates) | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+----------------------------------------------------------+-------------------------------------------------------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/analytics/enrollment_stats | instructor_analytics, enrollments | Missing | N/A | Retrieve enrollment statistics over time (trends, demographics) | ++--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+----------------------------------------------------------+-------------------------------------------------------------------------------------------+ From c25044d9918603ddf0c9987d46fa0bda3a242914 Mon Sep 17 00:00:00 2001 From: Jesse Stewart Date: Mon, 6 Oct 2025 14:52:52 -0400 Subject: [PATCH 08/13] docs: address feedback --- ...ructor-dashboard-rest-api-architecture.rst | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/docs/decisions/0003-instructor-dashboard-rest-api-architecture.rst b/docs/decisions/0003-instructor-dashboard-rest-api-architecture.rst index a4e56f06..334ecc9f 100644 --- a/docs/decisions/0003-instructor-dashboard-rest-api-architecture.rst +++ b/docs/decisions/0003-instructor-dashboard-rest-api-architecture.rst @@ -253,14 +253,14 @@ Analytics API The analytics dashboard URL will be included in the ``GET /api/instructor/v1/courses/{course_key}`` response as ``analytics_dashboard_url``. -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+----------------------------------------------------------+-------------------------------------------------------------------------------------------+ -| Method | Endpoint | Services | Status | Existing API Path | Description | -+========+===================================================================================+==============================================+===========+==========================================================+===========================================================================================+ -| GET | /api/instructor/v1/courses/{course_key}/analytics/summary | instructor_analytics, student | Missing | N/A | Retrieve high-level analytics summary (enrollment, engagement, performance metrics) | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+----------------------------------------------------------+-------------------------------------------------------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/analytics/engagement | instructor_analytics | Missing | N/A | Retrieve student engagement metrics (activity, time spent, participation) | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+----------------------------------------------------------+-------------------------------------------------------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/analytics/performance | instructor_analytics, grades | Missing | N/A | Retrieve performance metrics (grades distribution, problem completion rates) | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+----------------------------------------------------------+-------------------------------------------------------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/analytics/enrollment_stats | instructor_analytics, enrollments | Missing | N/A | Retrieve enrollment statistics over time (trends, demographics) | -+--------+-----------------------------------------------------------------------------------+----------------------------------------------+-----------+----------------------------------------------------------+-------------------------------------------------------------------------------------------+ ++--------+--------------------------------------------------------------------------+----------------------------------------------+-----------+----------------------------+-------------------------------------------------------------------------------------------+ +| Method | Endpoint | Services | Status | Existing API Path | Description | ++========+==========================================================================+==============================================+===========+============================+===========================================================================================+ +| GET | /api/instructor/v1/courses/{course_key}/analytics/summary | instructor_analytics, student | Missing | N/A | Retrieve high-level analytics summary (enrollment, engagement, performance metrics) | ++--------+--------------------------------------------------------------------------+----------------------------------------------+-----------+----------------------------+-------------------------------------------------------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/analytics/engagement | instructor_analytics | Missing | N/A | Retrieve student engagement metrics (activity, time spent, participation) | ++--------+--------------------------------------------------------------------------+----------------------------------------------+-----------+----------------------------+-------------------------------------------------------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/analytics/performance | instructor_analytics, grades | Missing | N/A | Retrieve performance metrics (grades distribution, problem completion rates) | ++--------+--------------------------------------------------------------------------+----------------------------------------------+-----------+----------------------------+-------------------------------------------------------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/analytics/enrollment | instructor_analytics, enrollments | Missing | N/A | Retrieve enrollment statistics over time (trends, demographics) | ++--------+--------------------------------------------------------------------------+----------------------------------------------+-----------+----------------------------+-------------------------------------------------------------------------------------------+ From a4bdef079e44bda0ab7d6e819dc6b957ec7067aa Mon Sep 17 00:00:00 2001 From: Jesse Stewart Date: Mon, 6 Oct 2025 16:49:45 -0400 Subject: [PATCH 09/13] docs: add username to delete beta_testers endpoint --- .../0003-instructor-dashboard-rest-api-architecture.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/decisions/0003-instructor-dashboard-rest-api-architecture.rst b/docs/decisions/0003-instructor-dashboard-rest-api-architecture.rst index 334ecc9f..8760fd5a 100644 --- a/docs/decisions/0003-instructor-dashboard-rest-api-architecture.rst +++ b/docs/decisions/0003-instructor-dashboard-rest-api-architecture.rst @@ -67,7 +67,7 @@ The ``GET /enrollments`` endpoint may return large datasets (thousands to hundre +--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+----------------------------------------------------------------------------------------------+ | POST | /api/instructor/v1/courses/{course_key}/beta_testers | student.auth | Partial | /courses/{course_id}/instructor/api/bulk_beta_modify_access | Bulk add users to beta tester role | +--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+----------------------------------------------------------------------------------------------+ -| DELETE | /api/instructor/v1/courses/{course_key}/beta_testers | student.auth | Missing | N/A | Bulk remove users from beta tester role | +| DELETE | /api/instructor/v1/courses/{course_key}/beta_testers/{username} | student.auth | Missing | N/A | Remove a user from beta tester role | +--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+----------------------------------------------------------------------------------------------+ | GET | /api/instructor/v1/courses/{course_key}/forum/members | discussion, student.auth | Partial | /courses/{course_id}/instructor/api/list_forum_members | List users with forum moderation roles | +--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+----------------------------------------------------------------------------------------------+ From ca1296293f6161cb95948533cdc14818118221cc Mon Sep 17 00:00:00 2001 From: Jesse Stewart Date: Wed, 8 Oct 2025 10:07:51 -0400 Subject: [PATCH 10/13] docs: address pr feedback --- ...nstructor-dashboard-rest-api-architecture.rst | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/docs/decisions/0003-instructor-dashboard-rest-api-architecture.rst b/docs/decisions/0003-instructor-dashboard-rest-api-architecture.rst index 8760fd5a..26ab6849 100644 --- a/docs/decisions/0003-instructor-dashboard-rest-api-architecture.rst +++ b/docs/decisions/0003-instructor-dashboard-rest-api-architecture.rst @@ -57,26 +57,16 @@ The ``GET /enrollments`` endpoint may return large datasets (thousands to hundre +--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+----------------------------------------------------------------------------------------------+ | POST | /api/instructor/v1/courses/{course_key}/enrollments/csv_upload | bulk_enroll, util | Missing | N/A | Upload CSV file to bulk enroll/unenroll students | +--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+----------------------------------------------------------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/roles/ | student.auth | Missing | N/A | List all users with assigned roles in the course (supports filtering by role_type) | ++--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+----------------------------------------------------------------------------------------------+ | GET | /api/instructor/v1/courses/{course_key}/roles/{role_type}/members | student.auth | Partial | /courses/{course_id}/instructor/api/list_course_role_members | List users with a specific course role (staff, instructor, beta_tester, etc.) | +--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+----------------------------------------------------------------------------------------------+ | POST | /api/instructor/v1/courses/{course_key}/roles/{username} | student.auth | Partial | /courses/{course_id}/instructor/api/modify_access | Grant a course role to a user (role specified in request body) | +--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+----------------------------------------------------------------------------------------------+ | DELETE | /api/instructor/v1/courses/{course_key}/roles/{username} | student.auth | Missing | N/A | Revoke a course role from a user (role specified in request body) | +--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+----------------------------------------------------------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/beta_testers | student.auth | Missing | N/A | List all beta testers for the course | -+--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+----------------------------------------------------------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/beta_testers | student.auth | Partial | /courses/{course_id}/instructor/api/bulk_beta_modify_access | Bulk add users to beta tester role | -+--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+----------------------------------------------------------------------------------------------+ -| DELETE | /api/instructor/v1/courses/{course_key}/beta_testers/{username} | student.auth | Missing | N/A | Remove a user from beta tester role | -+--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+----------------------------------------------------------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/forum/members | discussion, student.auth | Partial | /courses/{course_id}/instructor/api/list_forum_members | List users with forum moderation roles | -+--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+----------------------------------------------------------------------------------------------+ -| POST | /api/instructor/v1/courses/{course_key}/forum/members | discussion, student.auth | Partial | /courses/{course_id}/instructor/api/update_forum_role_membership | Grant forum moderation role to users | -+--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+----------------------------------------------------------------------------------------------+ -| DELETE | /api/instructor/v1/courses/{course_key}/forum/members | discussion, student.auth | Missing | N/A | Revoke forum moderation role from users | -+--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+----------------------------------------------------------------------------------------------+ -Student Administration API +Learner Administration API ^^^^^^^^^^^^^^^^^^^^^^^^^^ The ``GET /students/{username}`` endpoint will include ``enrollment_status`` and ``progress_url`` fields in the response. Separate endpoints for these single attributes are not needed. From 445d915868d9f85c0207afb42658cb9ccd4824fb Mon Sep 17 00:00:00 2001 From: Jesse Stewart Date: Wed, 8 Oct 2025 10:22:56 -0400 Subject: [PATCH 11/13] docs: ratain forum/members endpoints --- .../0003-instructor-dashboard-rest-api-architecture.rst | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/docs/decisions/0003-instructor-dashboard-rest-api-architecture.rst b/docs/decisions/0003-instructor-dashboard-rest-api-architecture.rst index 26ab6849..09bdb50e 100644 --- a/docs/decisions/0003-instructor-dashboard-rest-api-architecture.rst +++ b/docs/decisions/0003-instructor-dashboard-rest-api-architecture.rst @@ -59,12 +59,16 @@ The ``GET /enrollments`` endpoint may return large datasets (thousands to hundre +--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+----------------------------------------------------------------------------------------------+ | GET | /api/instructor/v1/courses/{course_key}/roles/ | student.auth | Missing | N/A | List all users with assigned roles in the course (supports filtering by role_type) | +--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+----------------------------------------------------------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/roles/{role_type}/members | student.auth | Partial | /courses/{course_id}/instructor/api/list_course_role_members | List users with a specific course role (staff, instructor, beta_tester, etc.) | -+--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+----------------------------------------------------------------------------------------------+ | POST | /api/instructor/v1/courses/{course_key}/roles/{username} | student.auth | Partial | /courses/{course_id}/instructor/api/modify_access | Grant a course role to a user (role specified in request body) | +--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+----------------------------------------------------------------------------------------------+ | DELETE | /api/instructor/v1/courses/{course_key}/roles/{username} | student.auth | Missing | N/A | Revoke a course role from a user (role specified in request body) | +--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+----------------------------------------------------------------------------------------------+ +| GET | /api/instructor/v1/courses/{course_key}/forum/members | discussion, student.auth | Partial | /courses/{course_id}/instructor/api/list_forum_members | List users with forum moderation roles | ++--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+----------------------------------------------------------------------------------------------+ +| POST | /api/instructor/v1/courses/{course_key}/forum/members | discussion, student.auth | Partial | /courses/{course_id}/instructor/api/update_forum_role_membership | Grant forum moderation role to users | ++--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+----------------------------------------------------------------------------------------------+ +| DELETE | /api/instructor/v1/courses/{course_key}/forum/members | discussion, student.auth | Missing | N/A | Revoke forum moderation role from users | ++--------+--------------------------------------------------------------------+--------------------------------+-----------+-------------------------------------------------------------------+----------------------------------------------------------------------------------------------+ Learner Administration API ^^^^^^^^^^^^^^^^^^^^^^^^^^ From 671d1d37f5bdff0ccd0b6294a80778233e2d4de5 Mon Sep 17 00:00:00 2001 From: Jesse Stewart Date: Thu, 13 Nov 2025 15:02:27 -0500 Subject: [PATCH 12/13] feat: update schema --- .../0003-instructor-dashboard-rest-api-architecture.rst | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/docs/decisions/0003-instructor-dashboard-rest-api-architecture.rst b/docs/decisions/0003-instructor-dashboard-rest-api-architecture.rst index 09bdb50e..387e417a 100644 --- a/docs/decisions/0003-instructor-dashboard-rest-api-architecture.rst +++ b/docs/decisions/0003-instructor-dashboard-rest-api-architecture.rst @@ -28,15 +28,13 @@ While ``/api/courses/v1/`` provides learner-facing course information, these ins +--------+---------------------------------------------------------------+---------------------------------------------+-----------+---------------------------------------------+-------------------------------------------------------------------------+ | Method | Endpoint | Services | Status | Existing API Path | Description | +========+===============================================================+=============================================+===========+=============================================+=========================================================================+ -| GET | /api/instructor/v1/courses/{course_key} | instructor, xmodule.modulestore | Missing | N/A | Retrieve course metadata including enrollment counts and settings | -+--------+---------------------------------------------------------------+---------------------------------------------+-----------+---------------------------------------------+-------------------------------------------------------------------------+ -| PATCH | /api/instructor/v1/courses/{course_key} | instructor, xmodule.modulestore | Missing | N/A | Update course settings (partial update) | +| GET | /api/instructor/v1/courses/{course_key} | instructor, xmodule.modulestore | Missing | N/A | Retrieve course metadata, enrollment counts, permissions, and nav config | +--------+---------------------------------------------------------------+---------------------------------------------+-----------+---------------------------------------------+-------------------------------------------------------------------------+ | GET | /api/instructor/v1/courses/{course_key}/instructor_tasks | instructor_task | Partial | /api/instructor/v1/tasks/{course_id} | List background tasks for the course | +--------+---------------------------------------------------------------+---------------------------------------------+-----------+---------------------------------------------+-------------------------------------------------------------------------+ -| GET | /api/instructor/v1/courses/{course_key}/modes | course_modes | Missing | N/A | Retrieve enrollment modes and pricing for the course | +| GET | /api/instructor/v1/courses/{course_key}/modes | course_modes | On Hold | N/A | Retrieve enrollment modes and pricing for the course | +--------+---------------------------------------------------------------+---------------------------------------------+-----------+---------------------------------------------+-------------------------------------------------------------------------+ -| PATCH | /api/instructor/v1/courses/{course_key}/modes/{mode_id}/price | course_modes | Missing | N/A | Update pricing for a specific enrollment mode | +| PATCH | /api/instructor/v1/courses/{course_key}/modes/{mode_id}/price | course_modes | On Hold | N/A | Update pricing for a specific enrollment mode | +--------+---------------------------------------------------------------+---------------------------------------------+-----------+---------------------------------------------+-------------------------------------------------------------------------+ Membership Management API From 555dd321ffddc9e1a5340a2f26a42e8a7d2f3af1 Mon Sep 17 00:00:00 2001 From: Jesse Stewart Date: Fri, 14 Nov 2025 16:18:51 -0500 Subject: [PATCH 13/13] docs: add graded_subsections endpoin --- ...ructor-dashboard-rest-api-architecture.rst | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/docs/decisions/0003-instructor-dashboard-rest-api-architecture.rst b/docs/decisions/0003-instructor-dashboard-rest-api-architecture.rst index 387e417a..87522288 100644 --- a/docs/decisions/0003-instructor-dashboard-rest-api-architecture.rst +++ b/docs/decisions/0003-instructor-dashboard-rest-api-architecture.rst @@ -114,6 +114,8 @@ These endpoints manage instructor-granted due date extensions (per-student deadl +--------+-----------------------------------------------------------------------------------+----------------------------------+-----------+-------------------------------------------------------------------+-----------------------------------------------------------------------------------------+ | Method | Endpoint | Services | Status | Existing API Path | Description | +========+===================================================================================+==================================+===========+===================================================================+=========================================================================================+ +| GET | /api/instructor/v1/courses/{course_key}/graded_subsections | xmodule.modulestore, util | Missing | N/A | List all graded subsections/units with due dates (required for extension UI dropdowns) | ++--------+-----------------------------------------------------------------------------------+----------------------------------+-----------+-------------------------------------------------------------------+-----------------------------------------------------------------------------------------+ | GET | /api/instructor/v1/courses/{course_key}/extensions | util.date_utils | Missing | N/A | List all due date extensions for a unit (requires unit usage_key in query params) | +--------+-----------------------------------------------------------------------------------+----------------------------------+-----------+-------------------------------------------------------------------+-----------------------------------------------------------------------------------------+ | POST | /api/instructor/v1/courses/{course_key}/extensions | util.date_utils | Partial | /courses/{course_id}/instructor/api/change_due_date | Grant a due date extension to a student for a specific unit | @@ -125,6 +127,23 @@ These endpoints manage instructor-granted due date extensions (per-student deadl | GET | /api/instructor/v1/courses/{course_key}/extensions/{username} | util.date_utils, student | Exists | /courses/{course_id}/instructor/api/show_student_extensions | List all due date extensions granted to a specific student | +--------+-----------------------------------------------------------------------------------+----------------------------------+-----------+-------------------------------------------------------------------+-----------------------------------------------------------------------------------------+ +**GET /api/instructor/v1/courses/{course_key}/graded_subsections** + +Returns an array of graded subsections/units with due dates, used to populate dropdown selectors in the Extensions UI. + +Response format:: + + [ + { + "graded_subsection": "Homework 1", + "block_id": "block-v1:edX+DemoX+Demo_Course+type@sequential+block@19a30717eff543078a5d94ae9d6c18a5" + }, + { + "graded_subsection": "Midterm Exam", + "block_id": "block-v1:edX+DemoX+Demo_Course+type@sequential+block@07bc32474380492cb34f76e5f9d9a135" + } + ] + Data Export API ^^^^^^^^^^^^^^^