forked from instructure/canvas-lms
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathOutcomeSummaryCollection.coffee
More file actions
88 lines (77 loc) · 3.16 KB
/
Copy pathOutcomeSummaryCollection.coffee
File metadata and controls
88 lines (77 loc) · 3.16 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
define [
'jquery'
'underscore'
'Backbone'
'compiled/models/grade_summary/Section'
'compiled/models/grade_summary/Group'
'compiled/models/grade_summary/Outcome'
'compiled/collections/PaginatedCollection'
'compiled/collections/WrappedCollection'
'compiled/util/natcompare'
], ($, _, {Collection}, Section, Group, Outcome, PaginatedCollection, WrappedCollection, natcompare) ->
class GroupCollection extends PaginatedCollection
@optionProperty 'course_id'
model: Group
url: -> "/api/v1/courses/#{@course_id}/outcome_groups"
class LinkCollection extends PaginatedCollection
@optionProperty 'course_id'
url: -> "/api/v1/courses/#{@course_id}/outcome_group_links?outcome_style=full"
class RollupCollection extends WrappedCollection
@optionProperty 'course_id'
@optionProperty 'user_id'
key: 'rollups'
url: -> "/api/v1/courses/#{@course_id}/outcome_rollups?user_ids[]=#{@user_id}"
class OutcomeSummaryCollection extends Collection
@optionProperty 'course_id'
@optionProperty 'user_id'
comparator: natcompare.byGet('path')
initialize: ->
super
@rawCollections =
groups: new GroupCollection([], course_id: @course_id)
links: new LinkCollection([], course_id: @course_id)
rollups: new RollupCollection([], course_id: @course_id, user_id: @user_id)
@outcomeCache = new Collection()
fetch: ->
dfd = $.Deferred()
requests = _.values(@rawCollections).map (collection) -> collection.loadAll = true; collection.fetch()
$.when.apply($, requests).done(=> @processCollections(dfd))
dfd
rollups: ->
studentRollups = @rawCollections.rollups.at(0).get('scores')
pairs = studentRollups.map((x) -> [x.links.outcome, x])
_.object(pairs)
populateGroupOutcomes: ->
rollups = @rollups()
@outcomeCache.reset()
@rawCollections.links.each (link) =>
outcome = new Outcome(link.get('outcome'))
parent = @rawCollections.groups.get(link.get('outcome_group').id)
rollup = rollups[outcome.id]
outcome.set('score', rollup?.score)
outcome.set('result_title', rollup?.title)
outcome.set('submission_time', rollup?.submitted_at)
outcome.set('count', rollup?.count || 0)
outcome.group = parent
parent.get('outcomes').add(outcome)
@outcomeCache.add(outcome)
populateSectionGroups: ->
tmp = new Collection()
@rawCollections.groups.each (group) =>
return unless group.get('outcomes').length
parentObj = group.get('parent_outcome_group')
parentId = if parentObj then parentObj.id else group.id
unless parent = tmp.get(parentId)
parent = tmp.add(new Section(id: parentId, path: @getPath(parentId)))
parent.get('groups').add(group)
@reset(tmp.models)
processCollections: (dfd) =>
@populateGroupOutcomes()
@populateSectionGroups()
dfd.resolve(@models)
getPath: (id) ->
group = @rawCollections.groups.get(id)
parent = group.get('parent_outcome_group')
return '' unless parent
parentPath = @getPath(parent.id)
(if parentPath then parentPath + ': ' else '') + group.get('title')