From dc6a1de9fabf8e3d4679e848a37a8a66b7f203c0 Mon Sep 17 00:00:00 2001 From: Nick Winter <livelily@gmail.com> Date: Sat, 16 Jul 2016 00:31:53 -0700 Subject: [PATCH] Ordering/labeling courses: CS1, CS2, GD1, WD1, CS3, etc --- app/templates/admin.jade | 2 +- app/templates/courses/teacher-class-view.jade | 5 +++- app/views/admin/MainAdminView.coffee | 22 ++++++++++++++- app/views/courses/TeacherClassView.coffee | 19 +++++++++++-- server/models/Course.coffee | 28 +++++++++++++++++++ 5 files changed, 70 insertions(+), 6 deletions(-) diff --git a/app/templates/admin.jade b/app/templates/admin.jade index cd323fc39..77dd88127 100644 --- a/app/templates/admin.jade +++ b/app/templates/admin.jade @@ -44,7 +44,7 @@ block content a(href="/admin/classroom-levels") Classroom Levels li button.classroom-progress-csv.btn.btn-sm.btn-success Classroom Progress CSV - input.classroom-progress-class-code(type=text value="<class code>") + input.classroom-progress-class-code(type=text placeholder="<class code>") li a(href="/admin/analytics") Dashboard li diff --git a/app/templates/courses/teacher-class-view.jade b/app/templates/courses/teacher-class-view.jade index 283e8dfbe..5085fa80d 100644 --- a/app/templates/courses/teacher-class-view.jade +++ b/app/templates/courses/teacher-class-view.jade @@ -229,6 +229,8 @@ mixin studentRow(student) +longLevelName(student.latestCompleteLevel) td if state.get('progressData') + - var courses = view.classroom.get('courses').map(function(c) { return view.courses.get(c._id); }); + - var courseLabelsArray = view.courseLabelsArray(courses); each trimCourse, index in view.classroom.get('courses') - var course = view.courses.get(trimCourse._id); - var instance = view.courseInstances.findWhere({ courseID: course.id, classroomID: classroom.id }) @@ -236,7 +238,8 @@ mixin studentRow(student) - var progress = state.get('progressData').get({ classroom: view.classroom, course: course, user: student }) - var levelsTotal = trimCourse.levels.length //- - var level = ??? - +studentCourseProgressDot(progress, levelsTotal, level, 'CS' + (index+1)) + - var label = courseLabelsArray[index]; + +studentCourseProgressDot(progress, levelsTotal, level, label) unless student.isEnrolled() +enrollStudentButton(student) //- td diff --git a/app/views/admin/MainAdminView.coffee b/app/views/admin/MainAdminView.coffee index dd4b33b32..7ceeda136 100644 --- a/app/views/admin/MainAdminView.coffee +++ b/app/views/admin/MainAdminView.coffee @@ -9,6 +9,7 @@ Campaigns = require 'collections/Campaigns' Classroom = require 'models/Classroom' CocoCollection = require 'collections/CocoCollection' Course = require 'models/Course' +Courses = require 'collections/Courses' LevelSessions = require 'collections/LevelSessions' User = require 'models/User' Users = require 'collections/Users' @@ -152,6 +153,7 @@ module.exports = class MainAdminView extends RootView $('.classroom-progress-csv').prop('disabled', true) classCode = $('.classroom-progress-class-code').val() classroom = null + courses = null courseLevels = [] sessions = null users = null @@ -161,12 +163,16 @@ module.exports = class MainAdminView extends RootView classroom = new Classroom({ _id: model.data._id }) Promise.resolve(classroom.fetch()) .then (model) => + courses = new Courses() + Promise.resolve(courses.fetch()) + .then (models) => for course, index in classroom.get('courses') for level in course.levels courseLevels.push courseIndex: index + 1 levelID: level.original slug: level.slug + courseSlug: courses.get(course._id).get('slug') users = new Users() Promise.resolve($.when(users.fetchForClassroom(classroom)...)) .then (models) => @@ -202,12 +208,19 @@ module.exports = class MainAdminView extends RootView columnLabels = "Username" currentLevel = 1 + courseLabelIndexes = CS: 1, GD: 0, WD: 0 lastCourseIndex = 1 + lastCourseLabel = 'CS1' for level in courseLevels unless level.courseIndex is lastCourseIndex currentLevel = 1 lastCourseIndex = level.courseIndex - columnLabels += ",CS#{level.courseIndex}.#{currentLevel++} #{level.slug}" + acronym = switch + when /game-dev/.test(level.courseSlug) then 'GD' + when /web-dev/.test(level.courseSlug) then 'WD' + else 'CS' + lastCourseLabel = acronym + ++courseLabelIndexes[acronym] + columnLabels += ",#{lastCourseLabel}.#{currentLevel++} #{level.slug}" csvContent = "data:text/csv;charset=utf-8,#{columnLabels}\n" for studentRow in userPlaytimes csvContent += studentRow.join(',') + "\n" @@ -220,3 +233,10 @@ module.exports = class MainAdminView extends RootView $('.classroom-progress-csv').prop('disabled', false) console.error error throw error + + courseLabelsArray: (courses) -> + labels = [] + courseLabelIndexes = CS: 0, GD: 0, WD: 0 + for course in courses + labels.push acronym + ++courseLabelIndexes[acronym] + labels diff --git a/app/views/courses/TeacherClassView.coffee b/app/views/courses/TeacherClassView.coffee index 4aefcc800..059166a5c 100644 --- a/app/views/courses/TeacherClassView.coffee +++ b/app/views/courses/TeacherClassView.coffee @@ -321,9 +321,11 @@ module.exports = class TeacherClassView extends RootView window.tracker?.trackEvent 'Teachers Class Export CSV', category: 'Teachers', classroomID: @classroom.id, ['Mixpanel'] courseLabels = "" courseOrder = [] - for course, index in @classroom.get('courses') - courseLabels += "CS#{index + 1} Playtime," - courseOrder.push(course._id) + courses = (@courses.get(c._id) for c in @classroom.get('courses')) + courseLabelsArray = @courseLabelsArray courses + for course, index in courses + courseLabels += "#{courseLabelsArray[index]} Playtime," + courseOrder.push(course.id) csvContent = "data:text/csv;charset=utf-8,Username,Email,Total Playtime,#{courseLabels}Concepts\n" levelCourseMap = {} for trimCourse in @classroom.get('courses') @@ -464,3 +466,14 @@ module.exports = class TeacherClassView extends RootView when 'enrolled' then (if expires then $.i18n.t('teacher.status_enrolled') else '-') when 'expired' then $.i18n.t('teacher.status_expired') return string.replace('{{date}}', moment(expires).utc().format('l')) + + courseLabelsArray: (courses) -> + labels = [] + courseLabelIndexes = CS: 0, GD: 0, WD: 0 + for course in courses + acronym = switch + when /game-dev/.test(course.get('slug')) then 'GD' + when /web-dev/.test(course.get('slug')) then 'WD' + else 'CS' + labels.push acronym + ++courseLabelIndexes[acronym] + labels diff --git a/server/models/Course.coffee b/server/models/Course.coffee index 7ab4ec71d..cdec72b8d 100644 --- a/server/models/Course.coffee +++ b/server/models/Course.coffee @@ -13,4 +13,32 @@ CourseSchema.statics.editableProperties = [] CourseSchema.statics.jsonSchema = jsonSchema +CourseSchema.statics.sortCourses = (courses) -> + ordering = [ + 'introduction-to-computer-science' + 'computer-science-2' + 'game-dev-1' + 'web-dev-1' + 'computer-science-3' + 'game-dev-1' + 'web-dev-2' + 'computer-science-4' + 'game-dev-3' + 'web-dev-3' + 'computer-science-5' + 'game-dev-4' + 'web-dev-4' + 'computer-science-6' + 'game-dev-5' + 'web-dev-5' + 'computer-science-7' + 'game-dev-6' + 'web-dev-6' + 'computer-science-8' + ] + _.sortBy courses, (course) -> + index = ordering.indexOf(course.get?('slug') or course.slug) + index = 9001 if index is -1 + index + module.exports = Course = mongoose.model 'course', CourseSchema, 'courses'