MCPcopy Create free account
hub / github.com/codecombat/codecombat / exportStudentProgress

Function exportStudentProgress

app/lib/studentProgressCalculator.js:8–110  ·  view source on GitHub ↗
({ classroom, sortedCourses, students, courses, courseInstances, levels, progressData })

Source from the content-addressed store, hash-verified

6
7module.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)) {

Callers

nothing calls this directly

Calls 6

getSortedCoursesMethod · 0.80
hasMemberMethod · 0.80
unionMethod · 0.80
broadNameMethod · 0.80
trackEventMethod · 0.45
getMethod · 0.45

Tested by

no test coverage detected