-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDashboardService.js
More file actions
102 lines (86 loc) · 3.96 KB
/
Copy pathDashboardService.js
File metadata and controls
102 lines (86 loc) · 3.96 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
function getDashboardData(studentId, fromDateStr, untilDateStr) {
assertAppAccess_();
var searchId = String(studentId).trim();
if (searchId.length === 8) searchId = "0" + searchId;
var perf = createPerfTracker("getDashboardData " + searchId);
try {
var context = getStudentTermContextCached(searchId);
var user = context.user;
var currentTerm = context.currentTerm;
var termStartDate = new Date(currentTerm.start_at);
perf.mark("resolved student/term context");
// Interval dates — defaults: 7 days ago -> today
var today = new Date();
var intervalStart = fromDateStr ? new Date(fromDateStr + "T00:00:00") : new Date(today.getTime() - 7 * 24 * 60 * 60 * 1000);
var intervalEnd = untilDateStr ? new Date(untilDateStr + "T23:59:59") : today;
var assignmentAnalysisEnd = getAssignmentAnalysisEnd_(currentTerm, intervalEnd);
// Get ALL enrollments
var enrollments = context.enrollments;
// Detect GS coaching course for gradebook link
var gsInfo = detectGSCoachingCourse(enrollments);
var activeCourseIds = [];
for (var e = 0; e < enrollments.length; e++) {
if (gsInfo && enrollments[e].course_id == gsInfo.courseId) continue;
activeCourseIds.push(enrollments[e].course_id);
}
perf.mark("prepared date range + enrollments (" + activeCourseIds.length + " courses)");
var allCourseData = fetchAllCoursesAssignments(activeCourseIds, user.id);
annotateCanvasMissingAssignments_(allCourseData, fetchCanvasMissingAssignments_(user.id, activeCourseIds));
perf.mark("fetched all courses assignments in parallel");
var payload = {
studentName: user.name,
canvasUserId: user.id,
gsCoachingCourse: gsInfo,
courses: []
};
for (var e = 0; e < enrollments.length; e++) {
var enrollment = enrollments[e];
var courseStart = new Date().getTime();
if (gsInfo && enrollment.course_id == gsInfo.courseId) continue;
var fullCourseName = getCourseNameById(enrollment.course_id, enrollment);
var assignments = filterAssignmentsForAnalysis_(
allCourseData[String(enrollment.course_id)] || [],
termStartDate,
assignmentAnalysisEnd,
enrollment.course_section_id
);
var metrics = calculateAssignmentMetrics(assignments, termStartDate, intervalStart, intervalEnd, enrollment.course_section_id);
var gradeParts = formatEnrollmentGradeParts(enrollment);
if (gradeParts.score === null && !(assignments && assignments.fetchIncomplete)) {
var gradeAssignments = filterAssignmentsForAnalysis_(
allCourseData[String(enrollment.course_id)] || [],
termStartDate,
intervalEnd,
enrollment.course_section_id
);
gradeParts = estimateGradePartsFromAssignments(gradeAssignments);
}
payload.courses.push({
name: fullCourseName,
courseId: enrollment.course_id,
grade: gradeParts.displayText,
gradeScore: gradeParts.score,
gradeStatus: getGradeColor(gradeParts.score),
gradeEstimated: gradeParts.estimated === true,
missing: metrics.missingCount,
missingList: metrics.missingList,
late: metrics.lateCount,
lateList: metrics.lateList,
onTimeCount: metrics.onTimeCount,
onTimeList: metrics.onTimeList,
upcoming: metrics.upcomingCount,
upcomingList: metrics.upcomingList,
intervalTotal: metrics.intervalTotal,
onTime: metrics.onTimeCount + "/" + metrics.intervalTotal
});
Logger.log("[Perf][getDashboardData " + searchId + "] course " + String(enrollment.course_id) + " metrics +" + ((new Date().getTime() - courseStart) / 1000).toFixed(3) + "s");
}
perf.end("completed");
return payload;
} catch (e) {
perf.end("failed: " + e.message);
return { error: e.message };
}
}
// =========================================================================
// Grade History — reads daily snapshots from Drive JSON, groups + deltas