diff --git a/services/headless-lms/models/.sqlx/query-a54dccecd05081f97834f4f8654132d47eeff79664ba79fee7ebbb5ad4368cbf.json b/services/headless-lms/models/.sqlx/query-e89cb78556548e61e2993ea961fb6db4ca7c7e96af9fb7b2e4537fc0e6325ef4.json similarity index 68% rename from services/headless-lms/models/.sqlx/query-a54dccecd05081f97834f4f8654132d47eeff79664ba79fee7ebbb5ad4368cbf.json rename to services/headless-lms/models/.sqlx/query-e89cb78556548e61e2993ea961fb6db4ca7c7e96af9fb7b2e4537fc0e6325ef4.json index e3452b8d3428..4987c7d7c1a4 100644 --- a/services/headless-lms/models/.sqlx/query-a54dccecd05081f97834f4f8654132d47eeff79664ba79fee7ebbb5ad4368cbf.json +++ b/services/headless-lms/models/.sqlx/query-e89cb78556548e61e2993ea961fb6db4ca7c7e96af9fb7b2e4537fc0e6325ef4.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\nSELECT completions.completion_registration_attempt_date,\n completions.course_module_id,\n completions.created_at,\n completions.grade,\n completions.passed,\n completions.prerequisite_modules_completed,\n (registered.id IS NOT NULL) AS \"registered!\",\n completions.user_id\nFROM course_module_completions completions\n LEFT JOIN course_module_completion_registered_to_study_registries registered ON (\n completions.id = registered.course_module_completion_id\n )\nWHERE completions.course_instance_id = $1\n AND completions.deleted_at IS NULL\n AND registered.deleted_at IS NULL\n ", + "query": "\nSELECT completions.completion_registration_attempt_date,\n completions.course_module_id,\n completions.created_at,\n completions.grade,\n completions.passed,\n completions.prerequisite_modules_completed,\n (registered.id IS NOT NULL) AS \"registered!\",\n completions.user_id,\n completions.completion_date\nFROM course_module_completions completions\n LEFT JOIN course_module_completion_registered_to_study_registries registered ON (\n completions.id = registered.course_module_completion_id\n )\nWHERE completions.course_instance_id = $1\n AND completions.deleted_at IS NULL\n AND registered.deleted_at IS NULL\n ", "describe": { "columns": [ { @@ -42,12 +42,17 @@ "ordinal": 7, "name": "user_id", "type_info": "Uuid" + }, + { + "ordinal": 8, + "name": "completion_date", + "type_info": "Timestamptz" } ], "parameters": { "Left": ["Uuid"] }, - "nullable": [true, false, false, true, false, false, null, false] + "nullable": [true, false, false, true, false, false, null, false, false] }, - "hash": "a54dccecd05081f97834f4f8654132d47eeff79664ba79fee7ebbb5ad4368cbf" + "hash": "e89cb78556548e61e2993ea961fb6db4ca7c7e96af9fb7b2e4537fc0e6325ef4" } diff --git a/services/headless-lms/models/src/course_module_completions.rs b/services/headless-lms/models/src/course_module_completions.rs index 0222634a0081..5055e858de7b 100644 --- a/services/headless-lms/models/src/course_module_completions.rs +++ b/services/headless-lms/models/src/course_module_completions.rs @@ -201,6 +201,8 @@ pub struct CourseModuleCompletionWithRegistrationInfo { pub registered: bool, /// ID of the user for the completion. pub user_id: Uuid, + // When the user completed the course + pub completion_date: DateTime, } /// Gets summaries for all completions on the given course instance. @@ -218,7 +220,8 @@ SELECT completions.completion_registration_attempt_date, completions.passed, completions.prerequisite_modules_completed, (registered.id IS NOT NULL) AS "registered!", - completions.user_id + completions.user_id, + completions.completion_date FROM course_module_completions completions LEFT JOIN course_module_completion_registered_to_study_registries registered ON ( completions.id = registered.course_module_completion_id diff --git a/services/headless-lms/server/src/domain/csv_export/course_instance_export.rs b/services/headless-lms/server/src/domain/csv_export/course_instance_export.rs index 8ba60fe1771c..c344fe94ff85 100644 --- a/services/headless-lms/server/src/domain/csv_export/course_instance_export.rs +++ b/services/headless-lms/server/src/domain/csv_export/course_instance_export.rs @@ -73,6 +73,7 @@ where let module_name = module.name.as_deref().unwrap_or("default_module"); headers.push(format!("{module_name}_grade")); headers.push(format!("{module_name}_registered")); + headers.push(format!("{module_name}_completion_date")); } // write rows @@ -100,6 +101,11 @@ where .map(|cm| cm.registered.to_string()) .unwrap_or_default(); csv_row.push(registered); + csv_row.push( + user_completion + .map(|uc| uc.completion_date.to_string()) + .unwrap_or_default(), + ) } // To avoid confusion with some people potentially not understanding that '-' means not completed, // we'll skip the users that don't have any completions from any modules. The confusion is less likely in cases where there are more than one module, and only in those cases the teachers would see the '-' entries in this file.