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_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}
|
||||||
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
|
||||||
|
|
|
@ -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
|
|
||||||
| .
|
|
||||||
|
|
|
@ -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