Commit 2d5ebeb
committed
feat(gradebook): import external assessment grades from CSV
Introduce the full external-assessment CSV import feature as a single
slice on top of grade validation (pr3).
Backend:
- Course::Gradebook::ExternalAssessmentImportService — header-order
tolerance, duplicate-header/identifier guards, reassigned-identifier
detection, out-of-range flagging, and batched (bulk insert + upsert)
grade writes.
- external_assessment_imports controller (preview + create/commit),
create/preview jbuilders, and import routes.
Frontend:
- ImportExternalAssessmentsWizard (upload → define → verify), with the
ExternalGradeConflict prompt/table change-matrix and buildTemplate.
- previewImport/commitImport operations + import API endpoints + types.
- ManageExternalAssessmentsPanel gains the Import CSV entry point.
Consolidates the previously planned pr4a (correctness) and pr4b (ux)
into one PR: the import wizard and service are edited by both themes at
the hunk level, so they do not separate into independently-reviewable
slices.
Fixes a pre-existing broken assertion in the import controller spec
(course_externalassessments -> course_external_assessments) that
prevented the replace-on-conflict test from running.1 parent 38c0e8e commit 2d5ebeb
23 files changed
Lines changed: 5503 additions & 416 deletions
File tree
- app
- controllers/course
- services/course/gradebook
- views/course/external_assessment_imports
- client
- app
- api/course
- bundles/course/gradebook
- __tests__
- components
- import
- __tests__
- manage
- types/course
- locales
- config
- spec
- controllers/course
- services/course/gradebook
Lines changed: 53 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
0 commit comments