mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2024-11-29 10:35:51 -05:00
Merge branch 'master' into production
This commit is contained in:
commit
701a72e7c9
4 changed files with 272 additions and 159 deletions
|
@ -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!"
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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")
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
Loading…
Reference in a new issue