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'