Skip to content

Commit

Permalink
Add Admin interface for setting verified_teacher flag
Browse files Browse the repository at this point in the history
  • Loading branch information
phoenixeliot committed Dec 5, 2017
1 parent 64bfc89 commit da38ebf
Show file tree
Hide file tree
Showing 5 changed files with 61 additions and 0 deletions.
4 changes: 4 additions & 0 deletions app/schemas/models/user.coffee
Expand Up @@ -51,6 +51,10 @@ visa = c.shortString
_.extend UserSchema.properties,
email: c.shortString({title: 'Email', format: 'email'})
emailVerified: { type: 'boolean' }
discourse: c.object {title: 'Discourse user information'},
id: {type: 'integer'}
username: {type: 'string'}
verified_teacher: {type: 'boolean'}
iosIdentifierForVendor: c.shortString({format: 'hidden'})
firstName: c.shortString({title: 'First Name'})
lastName: c.shortString({title: 'Last Name'})
Expand Down
20 changes: 20 additions & 0 deletions app/templates/admin/administer-user-modal.jade
Expand Up @@ -30,6 +30,26 @@ block modal-header-content
a(href="#prepaids") Existing Prepaids
div
a(href="#details") User Details

div.m-t-1
h4
| Discourse username: 
if view.userDiscourseLink()
a(href=view.userDiscourseLink())
=view.user.get('discourse') && view.user.get('discourse').username
else
| (no discourse account)
label
input#verified-teacher-checkbox(type='checkbox', checked=view.userIsVerifiedTeacher())
span.p-l-1
| APCSP Verified Teacher (has access to private forum)
div
if view.userSaveState == 'saving'
| Saving...
else if view.userSaveState == 'saved'
| Saved!
else
|  

block modal-body-content

Expand Down
31 changes: 31 additions & 0 deletions app/views/admin/AdministerUserModal.coffee
Expand Up @@ -8,6 +8,7 @@ forms = require 'core/forms'
Prepaids = require 'collections/Prepaids'
Classrooms = require 'collections/Classrooms'
TrialRequests = require 'collections/TrialRequests'
fetchJson = require('core/api/fetch-json')

module.exports = class AdministerUserModal extends ModalView
id: 'administer-user-modal'
Expand All @@ -21,6 +22,7 @@ module.exports = class AdministerUserModal extends ModalView
'click .update-classroom-btn': 'onClickUpdateClassroomButton'
'click .add-new-courses-btn': 'onClickAddNewCoursesButton'
'click .user-link': 'onClickUserLink'
'click #verified-teacher-checkbox': 'onClickVerifiedTeacherCheckbox'

initialize: (options, @userHandle) ->
@user = new User({_id:@userHandle})
Expand Down Expand Up @@ -143,3 +145,32 @@ module.exports = class AdministerUserModal extends ModalView
onClickUserLink: (e) ->
userID = $(e.target).data('user-id')
@openModalView new AdministerUserModal({}, userID) if userID

userIsVerifiedTeacher: () ->
@user.get('discourse')?.verified_teacher

userDiscourseLink: () ->
return false if not (@user.get('discourse')?.id and @user.get('discourse')?.username)
"https://discourse.codecombat.com/u/#{@user.get('discourse').username}"

onClickVerifiedTeacherCheckbox: (e) ->
if not @user.get('discourse')
@user.set('discourse', {})
checked = $(e.target).prop('checked')
@userSaveState = 'saving'
@render()
fetchJson("/db/user/#{@user.id}/verified_teacher", {
method: 'PUT',
json: {
userID: @user.id,
verified_teacher: checked,
}
}).then (res) =>
@userSaveState = 'saved'
@user.get('discourse').verified_teacher = res.discourse.verified_teacher
@render()
setTimeout((()=>
@userSaveState = null
@render()
), 2000)
null
5 changes: 5 additions & 0 deletions server/middleware/users.coffee
Expand Up @@ -217,6 +217,11 @@ module.exports =
return res.status(200).send({ priority: 'low' })
return res.status(200).send({ priority: undefined })

setVerifiedTeacher: wrap (req, res, next) ->
userID = mongoose.Types.ObjectId(req.body.userID)
user = yield User.findByIdAndUpdate(userID, { $set: { "discourse.verified_teacher": req.body.verified_teacher } }, { new: true })
res.status(200).send(user.toObject({req: req}))

signupWithPassword: wrap (req, res) ->
unless req.user.isAnonymous()
throw new errors.Forbidden('You are already signed in.')
Expand Down
1 change: 1 addition & 0 deletions server/routes/index.coffee
Expand Up @@ -214,6 +214,7 @@ module.exports.setup = (app) ->
app.get('/db/users/-/by-age', mw.auth.checkHasPermission(['admin']), mw.users.fetchByAge)
app.put('/db/user/-/remain-teacher', mw.users.remainTeacher)
app.get('/db/user/-/lead-priority', mw.auth.checkLoggedIn(), mw.users.getLeadPriority)
app.put('/db/user/:userID/verified_teacher', mw.auth.checkHasPermission(['admin']), mw.users.setVerifiedTeacher)
app.post('/db/user/:userID/request-verify-email', mw.users.sendVerificationEmail)
app.post('/db/user/:userID/verify/:verificationCode', mw.users.verifyEmailAddress) # TODO: Finalize URL scheme
app.get('/db/user/-/students', mw.auth.checkHasPermission(['admin']), mw.users.getStudents)
Expand Down

0 comments on commit da38ebf

Please sign in to comment.