mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2024-12-01 11:27:14 -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_title: "Cuál es el email de tus 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_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."
|
||||
payment_methods: "Metodos de pago"
|
||||
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_2: "No se necesita experiencia previa!"
|
||||
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_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!"
|
||||
|
|
|
@ -67,11 +67,12 @@ block content
|
|||
else
|
||||
span.spr(data-i18n="courses.creating_for")
|
||||
strong.spr #{selectedCourseTitle}
|
||||
if price > 0
|
||||
span.spr(data-i18n="courses.for")
|
||||
strong
|
||||
span #{seats}
|
||||
span.spl(data-i18n="courses.students1")
|
||||
span .
|
||||
span #{'.'}
|
||||
p(data-i18n="courses.receive_code")
|
||||
p.center
|
||||
if price > 0
|
||||
|
|
|
@ -2,11 +2,40 @@ extends /templates/base
|
|||
|
||||
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(data-i18n="teachers.title")
|
||||
h2 More Info for Teachers
|
||||
p(data-i18n="teachers.intro_1")
|
||||
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