2015-11-03 16:41:06 -08:00
CocoModel = require ' ./CocoModel '
schema = require ' schemas/models/classroom.schema '
2016-03-30 13:57:19 -07:00
utils = require ' core/utils '
2016-05-11 14:39:26 -07:00
User = require ' models/User '
2015-11-03 16:41:06 -08:00
module.exports = class Classroom extends CocoModel
@className: ' Classroom '
@schema: schema
urlRoot: ' /db/classroom '
2016-03-30 13:57:19 -07:00
initialize: () ->
@ listenTo @ , ' change:aceConfig ' , @ capitalizeLanguageName
super ( arguments . . . )
2016-05-11 14:39:26 -07:00
parse: (obj) ->
if obj . _id
# It's just the classroom object
return obj
else
# It's a compound response with other stuff too
@owner = new User ( obj . owner )
return obj . data
2016-03-30 13:57:19 -07:00
capitalizeLanguageName: ->
language = @ get ( ' aceConfig ' ) ? . language
@capitalLanguage = utils . capitalLanguages [ language ]
2015-11-23 08:46:08 -08:00
joinWithCode: (code, opts) ->
options = {
2016-05-11 14:39:26 -07:00
url: @ urlRoot + ' /~/members '
2015-11-23 08:46:08 -08:00
type: ' POST '
data: { code: code }
2016-05-11 14:39:26 -07:00
success: => @ trigger ' join:success '
error: => @ trigger ' join:error '
}
_ . extend options , opts
@ fetch ( options )
fetchByCode: (code, opts) ->
options = {
url: _ . result ( @ , ' url ' )
data: { code: code , " with-owner " : true }
2015-11-23 08:46:08 -08:00
}
_ . extend options , opts
2015-12-02 11:56:38 -08:00
@ fetch ( options )
removeMember: (userID, opts) ->
options = {
url: _ . result ( @ , ' url ' ) + ' /members '
type: ' DELETE '
data: { userID: userID }
}
_ . extend options , opts
2016-03-30 13:57:19 -07:00
@ fetch ( options )
2016-05-20 14:52:04 -07:00
setStudentPassword: (student, password, options) ->
classroomID = @ . id
$ . ajax {
url: " /db/classroom/ #{ classroomID } /members/ #{ student . id } /reset-password "
method: ' POST '
data: { password }
success: => @ trigger ' save-password:success '
error: (response) => @ trigger ' save-password:error ' , response . responseJSON
}
2016-04-13 09:54:24 -07:00
getLevels: (options={}) ->
# options: courseID, withoutLadderLevels
Levels = require ' collections/Levels '
courses = @ get ( ' courses ' )
return new Levels ( ) unless courses
levelObjects = [ ]
for course in courses
if options . courseID and options . courseID isnt course . _id
continue
levelObjects . push ( course . levels )
levels = new Levels ( _ . flatten ( levelObjects ) )
if options . withoutLadderLevels
levels . remove ( levels . filter ( (level) -> level . isLadder ( ) ) )
return levels
getLadderLevel: (courseID) ->
Levels = require ' collections/Levels '
courses = @ get ( ' courses ' )
course = _ . findWhere ( courses , { _id: courseID } )
return unless course
levels = new Levels ( course . levels )
return levels . find (l) -> l . isLadder ( )
statsForSessions: (sessions, courseID) ->
return null unless sessions
stats = { }
sessions = sessions . models or sessions
arena = @ getLadderLevel ( courseID )
levels = @ getLevels ( { courseID: courseID , withoutLadderLevels: true } )
levelOriginals = levels . pluck ( ' original ' )
2016-04-28 15:55:02 -07:00
completeSessionOriginals = ( session . get ( ' level ' ) . original for session in sessions when session . get ( ' state ' ) . complete )
incompleteSessionOriginals = ( session . get ( ' level ' ) . original for session in sessions when not session . get ( ' state ' ) . complete )
levelsLeft = _ . size ( _ . difference ( levelOriginals , completeSessionOriginals ) )
next = _ . find levels . models , (level) -> level . get ( ' original ' ) not in completeSessionOriginals
lastPlayed = _ . find levels . models , (level) -> level . get ( ' original ' ) in incompleteSessionOriginals
2016-04-13 09:54:24 -07:00
stats.levels = {
size: levels . size ( )
left: levelsLeft
done: levelsLeft is 0
numDone: levels . size ( ) - levelsLeft
pctDone: ( 100 * ( levels . size ( ) - levelsLeft ) / levels . size ( ) ) . toFixed ( 1 ) + ' % '
2016-04-28 15:55:02 -07:00
lastPlayed: lastPlayed
next: next
2016-04-13 09:54:24 -07:00
first: levels . first ( )
arena: arena
}
sum = (nums) -> _ . reduce ( nums , (s, num) -> s + num ) or 0
stats.playtime = sum ( ( session . get ( ' playtime ' ) or 0 for session in sessions ) )
return stats
fetchForCourseInstance: (courseInstanceID, options={}) ->
2016-04-27 15:36:16 -07:00
return unless courseInstanceID
2016-04-13 09:54:24 -07:00
CourseInstance = require ' models/CourseInstance '
courseInstance = if _ . isString ( courseInstanceID ) then new CourseInstance ( { _id : courseInstanceID } ) else courseInstanceID
options = _ . extend ( options , {
url: _ . result ( courseInstance , ' url ' ) + ' /classroom '
} )
2016-04-27 15:36:16 -07:00
@ fetch ( options )