mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2024-11-23 23:58:02 -05:00
Initial courses object model
This commit is contained in:
parent
10e33dab4a
commit
8de00767b3
13 changed files with 178 additions and 1 deletions
|
@ -58,7 +58,7 @@ module.exports = class CocoRouter extends Backbone.Router
|
||||||
'contribute/diplomat': go('contribute/DiplomatView')
|
'contribute/diplomat': go('contribute/DiplomatView')
|
||||||
'contribute/scribe': go('contribute/ScribeView')
|
'contribute/scribe': go('contribute/ScribeView')
|
||||||
|
|
||||||
'courses': go('courses/mock1/CoursesView')
|
'courses': go('courses/CoursesView')
|
||||||
'courses/mock1': go('courses/mock1/CoursesView')
|
'courses/mock1': go('courses/mock1/CoursesView')
|
||||||
'courses/mock1/enroll/:courseID': go('courses/mock1/CourseEnrollView')
|
'courses/mock1/enroll/:courseID': go('courses/mock1/CourseEnrollView')
|
||||||
'courses/mock1/:courseID': go('courses/mock1/CourseDetailsView')
|
'courses/mock1/:courseID': go('courses/mock1/CourseDetailsView')
|
||||||
|
|
7
app/models/Course.coffee
Normal file
7
app/models/Course.coffee
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
CocoModel = require './CocoModel'
|
||||||
|
schema = require 'schemas/models/course.schema'
|
||||||
|
|
||||||
|
module.exports = class Course extends CocoModel
|
||||||
|
@className: 'Course'
|
||||||
|
@schema: schema
|
||||||
|
urlRoot: '/db/course'
|
7
app/models/CourseInstance.coffee
Normal file
7
app/models/CourseInstance.coffee
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
CocoModel = require './CocoModel'
|
||||||
|
schema = require 'schemas/models/course_instance.schema'
|
||||||
|
|
||||||
|
module.exports = class CourseInstance extends CocoModel
|
||||||
|
@className: 'CourseInstance'
|
||||||
|
@schema: schema
|
||||||
|
urlRoot: '/db/course_instance'
|
14
app/schemas/models/course.schema.coffee
Normal file
14
app/schemas/models/course.schema.coffee
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
c = require './../schemas'
|
||||||
|
|
||||||
|
CourseSchema = c.object {title: 'Course', required: ['name']}
|
||||||
|
c.extendNamedProperties CourseSchema # name first
|
||||||
|
|
||||||
|
_.extend CourseSchema.properties,
|
||||||
|
campaignID: c.objectId()
|
||||||
|
concepts: c.array {title: 'Programming Concepts', uniqueItems: true}, c.concept
|
||||||
|
description: {type: 'string'}
|
||||||
|
screenshot: c.url {title: 'URL', description: 'Link to course screenshot.'}
|
||||||
|
|
||||||
|
c.extendBasicProperties CourseSchema, 'Course'
|
||||||
|
|
||||||
|
module.exports = CourseSchema
|
14
app/schemas/models/course_instance.schema.coffee
Normal file
14
app/schemas/models/course_instance.schema.coffee
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
c = require './../schemas'
|
||||||
|
|
||||||
|
CourseInstanceSchema = c.object {title: 'Course Instance'}
|
||||||
|
c.extendNamedProperties CourseInstanceSchema # name first
|
||||||
|
|
||||||
|
_.extend CourseInstanceSchema.properties,
|
||||||
|
description: {type: 'string'}
|
||||||
|
members: c.array {title: 'Members'}, c.objectId()
|
||||||
|
ownerID: c.objectId()
|
||||||
|
prepaidID: c.objectId()
|
||||||
|
|
||||||
|
c.extendBasicProperties CourseInstanceSchema, 'CourseInstance'
|
||||||
|
|
||||||
|
module.exports = CourseInstanceSchema
|
26
app/templates/courses/courses.jade
Normal file
26
app/templates/courses/courses.jade
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
extends /templates/base
|
||||||
|
|
||||||
|
block content
|
||||||
|
|
||||||
|
//- DO NOT localize / i18n
|
||||||
|
|
||||||
|
div(style='border-bottom: 1px solid black')
|
||||||
|
span *UNDER CONSTRUCTION, please send feedback to
|
||||||
|
a.spl(href='mailto:team@codecombat.com') team@codecombat.com
|
||||||
|
|
||||||
|
h1(style='text-align: center;') Courses
|
||||||
|
.container-fluid
|
||||||
|
.row(style='font-size: 20px;')
|
||||||
|
.col-md-3
|
||||||
|
.col-md-3 Name
|
||||||
|
.col-md-3 Description
|
||||||
|
.col-md-3 Concepts
|
||||||
|
each course in courses
|
||||||
|
.row(style='border-top: 1px solid gray; padding: 10px;')
|
||||||
|
.col-md-3
|
||||||
|
img(src="#{course.get('screenshot')}", style="width: 100%;")
|
||||||
|
.col-md-3
|
||||||
|
p= course.get('name')
|
||||||
|
a(href="/editor/campaign/#{course.get('campaignID')}") Campaign (levels)
|
||||||
|
.col-md-3= course.get('description')
|
||||||
|
.col-md-3= course.get('concepts').join(' ')
|
18
app/views/courses/CoursesView.coffee
Normal file
18
app/views/courses/CoursesView.coffee
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
RootView = require 'views/core/RootView'
|
||||||
|
template = require 'templates/courses/courses'
|
||||||
|
CocoCollection = require 'collections/CocoCollection'
|
||||||
|
Course = require 'models/Course'
|
||||||
|
|
||||||
|
module.exports = class CoursesView extends RootView
|
||||||
|
id: 'courses-view'
|
||||||
|
template: template
|
||||||
|
|
||||||
|
constructor: (options) ->
|
||||||
|
super options
|
||||||
|
@courses = new CocoCollection([], { url: "/db/course", model: Course})
|
||||||
|
@supermodel.loadCollection(@courses, 'courses')
|
||||||
|
|
||||||
|
getRenderData: ->
|
||||||
|
context = super()
|
||||||
|
context.courses = @courses.models ? []
|
||||||
|
context
|
27
scripts/mongodb/updateCourses.js
Normal file
27
scripts/mongodb/updateCourses.js
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
// Update course data
|
||||||
|
|
||||||
|
// Usage:
|
||||||
|
// mongo <address>:<port>/<database> <script file> -u <username> -p <password>
|
||||||
|
|
||||||
|
// NOTE: uses name as unique identifier, so changing the name will insert a new course
|
||||||
|
|
||||||
|
var documents =
|
||||||
|
[
|
||||||
|
{
|
||||||
|
name: "Introduction to Computer Science",
|
||||||
|
slug: "introduction-to-computer-science",
|
||||||
|
campaignID: ObjectId("55b29efd1cd6abe8ce07db0d"),
|
||||||
|
concepts: ['basic_syntax', 'arguments', 'while_loops', 'strings', 'variables'],
|
||||||
|
description: "Learn basic syntax, while loops, and the CodeCombat environment.",
|
||||||
|
screenshot: "/images/pages/courses/101_info.png"
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
for (var i = 0; i < documents.length; i++) {
|
||||||
|
var doc = documents[i];
|
||||||
|
db.courses.update({name: doc.name}, doc, {upsert: true});
|
||||||
|
}
|
||||||
|
|
||||||
|
function log(str) {
|
||||||
|
print(new Date().toISOString() + " " + str);
|
||||||
|
}
|
|
@ -8,6 +8,8 @@ module.exports.handlers =
|
||||||
'article': 'articles/article_handler'
|
'article': 'articles/article_handler'
|
||||||
'campaign': 'campaigns/campaign_handler'
|
'campaign': 'campaigns/campaign_handler'
|
||||||
'clan': 'clans/clan_handler'
|
'clan': 'clans/clan_handler'
|
||||||
|
'course': 'courses/course_handler'
|
||||||
|
'course_instance': 'courses/course_instance_handler'
|
||||||
'level': 'levels/level_handler'
|
'level': 'levels/level_handler'
|
||||||
'level_component': 'levels/components/level_component_handler'
|
'level_component': 'levels/components/level_component_handler'
|
||||||
'level_feedback': 'levels/feedbacks/level_feedback_handler'
|
'level_feedback': 'levels/feedbacks/level_feedback_handler'
|
||||||
|
|
16
server/courses/Course.coffee
Normal file
16
server/courses/Course.coffee
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
mongoose = require 'mongoose'
|
||||||
|
config = require '../../server_config'
|
||||||
|
plugins = require '../plugins/plugins'
|
||||||
|
jsonSchema = require '../../app/schemas/models/course.schema'
|
||||||
|
|
||||||
|
CourseSchema = new mongoose.Schema {}, {strict: false, minimize: false, read:config.mongo.readpref}
|
||||||
|
|
||||||
|
CourseSchema.plugin plugins.NamedPlugin
|
||||||
|
CourseSchema.plugin plugins.SearchablePlugin, {searchable: ['name', 'description']}
|
||||||
|
|
||||||
|
CourseSchema.statics.privateProperties = []
|
||||||
|
CourseSchema.statics.editableProperties = []
|
||||||
|
|
||||||
|
CourseSchema.statics.jsonSchema = jsonSchema
|
||||||
|
|
||||||
|
module.exports = Course = mongoose.model 'course', CourseSchema, 'courses'
|
20
server/courses/CourseInstance.coffee
Normal file
20
server/courses/CourseInstance.coffee
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
mongoose = require 'mongoose'
|
||||||
|
config = require '../../server_config'
|
||||||
|
plugins = require '../plugins/plugins'
|
||||||
|
jsonSchema = require '../../app/schemas/models/course_instance.schema'
|
||||||
|
|
||||||
|
CourseInstanceSchema = new mongoose.Schema {}, {strict: false, minimize: false, read:config.mongo.readpref}
|
||||||
|
|
||||||
|
CourseInstanceSchema.plugin plugins.NamedPlugin
|
||||||
|
CourseInstanceSchema.plugin plugins.SearchablePlugin, {searchable: ['name', 'description']}
|
||||||
|
|
||||||
|
CourseInstanceSchema.statics.privateProperties = []
|
||||||
|
CourseInstanceSchema.statics.editableProperties = [
|
||||||
|
'description'
|
||||||
|
'members'
|
||||||
|
'name'
|
||||||
|
]
|
||||||
|
|
||||||
|
CourseInstanceSchema.statics.jsonSchema = jsonSchema
|
||||||
|
|
||||||
|
module.exports = CourseInstance = mongoose.model 'course.instance', CourseInstanceSchema, 'course.instances'
|
13
server/courses/course_handler.coffee
Normal file
13
server/courses/course_handler.coffee
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
mongoose = require 'mongoose'
|
||||||
|
Handler = require '../commons/Handler'
|
||||||
|
Course = require './Course'
|
||||||
|
|
||||||
|
CourseHandler = class CourseHandler extends Handler
|
||||||
|
modelClass: Course
|
||||||
|
jsonSchema: require '../../app/schemas/models/course.schema'
|
||||||
|
allowedMethods: ['GET']
|
||||||
|
|
||||||
|
hasAccess: (req) ->
|
||||||
|
req.method in @allowedMethods or req.user?.isAdmin()
|
||||||
|
|
||||||
|
module.exports = new CourseHandler()
|
13
server/courses/course_instance_handler.coffee
Normal file
13
server/courses/course_instance_handler.coffee
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
mongoose = require 'mongoose'
|
||||||
|
Handler = require '../commons/Handler'
|
||||||
|
CourseInstance = require './CourseInstance'
|
||||||
|
|
||||||
|
CourseInstanceHandler = class CourseInstanceHandler extends Handler
|
||||||
|
modelClass: CourseInstance
|
||||||
|
jsonSchema: require '../../app/schemas/models/course_instance.schema'
|
||||||
|
allowedMethods: ['GET', 'POST', 'PUT', 'DELETE']
|
||||||
|
|
||||||
|
hasAccess: (req) ->
|
||||||
|
req.method is 'GET' or req.user?.isAdmin()
|
||||||
|
|
||||||
|
module.exports = new CourseInstanceHandler()
|
Loading…
Reference in a new issue