Merge branch 'master' into production

This commit is contained in:
Matt Lott 2015-10-08 12:28:12 -07:00
commit 701a72e7c9
4 changed files with 272 additions and 159 deletions

View file

@ -430,10 +430,10 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
parent_email_sent: "Email enviado!" parent_email_sent: "Email enviado!"
parent_email_title: "Cuál es el email de tus padres?" parent_email_title: "Cuál es el email de tus padres?"
parents: "Para padres" parents: "Para padres"
parents_title: "Su hijo aprenderá a programar." # {change} parents_title: "Estimado Padre de Familia: Su hijo está aprendiendo a programar. ¿Le apoyaría a continuar?"
parents_blurb1: "Con CodeCombat, su hijo aprenderá a escribiendo código real. Empezaran aprendiendo comandos simples avanzando a temas más complejos." parents_blurb1: "Con CodeCombat, su hijo aprenderá a escribiendo código real. Empezaran aprendiendo comandos simples avanzando a temas más complejos."
parents_blurb1a: "La Programación es una habilidad escencial que su hijo sin duda usará en la adultez. Para el 2020, habilidades básicas en software serán requeridas por el 77% de trabajos, y los ingenieros de software están en alta demanda alrededor del mundo. ¿Sabía que Ciencias de la Computación es la carrera mejor pagada?" parents_blurb1a: "La Programación es una habilidad escencial que su hijo sin duda usará en la adultez. Para el 2020, habilidades básicas en software serán requeridas por el 77% de trabajos, y los ingenieros de software están en alta demanda alrededor del mundo. ¿Sabía que Ciencias de la Computación es la carrera mejor pagada?"
parents_blurb2: "Por $9.99 USD/mes, recibirán nuevos desafíos todas las semanas y soporte personal por email de programadores profesionales." # {change} parents_blurb2: "Por $9.99 USD mensuales, su hijo recibirá nuevos desafíos todas las semanas y soporte personal por email de programadores profesionales."
parents_blurb3: "Sin Riesgo: Garantía de 100% de devolución, fácil 1-click y des- suscribirse." parents_blurb3: "Sin Riesgo: Garantía de 100% de devolución, fácil 1-click y des- suscribirse."
payment_methods: "Metodos de pago" payment_methods: "Metodos de pago"
payment_methods_title: "Metodos de pago aceptados." payment_methods_title: "Metodos de pago aceptados."
@ -610,7 +610,7 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
intro_1: "CodeCombat es un juego online que enseña a programar.Los estudiantes escriben código en idiomas de programación real." intro_1: "CodeCombat es un juego online que enseña a programar.Los estudiantes escriben código en idiomas de programación real."
intro_2: "No se necesita experiencia previa!" intro_2: "No se necesita experiencia previa!"
free_title: "¿Cuánto cuesta?" free_title: "¿Cuánto cuesta?"
cost_china: "CodeCombat es gratis en China por los primeros cinco niveles, despues cuesta $9.99(dólares) por mes para tener acceso a 120+ niveles que son exclusivos en nuestros servidores en China." # {change} cost_china: "CodeCombat es gratis en China por los primeros cinco niveles, despues cuesta $9.99(dólares) por mes para tener acceso a 180+ niveles que son exclusivos en nuestros servidores en China."
free_1: "CodeCombat Basic es GRATIS! Hay 70+ niveles gratis que cubren cada concepto." # {change} free_1: "CodeCombat Basic es GRATIS! Hay 70+ niveles gratis que cubren cada concepto." # {change}
free_2: "Una suscripción mensual le da acceso a tutoriales en vídeo y niveles extra para practicar." free_2: "Una suscripción mensual le da acceso a tutoriales en vídeo y niveles extra para practicar."
teacher_subs_title: "¡Los amestros obtienen subscripciones gratuitas!" teacher_subs_title: "¡Los amestros obtienen subscripciones gratuitas!"

View file

@ -67,11 +67,12 @@ block content
else else
span.spr(data-i18n="courses.creating_for") span.spr(data-i18n="courses.creating_for")
strong.spr #{selectedCourseTitle} strong.spr #{selectedCourseTitle}
if price > 0
span.spr(data-i18n="courses.for") span.spr(data-i18n="courses.for")
strong strong
span #{seats} span #{seats}
span.spl(data-i18n="courses.students1") span.spl(data-i18n="courses.students1")
span . span #{'.'}
p(data-i18n="courses.receive_code") p(data-i18n="courses.receive_code")
p.center p.center
if price > 0 if price > 0

View file

@ -2,11 +2,40 @@ extends /templates/base
block content block content
p.row h2(style='color:#CC0000;') Try CodeCombat Courses!
p
strong What are CodeCombat Courses?
p
a.spr(href='/courses') Courses
span organize the same great levels into groups. They make it easier for you to manage a class of students and monitor their progress.
p
strong How to use them:
ol
li
span.spr Navigate to the
a.spr(href='/courses') Courses
span page
li Click the green 'Get FREE course' button
li Follow the enrollment instructions
li Add students via the 'Add Students' tab
p
strong We Need Your Help!
p Courses are still in early development, and we need your feedback to make them great for the classroom.
p
strong How you can help:
ul
li
spa.spr Spend 5 minutes checking out
a.spr(href='/courses') Courses
li Enroll in a course and add a student
li Monitor a group of students working through the first course
p
span.spr Send your feedback to
a(href='mailto:team@codecombat.com') team@codecombat.com
p Thanks!
br
.span5 h2 More Info for Teachers
h2(data-i18n="teachers.title")
p(data-i18n="teachers.intro_1") p(data-i18n="teachers.intro_1")
p(data-i18n="teachers.intro_2") p(data-i18n="teachers.intro_2")

View file

@ -0,0 +1,83 @@
// Latest enabled teacher trial requests
// Usage:
// mongo <address>:<port>/<database> <script file> -u <username> -p <password>
var startDay = '2015-09-01';
var endDay = '2015-10-01';
print('Date range:', startDay, endDay);
var prepaidCodes = getPrepaidCodes(startDay, endDay);
print('Prepaid Codes found:', prepaidCodes.length);
var userIDs = getEnabledUserIDs(prepaidCodes);
print('Enabled users found:', userIDs.length);
var userEmails = getUserEmails(userIDs);
print('User emails found:', userEmails.length);
for (var i = 0; i < userEmails.length; i++) {
print(userEmails[i]);
}
function objectIdWithTimestamp(timestamp) {
// Convert string date to Date object (otherwise assume timestamp is a date)
if (typeof(timestamp) == 'string') timestamp = new Date(timestamp);
// Convert date object to hex seconds since Unix epoch
var hexSeconds = Math.floor(timestamp/1000).toString(16);
// Create an ObjectId with that hex timestamp
var constructedObjectId = ObjectId(hexSeconds + "0000000000000000");
return constructedObjectId
}
function getPrepaidCodes(startDay, endDay) {
var startObj = objectIdWithTimestamp(ISODate(startDay + "T00:00:00.000Z"));
var endObj = objectIdWithTimestamp(ISODate(endDay + "T00:00:00.000Z"))
var cursor = db['trial.requests'].find(
{$and:
[
{'prepaidCode': {$exists: true}},
{_id: {$gte: startObj}},
{_id: {$lt: endObj}}
]
},
{prepaidCode: 1}
);
var prepaidCodes = [];
while (cursor.hasNext()) {
var myDoc = cursor.next();
prepaidCodes.push(myDoc.prepaidCode);
}
return prepaidCodes;
}
function getEnabledUserIDs(prepaidCodes) {
var cursor = db['prepaids'].find(
{$and:
[
{code: {$in: prepaidCodes}},
{redeemers: {$exists: true}},
{$where: 'this.redeemers.length > 0'}
]
},
{redeemers: 1}
);
var userIDs = [];
while (cursor.hasNext()) {
var myDoc = cursor.next();
userIDs.push(myDoc.redeemers[0].userID);
}
return userIDs;
}
function getUserEmails(userIDs) {
var cursor = db['users'].find({_id: {$in: userIDs}}, {emailLower: 1});
var userEmails = [];
while (cursor.hasNext()) {
var myDoc = cursor.next();
userEmails.push(myDoc.emailLower);
}
userEmails.sort()
return userEmails;
}