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}
span.spr(data-i18n="courses.for") if price > 0
strong span.spr(data-i18n="courses.for")
span #{seats} strong
span.spl(data-i18n="courses.students1") span #{seats}
span . span.spl(data-i18n="courses.students1")
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,168 +2,197 @@ 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
p(data-i18n="teachers.intro_1")
p(data-i18n="teachers.intro_2")
h2(data-i18n="teachers.title") h3(data-i18n="teachers.free_title")
p(data-i18n="teachers.intro_1") if me.get('chinaVersion')
p(data-i18n="teachers.intro_2") p(data-i18n="teachers.cost_china")
else
p(data-i18n="teachers.free_1")
p(data-i18n="teachers.free_2")
h3(data-i18n="teachers.free_title") h3.teachers-title(data-i18n="teachers.teacher_subs_title")
if me.get('chinaVersion') p(data-i18n="teachers.teacher_subs_0")
p(data-i18n="teachers.cost_china") p
else span.spr(data-i18n="teachers.teacher_subs_1")
p(data-i18n="teachers.free_1") a(href='/teachers/freetrial', data-i18n="teachers.teacher_subs_2")
p(data-i18n="teachers.free_2") span.spl(data-i18n="teachers.teacher_subs_3")
h3.teachers-title(data-i18n="teachers.teacher_subs_title") h3(data-i18n="teachers.sub_includes_title")
p(data-i18n="teachers.teacher_subs_0") p(data-i18n="teachers.sub_includes_1")
p ul
span.spr(data-i18n="teachers.teacher_subs_1") li(data-i18n="teachers.sub_includes_2")
a(href='/teachers/freetrial', data-i18n="teachers.teacher_subs_2") li(data-i18n="teachers.sub_includes_3")
span.spl(data-i18n="teachers.teacher_subs_3") li(data-i18n="teachers.sub_includes_4")
li(data-i18n="teachers.sub_includes_5")
li(data-i18n="teachers.sub_includes_6")
li(data-i18n="teachers.sub_includes_7")
h3(data-i18n="teachers.sub_includes_title") h3(data-i18n="teachers.who_for_title")
p(data-i18n="teachers.sub_includes_1") p(data-i18n="teachers.who_for_1")
ul p(data-i18n="teachers.who_for_2")
li(data-i18n="teachers.sub_includes_2")
li(data-i18n="teachers.sub_includes_3")
li(data-i18n="teachers.sub_includes_4")
li(data-i18n="teachers.sub_includes_5")
li(data-i18n="teachers.sub_includes_6")
li(data-i18n="teachers.sub_includes_7")
h3(data-i18n="teachers.who_for_title") h3(data-i18n="teachers.monitor_progress_title")
p(data-i18n="teachers.who_for_1") p
p(data-i18n="teachers.who_for_2") span.spr(data-i18n="teachers.monitor_progress_1")
a(href='/clans', data-i18n="clans.clan")
span.spl(data-i18n="teachers.monitor_progress_2")
p
span.spr(data-i18n="teachers.monitor_progress_3")
a(href='/clans', data-i18n="clans.clans")
span.spl(data-i18n="teachers.monitor_progress_4")
p(data-i18n="teachers.monitor_progress_5")
h4(data-i18n="teachers.sub_includes_7")
ul
li
strong Track concepts
span.spl learned by each student
li Track levels completed for each student
li
span See your students'
strong.spl solutions
li Sort students by name or progress
li
strong Requires invitation
span.spl to join
p
img(src='/images/pages/clans/dashboard_preview.png' height='400')
p
span.spr(data-i18n="teachers.private_clans_2")
a(href='/clans', data-i18n="clans.clan")
span(data-i18n="teachers.private_clans_3")
p Private clans require a subscription to create or join.
h3(data-i18n="teachers.monitor_progress_title") h3(data-i18n="teachers.material_title")
p if me.get('chinaVersion')
span.spr(data-i18n="teachers.monitor_progress_1") p(data-i18n="teachers.material_china")
a(href='/clans', data-i18n="clans.clan") else
span.spl(data-i18n="teachers.monitor_progress_2") p(data-i18n="teachers.material_1")
p
span.spr(data-i18n="teachers.monitor_progress_3")
a(href='/clans', data-i18n="clans.clans")
span.spl(data-i18n="teachers.monitor_progress_4")
p(data-i18n="teachers.monitor_progress_5")
h4(data-i18n="teachers.sub_includes_7")
ul
li
strong Track concepts
span.spl learned by each student
li Track levels completed for each student
li
span See your students'
strong.spl solutions
li Sort students by name or progress
li
strong Requires invitation
span.spl to join
p
img(src='/images/pages/clans/dashboard_preview.png' height='400')
p
span.spr(data-i18n="teachers.private_clans_2")
a(href='/clans', data-i18n="clans.clan")
span(data-i18n="teachers.private_clans_3")
p Private clans require a subscription to create or join.
h3(data-i18n="teachers.material_title") h3(data-i18n="teachers.concepts_title")
if me.get('chinaVersion')
p(data-i18n="teachers.material_china")
else
p(data-i18n="teachers.material_1")
h3(data-i18n="teachers.concepts_title") //- TODO: i18n for concepts?
//- TODO: i18n for concepts? table.table.table-condensed.concepts-table
thead
tr
th
a(href='/play/dungeon') Kithgard Dungeon
th
a(href='/play/forest') Backwoods Forest
th
a(href='/play/desert') Sarven Desert
th
a(href='/play/mountain') Cloudrip Mountain
tbody
tr
td Basic Syntax
td If Statements
td Arithmetic
td Object Literals
tr
td Methods
td Relational Operators
td While Loops
td For Loops
tr
td Parameters
td Object Properties
td Break Statements
td Functions
tr
td Strings
td Input Handling
td Arrays
td Drawing
tr
td Loops
td
td String Comparison
td Modulo
tr
td Variables
td
td Finding Min/Max
td
table.table.table-condensed.concepts-table h3(data-i18n="teachers.how_much_title")
thead p
tr span(data-i18n="teachers.how_much_1")
th span.spr.spl
a(href='/play/dungeon') Kithgard Dungeon a(href='/account/subscription', data-i18n="teachers.how_much_2")
th span.spr.spl(data-i18n="teachers.how_much_3")
a(href='/play/forest') Backwoods Forest p
th span.spr(data-i18n="teachers.how_much_5")
a(href='/play/desert') Sarven Desert a(href='mailto:team@codecombat.com') team@codecombat.com
th span.spl(data-i18n="teachers.how_much_6")
a(href='/play/mountain') Cloudrip Mountain p(data-i18n="teachers.how_much_4")
tbody h4
tr a(href='/account/subscription', data-i18n="subscribe.group_discounts")
td Basic Syntax p(data-i18n="subscribe.group_discounts_1")
td If Statements table.table.table-condensed.discount-table
td Arithmetic tr
td Object Literals td(data-i18n="subscribe.group_discounts_1st")
tr td(data-i18n="subscribe.group_discounts_full")
td Methods tr
td Relational Operators td(data-i18n="subscribe.group_discounts_2nd")
td While Loops td(data-i18n="subscribe.group_discounts_20")
td For Loops tr
tr td(data-i18n="subscribe.group_discounts_12th")
td Parameters td(data-i18n="subscribe.group_discounts_40")
td Object Properties
td Break Statements
td Functions
tr
td Strings
td Input Handling
td Arrays
td Drawing
tr
td Loops
td
td String Comparison
td Modulo
tr
td Variables
td
td Finding Min/Max
td
h3(data-i18n="teachers.how_much_title") h3(data-i18n="teachers.more_info_title")
p p
span(data-i18n="teachers.how_much_1") span.spr(data-i18n="teachers.more_info_1")
span.spr.spl a(href='http://discourse.codecombat.com/c/teachers', data-i18n="teachers.more_info_2")
a(href='/account/subscription', data-i18n="teachers.how_much_2") span.spl(data-i18n="teachers.more_info_3")
span.spr.spl(data-i18n="teachers.how_much_3")
p
span.spr(data-i18n="teachers.how_much_5")
a(href='mailto:team@codecombat.com') team@codecombat.com
span.spl(data-i18n="teachers.how_much_6")
p(data-i18n="teachers.how_much_4")
h4
a(href='/account/subscription', data-i18n="subscribe.group_discounts")
p(data-i18n="subscribe.group_discounts_1")
table.table.table-condensed.discount-table
tr
td(data-i18n="subscribe.group_discounts_1st")
td(data-i18n="subscribe.group_discounts_full")
tr
td(data-i18n="subscribe.group_discounts_2nd")
td(data-i18n="subscribe.group_discounts_20")
tr
td(data-i18n="subscribe.group_discounts_12th")
td(data-i18n="subscribe.group_discounts_40")
h3(data-i18n="teachers.more_info_title") h3(data-i18n="teachers.sys_requirements_title")
p p(data-i18n="teachers.sys_requirements_1")
span.spr(data-i18n="teachers.more_info_1") p(data-i18n="teachers.sys_requirements_2")
a(href='http://discourse.codecombat.com/c/teachers', data-i18n="teachers.more_info_2")
span.spl(data-i18n="teachers.more_info_3")
h3(data-i18n="teachers.sys_requirements_title") if (me.get('preferredLanguage', true) || 'en-US') == 'pl'
p(data-i18n="teachers.sys_requirements_1") h3 Fundacja IT Leader Club Polska
p(data-i18n="teachers.sys_requirements_2") p
| CodeCombat w marcu 2015 roku nawiązał współpracę z Fundacją IT Leader Club Polska celem promowania nauki programowania wśród najmłodszych w Polsce. Język programowania stał się drugim językiem, bez którego bardzo trudno będzie młodym ludziom w przyszłości zaistnieć na konkurencyjnym rynku pracy.
if (me.get('preferredLanguage', true) || 'en-US') == 'pl' p
h3 Fundacja IT Leader Club Polska | Poznając podstawy języka programowania z Fundacją IT Leader Club Polska z wykorzystaniem CodeCombat, polskie dzieci będą bardzo szybko potrafiły poznać kluczowe zagadnienia programowania. Poprzez zabawę i interaktywną grę, dzieci szybko przyswoją niezbędną teorię i zaczną czerpać z programowania nie tylko wiedzę ale i pasję na całe życie - czego życzymy wszystkim naszym młodym studentom. W przypadku pytań prosimy o kontakt z Panem Arkadiuszem Lefanowiczem, Przewodniczącym Fundacji IT Leader Club Polska,
p a(href="http://www.itleader.org.pl") itleader.org.pl
| CodeCombat w marcu 2015 roku nawiązał współpracę z Fundacją IT Leader Club Polska celem promowania nauki programowania wśród najmłodszych w Polsce. Język programowania stał się drugim językiem, bez którego bardzo trudno będzie młodym ludziom w przyszłości zaistnieć na konkurencyjnym rynku pracy. | ,
p a(href="mailto:arkadiusz.lefanowicz@itleader.org.pl") arkadiusz.lefanowicz@itleader.org.pl
| Poznając podstawy języka programowania z Fundacją IT Leader Club Polska z wykorzystaniem CodeCombat, polskie dzieci będą bardzo szybko potrafiły poznać kluczowe zagadnienia programowania. Poprzez zabawę i interaktywną grę, dzieci szybko przyswoją niezbędną teorię i zaczną czerpać z programowania nie tylko wiedzę ale i pasję na całe życie - czego życzymy wszystkim naszym młodym studentom. W przypadku pytań prosimy o kontakt z Panem Arkadiuszem Lefanowiczem, Przewodniczącym Fundacji IT Leader Club Polska, | .
a(href="http://www.itleader.org.pl") itleader.org.pl
| ,
a(href="mailto:arkadiusz.lefanowicz@itleader.org.pl") arkadiusz.lefanowicz@itleader.org.pl
| .

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;
}