From dfd369b9e992672e0df351aae870c356dfdcc7cf Mon Sep 17 00:00:00 2001 From: Calen Pennington Date: Tue, 30 Apr 2013 14:09:17 -0400 Subject: [PATCH 01/13] Make ordering of js bundles during jasmine tests consistant --- cms/envs/common.py | 8 ++++---- cms/envs/jasmine.py | 2 +- lms/envs/common.py | 21 ++++++++++++++++----- lms/envs/jasmine.py | 4 ++-- 4 files changed, 23 insertions(+), 12 deletions(-) diff --git a/cms/envs/common.py b/cms/envs/common.py index 680d19ca34..8effc773e0 100644 --- a/cms/envs/common.py +++ b/cms/envs/common.py @@ -206,6 +206,8 @@ PIPELINE_CSS = { }, } +# test_order: Determines the position of this chunk of javascript on +# the jasmine test page PIPELINE_JS = { 'main': { 'source_filenames': sorted( @@ -213,6 +215,7 @@ PIPELINE_JS = { rooted_glob(PROJECT_ROOT / 'static/', 'coffee/src/**/*.js') ) + ['js/hesitate.js', 'js/base.js'], 'output_filename': 'js/cms-application.js', + 'test_order': 0 }, 'module-js': { 'source_filenames': ( @@ -220,11 +223,8 @@ PIPELINE_JS = { rooted_glob(COMMON_ROOT / 'static/', 'xmodule/modules/js/*.js') ), 'output_filename': 'js/cms-modules.js', + 'test_order': 1 }, - 'spec': { - 'source_filenames': sorted(rooted_glob(PROJECT_ROOT / 'static/', 'coffee/spec/**/*.js')), - 'output_filename': 'js/cms-spec.js' - } } PIPELINE_CSS_COMPRESSOR = None diff --git a/cms/envs/jasmine.py b/cms/envs/jasmine.py index ac28f8fc9a..70b5b217ef 100644 --- a/cms/envs/jasmine.py +++ b/cms/envs/jasmine.py @@ -20,7 +20,7 @@ PIPELINE_JS['js-test-source'] = { 'source_filenames': sum([ pipeline_group['source_filenames'] for group_name, pipeline_group - in PIPELINE_JS.items() + in sorted(PIPELINE_JS.items(), key=lambda item: item[1].get('test_order', 1e100)) if group_name != 'spec' ], []), 'output_filename': 'js/cms-test-source.js' diff --git a/lms/envs/common.py b/lms/envs/common.py index 1fe6978ac2..32a213f06e 100644 --- a/lms/envs/common.py +++ b/lms/envs/common.py @@ -440,6 +440,9 @@ PIPELINE_CSS = { }, } + +# test_order: Determines the position of this chunk of javascript on +# the jasmine test page PIPELINE_JS = { 'application': { @@ -455,31 +458,39 @@ PIPELINE_JS = { 'js/sticky_filter.js', 'js/query-params.js', ], - 'output_filename': 'js/lms-application.js' + 'output_filename': 'js/lms-application.js', + + 'test_order': 1, }, 'courseware': { 'source_filenames': courseware_js, - 'output_filename': 'js/lms-courseware.js' + 'output_filename': 'js/lms-courseware.js', + 'test_order': 2, }, 'main_vendor': { 'source_filenames': main_vendor_js, 'output_filename': 'js/lms-main_vendor.js', + 'test_order': 0, }, 'module-js': { 'source_filenames': rooted_glob(COMMON_ROOT / 'static', 'xmodule/modules/js/*.js'), 'output_filename': 'js/lms-modules.js', + 'test_order': 3, }, 'discussion': { 'source_filenames': discussion_js, - 'output_filename': 'js/discussion.js' + 'output_filename': 'js/discussion.js', + 'test_order': 4, }, 'staff_grading': { 'source_filenames': staff_grading_js, - 'output_filename': 'js/staff_grading.js' + 'output_filename': 'js/staff_grading.js', + 'test_order': 5, }, 'open_ended': { 'source_filenames': open_ended_js, - 'output_filename': 'js/open_ended.js' + 'output_filename': 'js/open_ended.js', + 'test_order': 6, } } diff --git a/lms/envs/jasmine.py b/lms/envs/jasmine.py index 8551d80504..f3f20e7fbc 100644 --- a/lms/envs/jasmine.py +++ b/lms/envs/jasmine.py @@ -20,14 +20,14 @@ PIPELINE_JS['js-test-source'] = { 'source_filenames': sum([ pipeline_group['source_filenames'] for group_name, pipeline_group - in PIPELINE_JS.items() + in sorted(PIPELINE_JS.items(), key=lambda item: item[1].get('test_order', 1e100)) if group_name != 'spec' ], []), 'output_filename': 'js/lms-test-source.js' } PIPELINE_JS['spec'] = { - 'source_filenames': sorted(rooted_glob(PROJECT_ROOT / 'static/', 'coffee/spec/**/*.coffee')), + 'source_filenames': sorted(rooted_glob(PROJECT_ROOT / 'static/', 'coffee/spec/**/*.js')), 'output_filename': 'js/lms-spec.js' } From 771937b3da02ea29dee63a43701cee5412ce0b0f Mon Sep 17 00:00:00 2001 From: Calen Pennington Date: Tue, 30 Apr 2013 14:09:42 -0400 Subject: [PATCH 02/13] Remove duplicate libraries used while jasmine testing the LMS (as they are also defined in vendor) --- lms/static/coffee/files.json | 3 --- 1 file changed, 3 deletions(-) diff --git a/lms/static/coffee/files.json b/lms/static/coffee/files.json index 0efe488dd9..d9d7087efe 100644 --- a/lms/static/coffee/files.json +++ b/lms/static/coffee/files.json @@ -1,8 +1,5 @@ { "js_files": [ - "/static/js/vendor/RequireJS.js", - "/static/js/vendor/jquery.min.js", - "/static/js/vendor/jquery-ui.min.js", "/static/js/vendor/jquery.leanModal.min.js", "/static/js/vendor/flot/jquery.flot.js" ] From 76599863e6b73990368a2f5c0c9aba43678e6331 Mon Sep 17 00:00:00 2001 From: Calen Pennington Date: Tue, 30 Apr 2013 14:09:58 -0400 Subject: [PATCH 03/13] Compile all coffee and sass before running jasmine tests --- rakefile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rakefile b/rakefile index 2b9cb9fd57..459ecca3f3 100644 --- a/rakefile +++ b/rakefile @@ -301,6 +301,7 @@ end desc "Open jasmine tests for #{system} in your default browser" task "browse_jasmine_#{system}" do + compile_assets() django_for_jasmine(system, true) do |jasmine_url| Launchy.open(jasmine_url) puts "Press ENTER to terminate".red @@ -310,6 +311,7 @@ end desc "Use phantomjs to run jasmine tests for #{system} from the console" task "phantomjs_jasmine_#{system}" do + compile_assets() phantomjs = ENV['PHANTOMJS_PATH'] || 'phantomjs' django_for_jasmine(system, false) do |jasmine_url| sh("#{phantomjs} common/test/phantom-jasmine/lib/run_jasmine_test.coffee #{jasmine_url}") From aa4e29d2f1ac51c402957644c9c93c5ac4158c78 Mon Sep 17 00:00:00 2001 From: Jay Zoldak Date: Tue, 30 Apr 2013 15:21:23 -0400 Subject: [PATCH 04/13] Add leanModal vendor src to files.json for cms jasmine tests. Also .gitignore compiled js from coffee specs --- cms/static/coffee/files.json | 3 ++- common/static/coffee/spec/.gitignore | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 common/static/coffee/spec/.gitignore diff --git a/cms/static/coffee/files.json b/cms/static/coffee/files.json index e7a66b5bc0..c2e1a8acf6 100644 --- a/cms/static/coffee/files.json +++ b/cms/static/coffee/files.json @@ -7,6 +7,7 @@ "js/vendor/jquery.cookie.js", "js/vendor/json2.js", "js/vendor/underscore-min.js", - "js/vendor/backbone-min.js" + "js/vendor/backbone-min.js", + "js/vendor/jquery.leanModal.min.js" ] } diff --git a/common/static/coffee/spec/.gitignore b/common/static/coffee/spec/.gitignore new file mode 100644 index 0000000000..a6c7c2852d --- /dev/null +++ b/common/static/coffee/spec/.gitignore @@ -0,0 +1 @@ +*.js From 7f93443dfb898a6ff9d529e38a2bfc74412ccdf5 Mon Sep 17 00:00:00 2001 From: Jay Zoldak Date: Wed, 1 May 2013 10:53:58 -0400 Subject: [PATCH 05/13] Make the test_root/db directory and add a .gitignore for the db files that will be created there. --- test_root/db/.gitignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 test_root/db/.gitignore diff --git a/test_root/db/.gitignore b/test_root/db/.gitignore new file mode 100644 index 0000000000..98e6ef67fa --- /dev/null +++ b/test_root/db/.gitignore @@ -0,0 +1 @@ +*.db From bdfe1cff39642e2be240e3e6348d75e4cf24cf9b Mon Sep 17 00:00:00 2001 From: Jay Zoldak Date: Wed, 1 May 2013 11:34:28 -0400 Subject: [PATCH 06/13] Remove localization middleware from jasmine test execution --- cms/envs/jasmine.py | 6 ++++++ cms/envs/test.py | 3 --- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/cms/envs/jasmine.py b/cms/envs/jasmine.py index 70b5b217ef..e046a6d37c 100644 --- a/cms/envs/jasmine.py +++ b/cms/envs/jasmine.py @@ -35,4 +35,10 @@ JASMINE_TEST_DIRECTORY = PROJECT_ROOT + '/static/coffee' STATICFILES_DIRS.append(COMMON_ROOT / 'test' / 'phantom-jasmine' / 'lib') +# Remove the localization middleware class because it requires the test database +# to be sync'd and migrated in order to run the jasmine tests interactively +# with a browser +MIDDLEWARE_CLASSES = tuple(e for e in MIDDLEWARE_CLASSES \ + if e != 'django.middleware.locale.LocaleMiddleware') + INSTALLED_APPS += ('django_jasmine', ) diff --git a/cms/envs/test.py b/cms/envs/test.py index 0c91999a74..63b5efc645 100644 --- a/cms/envs/test.py +++ b/cms/envs/test.py @@ -17,9 +17,6 @@ TEST_RUNNER = 'django_nose.NoseTestSuiteRunner' TEST_ROOT = path('test_root') -# Makes the tests run much faster... -SOUTH_TESTS_MIGRATE = False # To disable migrations and use syncdb instead - # Want static files in the same dir for running on jenkins. STATIC_ROOT = TEST_ROOT / "staticfiles" From a3bb4bfb9fa7a5ecbf1db2e39d344f39e47ee3aa Mon Sep 17 00:00:00 2001 From: Nate Hardison Date: Thu, 11 Apr 2013 16:03:48 -0700 Subject: [PATCH 07/13] Updating dev environment setup * Script now installs RVM in conventional location (~/.rvm) by default, though it allows for the override if desired. This will enable folks to install edX alongside other Ruby projects also using RVM. * Script now uses virtualenvwrapper to ease the process of enabling the edX virtualenv and to allow for easy switching back and forth between virtualenv projects. It now also installs the "mitx" virtualenv in the conventional location of ~/.virtualenv. * Adding a .rvmrc file so that the Ruby environment will be automatically activated (via `rvm use`) whenever the user hits the `mitx/` directory. --- .rvmrc | 1 + create-dev-env.sh | 141 +++++++++++++++++++++++++++++++++++----------- 2 files changed, 108 insertions(+), 34 deletions(-) create mode 100644 .rvmrc diff --git a/.rvmrc b/.rvmrc new file mode 100644 index 0000000000..348cf3e59c --- /dev/null +++ b/.rvmrc @@ -0,0 +1 @@ +rvm use 1.9.3-p374@mitx diff --git a/create-dev-env.sh b/create-dev-env.sh index f0ebca3ff7..9993461722 100755 --- a/create-dev-env.sh +++ b/create-dev-env.sh @@ -26,12 +26,15 @@ EOL printf '\E[0m' } + error() { printf '\E[31m'; echo "$@"; printf '\E[0m' } + output() { printf '\E[36m'; echo "$@"; printf '\E[0m' } + usage() { cat< $HOME/.rvmrc +# If we're not installing RVM in the default location, then we'll do some +# funky stuff to make sure that we load in the RVM stuff properly on login. +if [ "$HOME/.rvm" != $RUBY_DIR ]; then + if ! grep -q "export rvm_path=$RUBY_DIR" ~/.rvmrc; then + if [[ -f $HOME/.rvmrc ]]; then + output "Copying existing .rvmrc to .rvmrc.bak" + cp $HOME/.rvmrc $HOME/.rvmrc.bak + fi + output "Creating $HOME/.rvmrc so rvm uses $RUBY_DIR" + echo "export rvm_path=$RUBY_DIR" > $HOME/.rvmrc + fi fi curl -sL get.rvm.io | bash -s -- --version 1.15.7 -source $RUBY_DIR/scripts/rvm + +# Ensure we have RVM available as a shell function so that it can mess +# with the environment and set everything up properly. The RVM install +# process adds this line to login scripts, so this shouldn't be necessary +# for the user to do each time. +if [[ `type -t rvm` != "function" ]]; then + source $RUBY_DIR/scripts/rvm +fi + +# Ruby doesn't like to build with clang, which is the default on OS X, so +# use gcc instead. This may not work, since if your gcc was installed with +# XCode 4.2 or greater, you have an LLVM-based gcc, which also doesn't +# always play nicely with Ruby, though it seems to be better than clang. +# You may have to install apple-gcc42 using Homebrew if this doesn't work. +# See `rvm requirements` for more information. +case `uname -s` in + Darwin) + # TODO (Nate): test to see if CC is already set to gcc or something + # similar first (not clang). + export CC=gcc + ;; +esac + +# Let the repo override the version of Ruby to install +if [[ -r $BASE/mitx/.ruby-version ]]; then + RUBY_VER=`cat $BASE/mitx/.ruby-version` +fi + +# Current stable version of RVM (1.19.0) requires the following to build Ruby: +# +# autoconf automake libtool pkg-config libyaml libxml2 libxslt libksba openssl +# +# If we decide to upgrade from the current version (1.15.7), can run +# +# LESS="-E" rvm install $RUBY_VER --autolibs=3 --with-readline +# +# to have RVM look for a package manager like Homebrew and install any missing +# libs automatically. RVM's --autolibs flag defaults to 2, which will fail if +# any required libs are missing. LESS="-E" rvm install $RUBY_VER --with-readline +# Create the "mitx" gemset +rvm use "$RUBY_VER@mitx" --create + output "Installing gem bundler" gem install bundler output "Installing ruby packages" -# hack :( -cd $BASE/mitx || true -bundle install +bundle install --gemfile $BASE/mitx/Gemfile # Install Python virtualenv @@ -274,16 +326,31 @@ case `uname -s` in ;; esac +# virtualenvwrapper uses the $WORKON_HOME env var to determine where to place +# virtualenv directories. Make sure it matches the selected $PYTHON_DIR. +export WORKON_HOME=$PYTHON_DIR + +# Load in the mkvirtualenv function if needed +if [[ `type -t mkvirtualenv` != "function" ]]; then + source `which virtualenvwrapper.sh` +fi + +# Create MITx virtualenv and link it to repo +# virtualenvwrapper automatically sources the activation script if [[ $systempkgs ]]; then - virtualenv --system-site-packages "$PYTHON_DIR" + mkvirtualenv -a "$BASE/mitx" --system-site-packages mitx || { + error "mkvirtualenv exited with a non-zero error" + return 1 + } else # default behavior for virtualenv>1.7 is # --no-site-packages - virtualenv "$PYTHON_DIR" + mkvirtualenv -a "$BASE/mitx" mitx || { + error "mkvirtualenv exited with a non-zero error" + return 1 + } fi -# activate mitx python virtualenv -source $PYTHON_DIR/bin/activate # compile numpy and scipy if requested @@ -315,6 +382,8 @@ case `uname -s` in # need latest pytz before compiling numpy and scipy pip install -U pytz pip install numpy + # scipy needs cython + pip install cython # fixes problem with scipy on 10.8 pip install -e git+https://github.com/scipy/scipy#egg=scipy-dev ;; @@ -344,14 +413,18 @@ cat< Date: Fri, 12 Apr 2013 10:26:33 -0700 Subject: [PATCH 08/13] Adding a check for an existing virtualenv This way, packages won't be inadvertently installed into the wrong virtual environment. I tried to have the check just run `deactivate`, but I couldn't figure out how to get that working, so the script just bails. --- create-dev-env.sh | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/create-dev-env.sh b/create-dev-env.sh index 9993461722..d387465c49 100755 --- a/create-dev-env.sh +++ b/create-dev-env.sh @@ -92,6 +92,7 @@ clone_repos() { fi } + ### START PROG=${0##*/} @@ -99,9 +100,9 @@ PROG=${0##*/} # Adjust this to wherever you'd like to place the codebase BASE="${PROJECT_HOME:-$HOME}/mitx_all" -# Use a sensible default (~/.virtualenv) for your Python virtualenvs +# Use a sensible default (~/.virtualenvs) for your Python virtualenvs # unless you've already got one set up with virtualenvwrapper. -PYTHON_DIR=${WORKON_HOME:-"$HOME/.virtualenv"} +PYTHON_DIR=${WORKON_HOME:-"$HOME/.virtualenvs"} # RVM defaults its install to ~/.rvm, but use the overridden rvm_path # if that's what's preferred. @@ -116,7 +117,14 @@ if [[ $EUID -eq 0 ]]; then exit 1 fi -# TODO: test for an existing virtualenv +# If in an existing virtualenv, bail +if [[ "x$VIRTUAL_ENV" != "x" ]]; then + envname=`basename $VIRTUAL_ENV` + error "Looks like you're already in the \"$envname\" virtual env." + error "Run \`deactivate\` and then re-run this script." + usage + exit 1 +fi # Read arguments ARGS=$(getopt "cvhs" "$*") @@ -281,8 +289,6 @@ fi # See `rvm requirements` for more information. case `uname -s` in Darwin) - # TODO (Nate): test to see if CC is already set to gcc or something - # similar first (not clang). export CC=gcc ;; esac From 2b17904c93cb50d463cd9d48437fef5fc26b7e6a Mon Sep 17 00:00:00 2001 From: Nate Hardison Date: Wed, 24 Apr 2013 13:18:12 -0700 Subject: [PATCH 09/13] Replacing `.rvmrc` with `.ruby-gemset` In order to avoid duplicating the Ruby version between the `.rvmrc` and the `.ruby-version`, we'll get rid of the `.rvmrc` and use the `.ruby-gemset` file to specify the gemset. These files are supported by RVM as documented [here](https://gist.github.com/fnichol/1912050). --- .ruby-gemset | 1 + .rvmrc | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 .ruby-gemset delete mode 100644 .rvmrc diff --git a/.ruby-gemset b/.ruby-gemset new file mode 100644 index 0000000000..93a8706d3e --- /dev/null +++ b/.ruby-gemset @@ -0,0 +1 @@ +mitx diff --git a/.rvmrc b/.rvmrc deleted file mode 100644 index 348cf3e59c..0000000000 --- a/.rvmrc +++ /dev/null @@ -1 +0,0 @@ -rvm use 1.9.3-p374@mitx From d807b955f779d73ad86af2863c1cfdc02a0abc7d Mon Sep 17 00:00:00 2001 From: Chris Dodge Date: Wed, 1 May 2013 15:27:36 -0400 Subject: [PATCH 10/13] add leading slash to the jsi18n include --- cms/templates/base.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cms/templates/base.html b/cms/templates/base.html index 3f286c2582..f1a87d6424 100644 --- a/cms/templates/base.html +++ b/cms/templates/base.html @@ -30,7 +30,7 @@ <%include file="courseware_vendor_js.html"/> - + From 0b452f6195ddd92133750aefe6592c54b75ea28e Mon Sep 17 00:00:00 2001 From: Jay Zoldak Date: Thu, 2 May 2013 12:41:59 -0400 Subject: [PATCH 11/13] Change org for gcli status command from mitx to edx --- jenkins/base.sh | 4 ++-- jenkins/test.sh | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/jenkins/base.sh b/jenkins/base.sh index c7175e6e52..fc2595662a 100644 --- a/jenkins/base.sh +++ b/jenkins/base.sh @@ -1,6 +1,6 @@ function github_status { - gcli status create mitx mitx $GIT_COMMIT \ + gcli status create edx mitx $GIT_COMMIT \ --params=$1 \ target_url:$BUILD_URL \ description:"Build #$BUILD_NUMBER is running" \ @@ -9,4 +9,4 @@ function github_status { function github_mark_failed_on_exit { trap '[ $? == "0" ] || github_status state:failed' EXIT -} \ No newline at end of file +} diff --git a/jenkins/test.sh b/jenkins/test.sh index 53643b8440..7475076086 100755 --- a/jenkins/test.sh +++ b/jenkins/test.sh @@ -4,7 +4,7 @@ set -e set -x function github_status { - gcli status create mitx mitx $GIT_COMMIT \ + gcli status create edx mitx $GIT_COMMIT \ --params=$1 \ target_url:$BUILD_URL \ description:"Build #$BUILD_NUMBER $2" \ From f566b4f003111ce39c6780d6bec7dc7e6a704db8 Mon Sep 17 00:00:00 2001 From: James Tauber Date: Thu, 2 May 2013 13:05:20 -0400 Subject: [PATCH 12/13] fix requirements to use moved forks --- github-requirements.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/github-requirements.txt b/github-requirements.txt index 0d7b75b89b..3b71d228e7 100644 --- a/github-requirements.txt +++ b/github-requirements.txt @@ -1,9 +1,9 @@ # Python libraries to install directly from github # Third-party: --e git://github.com/MITx/django-staticfiles.git@6d2504e5c8#egg=django-staticfiles --e git://github.com/MITx/django-pipeline.git#egg=django-pipeline --e git://github.com/MITx/django-wiki.git@e2e84558#egg=django-wiki +-e git://github.com/edx/django-staticfiles.git@6d2504e5c8#egg=django-staticfiles +-e git://github.com/edx/django-pipeline.git#egg=django-pipeline +-e git://github.com/edx/django-wiki.git@e2e84558#egg=django-wiki -e git://github.com/dementrock/pystache_custom.git@776973740bdaad83a3b029f96e415a7d1e8bec2f#egg=pystache_custom-dev # Our libraries: From aae40b4378fa40220a8c6fd382cc88f3c6ef7c2f Mon Sep 17 00:00:00 2001 From: Victor Shnayder Date: Fri, 3 May 2013 08:55:40 -0400 Subject: [PATCH 13/13] Press updates LH: 381, 382, 383 --- common/djangoapps/student/views.py | 5 +- lms/static/images/press/cbsnews_178x138.jpg | Bin 0 -> 3158 bytes lms/static/images/press/nytimes_240x180.png | Bin 0 -> 4913 bytes .../images/press/wash_post_logo_178x138.jpg | Bin 0 -> 3083 bytes lms/templates/feed.rss | 13 ++- lms/templates/index.html | 17 +-- lms/templates/press.json | 102 ++++++++++++++++++ 7 files changed, 121 insertions(+), 16 deletions(-) create mode 100644 lms/static/images/press/cbsnews_178x138.jpg create mode 100644 lms/static/images/press/nytimes_240x180.png create mode 100644 lms/static/images/press/wash_post_logo_178x138.jpg diff --git a/common/djangoapps/student/views.py b/common/djangoapps/student/views.py index abcb9d988b..53d1c72cc4 100644 --- a/common/djangoapps/student/views.py +++ b/common/djangoapps/student/views.py @@ -76,8 +76,9 @@ def index(request, extra_context={}, user=None): ''' # The course selection work is done in courseware.courses. - domain = settings.MITX_FEATURES.get('FORCE_UNIVERSITY_DOMAIN') # normally False - if domain == False: # do explicit check, because domain=None is valid + domain = settings.MITX_FEATURES.get('FORCE_UNIVERSITY_DOMAIN') # normally False + # do explicit check, because domain=None is valid + if domain == False: domain = request.META.get('HTTP_HOST') courses = get_courses(None, domain=domain) diff --git a/lms/static/images/press/cbsnews_178x138.jpg b/lms/static/images/press/cbsnews_178x138.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c9fea9e31f4c511de205ed1b8520323a6678cf32 GIT binary patch literal 3158 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 P1IXSl`#%K>&d|RALqxSJ literal 0 HcmV?d00001 diff --git a/lms/static/images/press/nytimes_240x180.png b/lms/static/images/press/nytimes_240x180.png new file mode 100644 index 0000000000000000000000000000000000000000..d34376a91f7e71240e3dce1d2970b619894f1ed7 GIT binary patch literal 4913 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 literal 0 HcmV?d00001 diff --git a/lms/templates/feed.rss b/lms/templates/feed.rss index 07335bd22a..ca24d584c5 100644 --- a/lms/templates/feed.rss +++ b/lms/templates/feed.rss @@ -6,9 +6,18 @@ EdX Blog - 2013-04-03T14:00:12-07:00 + 2013-05-03T14:00:12-07:00 - tag:www.edx.org,2012:Post/17 + tag:www.edx.org,2013:Post/18 + 2013-05-02T14:00:00-07:00 + 2013-05-02T14:00:00-07:00 + + edX project at San Jose State featured in New York Times + <img src="${static.url('images/press/nytimes_240x180.png')}" /> + <p></p> + + + tag:www.edx.org,2013:Post/17 2012-12-19T14:00:00-07:00 2012-12-19T14:00:00-07:00 diff --git a/lms/templates/index.html b/lms/templates/index.html index f2fc34c8ec..109ab6fb2f 100644 --- a/lms/templates/index.html +++ b/lms/templates/index.html @@ -190,18 +190,11 @@ diff --git a/lms/templates/press.json b/lms/templates/press.json index 9cc79783ae..43c295b63e 100644 --- a/lms/templates/press.json +++ b/lms/templates/press.json @@ -1,4 +1,106 @@ [ + { + "title": "Adapting to Blended Courses, and Finding Early Benefits", + "url": "http://www.nytimes.com/2013/04/30/education/adapting-to-blended-courses-and-finding-early-benefits.html?ref=education", + "author": "Tamar Lewin", + "image": "nyt_logo_178x138.jpeg", + "deck": null, + "publication": "The New York Times", + "publish_date": "April 29, 2013" + }, + + { + "title": "Colleges Adapt Online Courses to Ease Burden", + "url": "http://www.nytimes.com/2013/04/30/education/colleges-adapt-online-courses-to-ease-burden.html?pagewanted=all", + "author": "Tamar Lewin", + "image": "nyt_logo_178x138.jpeg", + "deck": null, + "publication": "The New York Times", + "publish_date": "April 29, 2013" + }, + + { + "title": "Online Education Lifts Pass Rates at University", + "url": "http://online.wsj.com/article/SB10001424127887323741004578414861572832182.html?mod=googlenews_wsj", + "author": "Geoffrey Fowler", + "image": "wsj_logo_178x138.jpg", + "deck": null, + "publication": "The Wall Street Journal", + "publish_date": "April 10, 2013" + }, + + { + "title": "Software Seen Giving Grades on Essay Tests", + "url": "http://www.nytimes.com/2013/04/05/science/new-test-for-computers-grading-essays-at-college-level.html?pagewanted=all&_r=0", + "author": "John Markoff", + "image": "nyt_logo_178x138.jpeg", + "deck": null, + "publication": "The New York Times", + "publish_date": "April 4, 2013" + }, + + { + "title": "Stanford to help build edX MOOC platform", + "url": "http://www.washingtonpost.com/local/education/stanford-to-help-build-edx-mooc-platform/2013/04/02/5b53bb3e-9bbe-11e2-9a79-eb5280c81c63_story.html", + "author": "Nick Anderson", + "image": "wash_post_logo_178x138.jpg", + "deck": null, + "publication": "The Washington Post", + "publish_date": "April 3, 2013" + }, + + { + "title": "Could online ed end college as we know it?", + "url": "http://www.cbsnews.com/video/watch/?id=50143164n", + "author": "CBS This Morning", + "image": "cbsnews_178x138.jpg", + "deck": null, + "publication": "CBS Television Network", + "publish_date": "March 19, 2013" + }, + + { + "title": "The Professors’ Big Stage", + "url": "http://www.nytimes.com/2013/03/06/opinion/friedman-the-professors-big-stage.html?_r=1&#commentsContainer", + "author": "Thomas L. Friedman", + "image": "nyt_logo_178x138.jpeg", + "deck": null, + "publication": "The New York Times", + "publish_date": "March 6, 2013" + }, + + + { + "title": "Universities Abroad Join Partnerships On the Web", + "url": "http://www.nytimes.com/2013/02/21/education/universities-abroad-join-mooc-course-projects.html", + "author": "Tamar Lewin", + "image": "nyt_logo_178x138.jpeg", + "deck": null, + "publication": "The New York Times", + "publish_date": "February 20, 2013" + }, + + + { + "title": "Georgetown to offer free online courses", + "url": "http://www.washingtonpost.com/local/education/georgetown-to-offer-free-online-courses/2012/12/09/365c4612-3fd3-11e2-bca3-aadc9b7e29c5_story.html", + "author": "Nick Anderson", + "image": "wash_post_logo_178x138.jpg", + "deck": null, + "publication": "The Washington Post", + "publish_date": "December 9, 2012" + }, + + { + "title": "Wellesley College teams up with online provider edX", + "url": "http://bostonglobe.com/2012/12/04/edx/AqnQ808q4IEcaUa8KuZuBO/story.html", + "author": "Peter Schworm", + "image": "bostonglobe_logo_178x138.jpeg", + "deck": null, + "publication": "The Boston Globe", + "publish_date": "December 4, 2012" + }, + { "title": "The Year of the MOOC", "url": "http://www.nytimes.com/2012/11/04/education/edlife/massive-open-online-courses-are-multiplying-at-a-rapid-pace.html",