Add programming language to options in course instances

This commit is contained in:
Scott Erickson 2015-10-30 15:56:43 -07:00
parent 0da66bd468
commit fa4355f946
8 changed files with 48 additions and 14 deletions

View file

@ -9,6 +9,8 @@ _.extend CourseInstanceSchema.properties,
name: {type: 'string'}
ownerID: c.objectId()
prepaidID: c.objectId()
aceConfig:
language: {type: 'string', 'enum': ['python', 'javascript']}
c.extendBasicProperties CourseInstanceSchema, 'CourseInstance'

View file

@ -320,13 +320,19 @@ mixin settings-dialog
span ×
h3.modal-title(data-i18n="courses.edit_settings1")
.modal-body
p
strong(data-i18n="courses.title")
p
input.settings-name-input(type='text', value="#{courseInstance.get('name') || ''}")
p
strong(data-i18n="courses.description")
p
textarea.settings-description-input(rows=2)= courseInstance.get('description')
.form
.form-group
label(data-i18n="courses.title")
input.form-control.settings-name-input(type='text', value="#{courseInstance.get('name') || ''}")
.form-group
label(data-i18n="courses.description")
textarea.form-control.settings-description-input(rows=2)= courseInstance.get('description')
.form-group
label(data-i18n="choose_hero.programming_language")
select.form-control#programming-language-select
- var aceConfig = view.courseInstance.get('aceConfig') || {};
option(value="python", selected=aceConfig.language==='python') Python
option(value="javascript", selected=aceConfig.language==='javascript') JavaScript
.modal-footer
button.btn.btn-save-settings(data-i18n="common.save_changes")

View file

@ -36,6 +36,11 @@ block content
option(value="#{course.id}")= course.get('name')
if view.courses.size() > 1
option(value="All Courses", data-i18n="courses.all_courses")
.form-group
label(data-i18n="choose_hero.programming_language")
select.form-control#programming-language-select
option(value="python", selected=view.selectedLanguage==='python') Python
option(value="javascript", selected=view.selectedLanguage==='javascript') JavaScript
if view.price > 0
h3

View file

@ -235,6 +235,9 @@ module.exports = class CourseDetailsView extends RootView
description = $('.settings-description-input').val()
console.log 'onClickSaveSettings', description
@courseInstance.set('description', description)
@courseInstance.set('aceConfig', {
language: @$('#programming-language-select').val()
})
@courseInstance.patch()
$('#settingsModal').modal('hide')

View file

@ -16,6 +16,7 @@ module.exports = class CourseEnrollView extends RootView
'change .class-name': 'onNameChange'
'change .course-select': 'onChangeCourse'
'change .input-seats': 'onSeatsChange'
'change #programming-language-select': 'onChangeProgrammingLanguageSelect'
subscriptions:
'stripe:received-token': 'onStripeReceivedToken'
@ -24,6 +25,7 @@ module.exports = class CourseEnrollView extends RootView
super options
@courseID ?= options.courseID
@seats = 20
@selectedLanguage = 'python'
@courses = new CocoCollection([], { url: "/db/course", model: Course})
@listenTo @courses, 'sync', @onCoursesLoaded
@ -77,6 +79,9 @@ module.exports = class CourseEnrollView extends RootView
onChangeCourse: (e) ->
@selectedCourse = _.find @courses.models, (a) -> a.id is $(e.target).val()
@renderNewPrice()
onChangeProgrammingLanguageSelect: (e) ->
@selectedLanguage = @$('#programming-language-select').val()
onNameChange: (e) ->
@className = $('.class-name').val()
@ -93,6 +98,8 @@ module.exports = class CourseEnrollView extends RootView
stripe:
token: token
timestamp: new Date().getTime()
aceConfig: { language: @selectedLanguage }
data.courseID = @selectedCourse.id if @selectedCourse
jqxhr = $.post('/db/course_instance/-/create', data)
jqxhr.done (data, textStatus, jqXHR) =>

View file

@ -10,6 +10,7 @@ CourseInstanceSchema.statics.editableProperties = [
'description'
'members'
'name'
'aceConfig'
]
CourseInstanceSchema.statics.jsonSchema = jsonSchema

View file

@ -50,6 +50,7 @@ CourseInstanceHandler = class CourseInstanceHandler extends Handler
courseID = req.body.courseID
# Optional
name = req.body.name
aceConfig = req.body.aceConfig or {}
# Optional - as long as course(s) are all free
stripeToken = req.body.stripe?.token
@ -66,23 +67,24 @@ CourseInstanceHandler = class CourseInstanceHandler extends Handler
return @sendDatabaseError(res, err)
courseInstances = []
makeCreateInstanceFn = (course, name, prepaid) =>
makeCreateInstanceFn = (course, name, prepaid, aceConfig) =>
(done) =>
@createInstance req, course, name, prepaid, (err, newInstance)=>
@createInstance req, course, name, prepaid, aceConfig, (err, newInstance)=>
courseInstances.push newInstance unless err
done(err)
tasks = (makeCreateInstanceFn(course, name, prepaid) for course in courses)
tasks = (makeCreateInstanceFn(course, name, prepaid, aceConfig) for course in courses)
async.parallel tasks, (err, results) =>
return @sendDatabaseError(res, err) if err
@sendCreated(res, courseInstances)
createInstance: (req, course, name, prepaid, done) =>
createInstance: (req, course, name, prepaid, aceConfig, done) =>
courseInstance = new CourseInstance
courseID: course.get('_id')
members: [req.user.get('_id')]
name: name
ownerID: req.user.get('_id')
prepaidID: prepaid.get('_id')
aceConfig: aceConfig
courseInstance.save (err, newInstance) =>
done(err, newInstance)

View file

@ -123,7 +123,15 @@ LevelHandler = class LevelHandler extends Handler
Campaign.find { _id: { $in: campaignIDs }}, (err, campaigns) =>
levelOriginals = (_.keys(c.get('levels')) for c in campaigns)
levelOriginals = _.flatten(levelOriginals)
if level.get('original').toString() in levelOriginals
originalString = level.get('original').toString()
if originalString in levelOriginals
campaignStrings = (campaign.id.toString() for campaign in campaigns when campaign.get('levels')[originalString])
courses = _.filter(courses, (course) -> course.get('campaignID').toString() in campaignStrings)
courseStrings = (course.id.toString() for course in courses)
courseInstances = _.filter(courseInstances, (courseInstance) -> courseInstance.get('courseID').toString() in courseStrings)
aceConfigs = (ci.get('aceConfig') for ci in courseInstances)
aceConfig = _.filter(aceConfigs)[0] or {}
req.codeLanguage = aceConfig.language
@createAndSaveNewSession(sessionQuery, req, res)
else
return @sendPaymentRequiredError(res, 'You must be in a course which includes this level to play it')
@ -146,7 +154,7 @@ LevelHandler = class LevelHandler extends Handler
access: 'write'
}
]
initVals.codeLanguage = req.user.get('aceConfig')?.language ? 'python'
initVals.codeLanguage = req.codeLanguage ? req.user.get('aceConfig')?.language ? 'python'
session = new Session(initVals)
session.save (err) =>