({ classroom, sortedCourses, students, courses, courseInstances, levels, progressData })
| 6 | |
| 7 | module.exports = { |
| 8 | exportStudentProgress ({ classroom, sortedCourses, students, courses, courseInstances, levels, progressData }) { |
| 9 | // TODO: Does not yield .csv download on Safari, and instead opens a new tab with the .csv contents |
| 10 | let course, index, trimCourse, trimLevel |
| 11 | let c |
| 12 | if (window.tracker != null) { |
| 13 | window.tracker.trackEvent('Teachers Class Export CSV', { category: 'Teachers', classroomID: classroom.id }) |
| 14 | } |
| 15 | let courseLabels = '' |
| 16 | const courseIds = ((() => { |
| 17 | const result = [] |
| 18 | for (c of Array.from(sortedCourses)) { |
| 19 | result.push(courses.get(c._id)) |
| 20 | } |
| 21 | return result |
| 22 | })()) |
| 23 | const courseLabelsArray = helper.courseLabelsArray(courseIds) |
| 24 | for (index = 0; index < courseIds.length; index++) { |
| 25 | course = courseIds[index] |
| 26 | courseLabels += `${courseLabelsArray[index]} Levels,${courseLabelsArray[index]} Playtime(humanize),${courseLabelsArray[index]} Playtime(seconds),` |
| 27 | } |
| 28 | let csvContent = `Name,Username,Email,Total Levels,Total Playtime(humanize), Total Playtime(seconds),${courseLabels}Concepts\n` |
| 29 | const levelCourseIdMap = {} |
| 30 | const levelPracticeMap = {} |
| 31 | const language = classroom.get('aceConfig')?.language |
| 32 | for (trimCourse of Array.from(classroom.getSortedCourses())) { |
| 33 | for (trimLevel of Array.from(trimCourse.levels)) { |
| 34 | if (language && (trimLevel.primerLanguage === language)) { continue } |
| 35 | if (trimLevel.practice) { |
| 36 | levelPracticeMap[trimLevel.original] = true |
| 37 | continue |
| 38 | } |
| 39 | levelCourseIdMap[trimLevel.original] = trimCourse._id |
| 40 | } |
| 41 | } |
| 42 | for (const student of Array.from(students.models)) { |
| 43 | let courseID, level |
| 44 | let concepts = [] |
| 45 | for (trimCourse of Array.from(classroom.getSortedCourses())) { |
| 46 | course = courses.get(trimCourse._id) |
| 47 | const instance = courseInstances.findWhere({ courseID: course.id, classroomID: classroom.id }) |
| 48 | if (instance && instance.hasMember(student)) { |
| 49 | for (trimLevel of Array.from(trimCourse.levels)) { |
| 50 | level = levels.findWhere({ original: trimLevel.original }) |
| 51 | if (level.get('assessment')) { continue } |
| 52 | const progress = progressData.get({ classroom, course, level, user: student }) |
| 53 | if (progress != null ? progress.completed : undefined) { |
| 54 | let left |
| 55 | concepts.push((left = level.get('concepts')) != null ? left : []) |
| 56 | } |
| 57 | } |
| 58 | } |
| 59 | } |
| 60 | concepts = _.union(_.flatten(concepts)) |
| 61 | const conceptsString = _.map(concepts, c => $.i18n.t('concepts.' + c)).join(', ') |
| 62 | const courseCountsMap = {} |
| 63 | let levelsCount = 0 |
| 64 | let playtime = 0 |
| 65 | for (const session of Array.from(classroom.sessions.models)) { |
nothing calls this directly
no test coverage detected