Commit 4f4e7513 by Bridger Maxwell

Merge

parents 0c41576e 04469a4e
import json
from django.test.client import Client
from django.test import TestCase
from mock import patch, Mock
from override_settings import override_settings
from django.conf import settings
def parse_json(response):
"""Parse response, which is assumed to be json"""
return json.loads(response.content)
class AuthTestCase(TestCase):
"""Check that various permissions-related things work"""
def test_index(self):
"""Make sure the main page loads."""
resp = self.client.get('/')
self.assertEqual(resp.status_code, 200)
def test_signup_load(self):
"""Make sure the signup page loads."""
resp = self.client.get('/signup')
self.assertEqual(resp.status_code, 200)
def test_create_account(self):
# No post data -- should fail
resp = self.client.post('/create_account', {})
self.assertEqual(resp.status_code, 200)
data = parse_json(resp)
self.assertEqual(data['success'], False)
# Should work
resp = self.client.post('/create_account', {
'username': 'user',
'email': 'a@b.com',
'password': 'xyz',
'location' : 'home',
'language' : 'Franglish',
'name' : 'Fred Weasley',
'terms_of_service' : 'true',
'honor_code' : 'true'})
self.assertEqual(resp.status_code, 200)
data = parse_json(resp)
self.assertEqual(data['success'], True)
......@@ -2,9 +2,11 @@ from util.json_request import expect_json
import json
from django.http import HttpResponse
from django.core.context_processors import csrf
from django_future.csrf import ensure_csrf_cookie
from fs.osfs import OSFS
from django.core.urlresolvers import reverse
from fs.osfs import OSFS
from xmodule.modulestore import Location
from github_sync import export_to_github
......@@ -26,6 +28,14 @@ def index(request):
@ensure_csrf_cookie
def signup(request):
"""
Display the signup form.
"""
csrf_token = csrf(request)['csrf_token']
return render_to_response('signup.html', {'csrf': csrf_token })
@ensure_csrf_cookie
def course_index(request, org, course, name):
# TODO (cpennington): These need to be read in from the active user
course = modulestore().get_item(['i4x', org, course, 'course', name])
......
from django.test import TestCase
from path import path
import shutil
import os
from github_sync import import_from_github, export_to_github
from git import Repo
from django.conf import settings
......@@ -13,10 +14,18 @@ from github_sync.exceptions import GithubSyncError
@override_settings(DATA_DIR=path('test_root'))
class GithubSyncTestCase(TestCase):
def cleanup(self):
shutil.rmtree(self.repo_dir, ignore_errors=True)
shutil.rmtree(self.remote_dir, ignore_errors=True)
def setUp(self):
self.working_dir = path(settings.TEST_ROOT)
self.repo_dir = self.working_dir / 'local_repo'
self.remote_dir = self.working_dir / 'remote_repo'
# make sure there's no stale data lying around
self.cleanup()
shutil.copytree('common/test/data/toy', self.remote_dir)
remote = Repo.init(self.remote_dir)
......@@ -33,8 +42,7 @@ class GithubSyncTestCase(TestCase):
})
def tearDown(self):
shutil.rmtree(self.repo_dir)
shutil.rmtree(self.remote_dir)
self.cleanup()
def test_initialize_repo(self):
"""
......
......@@ -34,6 +34,10 @@ MITX_FEATURES = {
'GITHUB_PUSH': False,
}
# needed to use lms student app
GENERATE_RANDOM_USER_CREDENTIALS = False
############################# SET PATH INFORMATION #############################
PROJECT_ROOT = path(__file__).abspath().dirname().dirname() # /mitx/cms
REPO_ROOT = PROJECT_ROOT.dirname()
......@@ -97,7 +101,7 @@ MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
# Instead of AuthenticationMiddleware, we use a cached backed version
# Instead of AuthenticationMiddleware, we use a cache-backed version
'cache_toolbox.middleware.CacheBackedAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
......@@ -214,7 +218,7 @@ PIPELINE_COMPILERS = [
PIPELINE_SASS_ARGUMENTS = '-t compressed -r {proj_dir}/static/sass/bourbon/lib/bourbon.rb'.format(proj_dir=PROJECT_ROOT)
PIPELINE_CSS_COMPRESSOR = None
PIPELINE_JS_COMPRESSOR = 'pipeline.compressors.yui.YUICompressor'
PIPELINE_JS_COMPRESSOR = None
STATICFILES_IGNORE_PATTERNS = (
"sass/*",
......@@ -239,9 +243,11 @@ INSTALLED_APPS = (
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'south',
# For CMS
'contentstore',
'student', # misleading name due to sharing with lms
# For asset pipelining
'pipeline',
......
......@@ -25,7 +25,7 @@ MODULESTORE = {
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': ENV_ROOT / "db" / "mitx.db",
'NAME': ENV_ROOT / "db" / "cms.db",
}
}
......
......@@ -9,6 +9,8 @@ sessions. Assumes structure:
"""
from .common import *
import os
from path import path
# Nose Test Runner
INSTALLED_APPS += ('django_nose',)
......@@ -17,7 +19,11 @@ for app in os.listdir(PROJECT_ROOT / 'djangoapps'):
NOSE_ARGS += ['--cover-package', app]
TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'
TEST_ROOT = 'test_root'
TEST_ROOT = path('test_root')
# Want static files in the same dir for running on jenkins.
STATIC_ROOT = TEST_ROOT / "staticfiles"
MODULESTORE = {
'default': {
......@@ -34,7 +40,7 @@ MODULESTORE = {
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': ENV_ROOT / "db" / "mitx.db",
'NAME': ENV_ROOT / "db" / "cms.db",
}
}
......
......@@ -80,6 +80,6 @@ $(document).ready(function(){
$('section.problem-edit').show();
return false;
});
});
......@@ -6,50 +6,50 @@
.videosequence a:first-child {
@extend .content-type;
background-image: url('/static/img/content-types/videosequence.png');
background-image: url('../img/content-types/videosequence.png');
}
.video a:first-child {
@extend .content-type;
background-image: url('/static/img/content-types/video.png');
background-image: url('../img/content-types/video.png');
}
.problemset a:first-child {
@extend .content-type;
background-image: url('/static/img/content-types/problemset.png');
background-image: url('../img/content-types/problemset.png');
}
.problem a:first-child {
@extend .content-type;
background-image: url('/static/img/content-types/problem.png');
background-image: url('../img/content-types/problem.png');
}
.lab a:first-child {
@extend .content-type;
background-image: url('/static/img/content-types/lab.png');
background-image: url('../img/content-types/lab.png');
}
.tab a:first-child {
@extend .content-type;
background-image: url('/static/img/content-types/lab.png');
background-image: url('../img/content-types/lab.png');
}
.html a:first-child {
@extend .content-type;
background-image: url('/static/img/content-types/html.png');
background-image: url('../img/content-types/html.png');
}
.vertical a:first-child {
@extend .content-type;
background-image: url('/static/img/content-types/vertical.png');
background-image: url('../img/content-types/vertical.png');
}
.sequential a:first-child {
@extend .content-type;
background-image: url('/static/img/content-types/sequential.png');
background-image: url('../img/content-types/sequential.png');
}
.chapter a:first-child {
@extend .content-type;
background-image: url('/static/img/content-types/chapter.png');
background-image: url('../img/content-types/chapter.png');
}
<%inherit file="marketing.html" />
<%block name="content">
<section class="tos">
<div>
<section class="activation">
<h1>Account already active!</h1>
<p> This account has already been activated. You can log in at
the <a href="/">home page</a>.</p>
</div>
</section>
</%block>
\ No newline at end of file
<%inherit file="marketing.html" />
<%block name="content">
<section class="tos">
<div>
<h1>Activation Complete!</h1>
<p>Thanks for activating your account. You can log in at the <a href="/">home page</a>.</p>
</div>
</section>
</%block>
\ No newline at end of file
<%inherit file="marketing.html" />
<%block name="content">
<section class="tos">
<div>
<h1>Activation Invalid</h1>
<p>Something went wrong. Check to make sure the URL you went to was
correct -- e-mail programs will sometimes split it into two
lines. If you still have issues, e-mail us to let us know what happened
at <a href="mailto:bugs@mitx.mit.edu">bugs@mitx.mit.edu</a>.</p>
<p>Or you can go back to the <a href="/">home page</a>.</p>
</div>
</section>
</%block>
\ No newline at end of file
......@@ -21,14 +21,12 @@
<%include file="widgets/header.html"/>
<%block name="content"></%block>
<script type="text/javascript" src="${static.url('js/vendor/jquery.min.js')}"></script>
<script type="text/javascript" src="${static.url('js/vendor/json2.js')}"></script>
<script type="text/javascript" src="${static.url('js/vendor/underscore-min.js')}"></script>
<script type="text/javascript" src="${static.url('js/vendor/backbone-min.js')}"></script>
<script type="text/javascript" src="${static.url('js/vendor/markitup/jquery.markitup.js')}"></script>
<script type="text/javascript" src="${static.url('js/vendor/markitup/sets/wiki/set.js"')}></script>
<script type="text/javascript" src="${static.url('js/vendor/markitup/sets/wiki/set.js')}"></script>
% if settings.MITX_FEATURES['USE_DJANGO_PIPELINE']:
<%static:js group='main'/>
% else:
......@@ -40,6 +38,9 @@
<script src="${static.url('js/vendor/jquery.cookie.js')}"></script>
<script src="${static.url('js/vendor/jquery.leanModal.min.js')}"></script>
<script src="${static.url('js/vendor/jquery.tablednd.js')}"></script>
<%block name="content"></%block>
</body>
</html>
......
Someone, hopefully you, signed up for an account for edX's on-line
offering of "${ course_title}" using this email address. If it was
you, and you'd like to activate and use your account, copy and paste
this address into your web browser's address bar:
% if is_secure:
https://${ site }/activate/${ key }
% else:
http://edx4edx.mitx.mit.edu/activate/${ key }
% endif
If you didn't request this, you don't need to do anything; you won't
receive any more email from us. Please do not reply to this e-mail; if
you require assistance, check the help section of the edX web site.
Your account for edX's on-line ${course_title} course
<%inherit file="base.html" />
\ No newline at end of file
<%inherit file="base.html" />
<%block name="title">Sign up</%block>
<%block name="content">
<section class="main-container">
<section class="main-content">
<header>
<h3>Sign Up for edX</h3>
<hr>
</header>
<div id="enroll">
<form id="enroll_form" method="post">
<div id="enroll_error" name="enroll_error"></div>
<label>E-mail</label>
<input name="email" type="email" placeholder="E-mail">
<label>Password</label>
<input name="password" type="password" placeholder="Password">
<label>Public Username</label>
<input name="username" type="text" placeholder="Public Username">
<label>Full Name</label>
<input name="name" type="text" placeholder="Full Name">
<label>Your Location</label>
<input name="location" type="text" placeholder="Your Location">
<label>Preferred Language</label>
<input name="language" type="text" placeholder="Preferred Language">
<label class="terms-of-service">
<input name="terms_of_service" type="checkbox" value="true">
I agree to the
<a href="#">Terms of Service</a>
</label>
<!-- no honor code for CMS, but need it because we're using the lms student object -->
<input name="honor_code" type="checkbox" value="true" checked="true" hidden="true">
<div class="submit">
<input name="submit" type="submit" value="Create My Account">
</div>
</form>
<section class="login-extra">
<p>
<span>Already have an account? <a href="#">Login.</a></span>
</p>
</section>
</div>
<script type="text/javascript">
(function() {
function getCookie(name) {
return $.cookie(name);
}
function postJSON(url, data, callback) {
$.ajax({type:'POST',
url: url,
dataType: 'json',
data: data,
success: callback,
headers : {'X-CSRFToken':getCookie('csrftoken')}
});
}
$('form#enroll_form').submit(function(e) {
e.preventDefault();
var submit_data = $('#enroll_form').serialize();
postJSON('/create_account',
submit_data,
function(json) {
if(json.success) {
$('#enroll').html(json.value);
} else {
$('#enroll_error').html(json.value).stop().css("background-color", "#933").animate({ backgroundColor: "#333"}, 2000);
}
}
);
});
})(this)
</script>
</section>
</section>
</%block>
from django.conf import settings
from django.conf.urls.defaults import patterns, include, url
import django.contrib.auth.views
# Uncomment the next two lines to enable the admin:
# from django.contrib import admin
# admin.autodiscover()
......@@ -13,6 +15,14 @@ urlpatterns = ('',
url(r'^github_service_hook$', 'github_sync.views.github_post_receive'),
)
# User creation and updating views
urlpatterns += (
url(r'^signup$', 'contentstore.views.signup'),
url(r'^create_account$', 'student.views.create_account'),
url(r'^activate/(?P<key>[^/]*)$', 'student.views.activate_account'),
)
if settings.DEBUG:
## Jasmine
urlpatterns=urlpatterns + (url(r'^_jasmine/', include('django_jasmine.urls')),)
......
......@@ -144,15 +144,15 @@ def create_account(request, post_override=None):
# Confirm we have a properly formed request
for a in ['username', 'email', 'password', 'location', 'language', 'name']:
if a not in post_vars:
js['value']="Error (401 {field}). E-mail us.".format(field=a)
js['value'] = "Error (401 {field}). E-mail us.".format(field=a)
return HttpResponse(json.dumps(js))
if post_vars['honor_code']!=u'true':
if 'honor_code' not in post_vars or post_vars['honor_code'] != u'true':
js['value']="To enroll, you must follow the honor code.".format(field=a)
return HttpResponse(json.dumps(js))
if post_vars['terms_of_service']!=u'true':
if 'terms_of_service' not in post_vars or post_vars['terms_of_service'] != u'true':
js['value']="You must accept the terms of service.".format(field=a)
return HttpResponse(json.dumps(js))
......@@ -162,7 +162,7 @@ def create_account(request, post_override=None):
# this is a good idea
# TODO: Check password is sane
for a in ['username', 'email', 'name', 'password', 'terms_of_service', 'honor_code']:
if len(post_vars[a])<2:
if len(post_vars[a]) < 2:
error_str = {'username' : 'Username of length 2 or greater',
'email' : 'Properly formatted e-mail',
'name' : 'Your legal name ',
......@@ -184,25 +184,23 @@ def create_account(request, post_override=None):
js['value']="Username should only consist of A-Z and 0-9.".format(field=a)
return HttpResponse(json.dumps(js))
u=User(username=post_vars['username'],
email=post_vars['email'],
is_active=False)
u = User(username=post_vars['username'],
email=post_vars['email'],
is_active=False)
u.set_password(post_vars['password'])
r=Registration()
r = Registration()
# TODO: Rearrange so that if part of the process fails, the whole process fails.
# Right now, we can have e.g. no registration e-mail sent out and a zombie account
try:
u.save()
except IntegrityError:
# Figure out the cause of the integrity error
if len(User.objects.filter(username=post_vars['username']))>0:
js['value']="An account with this username already exists."
if len(User.objects.filter(username=post_vars['username'])) > 0:
js['value'] = "An account with this username already exists."
return HttpResponse(json.dumps(js))
if len(User.objects.filter(email=post_vars['email']))>0:
js['value']="An account with this e-mail already exists."
if len(User.objects.filter(email=post_vars['email'])) > 0:
js['value'] = "An account with this e-mail already exists."
return HttpResponse(json.dumps(js))
raise
......@@ -210,36 +208,37 @@ def create_account(request, post_override=None):
r.register(u)
up = UserProfile(user=u)
up.name=post_vars['name']
up.language=post_vars['language']
up.location=post_vars['location']
up.name = post_vars['name']
up.language = post_vars['language']
up.location = post_vars['location']
up.save()
d={'name':post_vars['name'],
'key':r.activation_key,
'course_title' : settings.COURSE_TITLE,
}
# TODO (vshnayder): the LMS should probably allow signups without a particular course too
d = {'name': post_vars['name'],
'key': r.activation_key,
'course_title': getattr(settings, 'COURSE_TITLE', ''),
}
subject = render_to_string('emails/activation_email_subject.txt',d)
subject = render_to_string('emails/activation_email_subject.txt', d)
# Email subject *must not* contain newlines
subject = ''.join(subject.splitlines())
message = render_to_string('emails/activation_email.txt',d)
message = render_to_string('emails/activation_email.txt', d)
try:
if settings.MITX_FEATURES.get('REROUTE_ACTIVATION_EMAIL'):
dest_addr = settings.MITX_FEATURES['REROUTE_ACTIVATION_EMAIL']
message = "Activation for %s (%s): %s\n" % (u,u.email,up.name) + '-'*80 + '\n\n' + message
message = "Activation for %s (%s): %s\n" % (u,u.email,up.name) + '-' * 80 + '\n\n' + message
send_mail(subject, message, settings.DEFAULT_FROM_EMAIL, [dest_addr], fail_silently=False)
elif not settings.GENERATE_RANDOM_USER_CREDENTIALS:
res=u.email_user(subject, message, settings.DEFAULT_FROM_EMAIL)
res = u.email_user(subject, message, settings.DEFAULT_FROM_EMAIL)
except:
log.exception(sys.exc_info())
js['value']='Could not send activation e-mail.'
js['value'] = 'Could not send activation e-mail.'
return HttpResponse(json.dumps(js))
js={'success':True,
'value':render_to_string('registration/reg_complete.html', {'email':post_vars['email'],
'csrf':csrf(request)['csrf_token']})}
js={'success': True,
'value': render_to_string('registration/reg_complete.html', {'email': post_vars['email'],
'csrf': csrf(request)['csrf_token']})}
return HttpResponse(json.dumps(js), mimetype="application/json")
def create_random_account(create_account_function):
......
......@@ -179,6 +179,15 @@ class LoncapaProblem(object):
return {'score': correct,
'total': self.get_max_score()}
def update_score(self, score_msg):
newcmap = CorrectMap()
for responder in self.responders.values():
if hasattr(responder,'update_score'): # Is this the best way to implement 'update_score' for CodeResponse?
results = responder.update_score(score_msg)
newcmap.update(results)
self.correct_map = newcmap
return newcmap
def grade_answers(self, answers):
'''
Grade student responses. Called by capa_module.check_problem.
......
......@@ -18,6 +18,7 @@ import re
import requests
import traceback
import abc
import time
# specific library imports
from calc import evaluator, UndefinedVariable
......@@ -693,6 +694,124 @@ class SymbolicResponse(CustomResponse):
#-----------------------------------------------------------------------------
class CodeResponse(LoncapaResponse):
'''
Grade student code using an external server
'''
response_tag = 'coderesponse'
allowed_inputfields = ['textline', 'textbox']
def setup_response(self):
xml = self.xml
self.url = xml.get('url') or "http://ec2-50-16-59-149.compute-1.amazonaws.com/xqueue/submit/" # FIXME -- hardcoded url
answer = xml.find('answer')
if answer is not None:
answer_src = answer.get('src')
if answer_src is not None:
self.code = self.system.filesystem.open('src/'+answer_src).read()
else:
self.code = answer.text
else: # no <answer> stanza; get code from <script>
self.code = self.context['script_code']
if not self.code:
msg = '%s: Missing answer script code for externalresponse' % unicode(self)
msg += "\nSee XML source line %s" % getattr(self.xml,'sourceline','<unavailable>')
raise LoncapaProblemError(msg)
self.tests = xml.get('tests')
def get_score(self, student_answers):
idset = sorted(self.answer_ids)
try:
submission = [student_answers[k] for k in idset]
except Exception as err:
log.error('Error in CodeResponse %s: cannot get student answer for %s; student_answers=%s' % (err, self.answer_ids, student_answers))
raise Exception(err)
self.context.update({'submission': submission})
extra_payload = {'edX_student_response': json.dumps(submission)}
# Should do something -- like update the problem state -- based on the queue response
r = self._send_to_queue(extra_payload)
return CorrectMap()
def update_score(self, score_msg):
# Parse 'score_msg' as XML
try:
rxml = etree.fromstring(score_msg)
except Exception as err:
msg = 'Error in CodeResponse %s: cannot parse response from xworker r.text=%s' % (err, score_msg)
raise Exception(err)
# The following process is lifted directly from ExternalResponse
idset = sorted(self.answer_ids)
cmap = CorrectMap()
ad = rxml.find('awarddetail').text
admap = {'EXACT_ANS':'correct', # TODO: handle other loncapa responses
'WRONG_FORMAT': 'incorrect',
}
self.context['correct'] = ['correct']
if ad in admap:
self.context['correct'][0] = admap[ad]
# create CorrectMap
for key in idset:
idx = idset.index(key)
msg = rxml.find('message').text.replace('&nbsp;','&#160;') if idx==0 else None
cmap.set(key, self.context['correct'][idx], msg=msg)
return cmap
# CodeResponse differentiates from ExternalResponse in the behavior of 'get_answers'. CodeResponse.get_answers
# does NOT require a queue submission, and the answer is computed (extracted from problem XML) locally.
def get_answers(self):
# Extract the CodeResponse answer from XML
penv = {}
penv['__builtins__'] = globals()['__builtins__']
try:
exec(self.code,penv,penv)
except Exception as err:
log.error('Error in CodeResponse %s: Error in problem reference code' % err)
raise Exception(err)
try:
ans = penv['answer']
except Exception as err:
log.error('Error in CodeResponse %s: Problem reference code does not define answer in <answer>...</answer>' % err)
raise Exception(err)
anshtml = '<font color="blue"><span class="code-answer"><br/><pre>%s</pre><br/></span></font>' % ans
return dict(zip(self.answer_ids,[anshtml]))
# CodeResponse._send_to_queue implements the same interface as defined for ExternalResponse's 'get_score'
def _send_to_queue(self, extra_payload):
# Prepare payload
xmlstr = etree.tostring(self.xml, pretty_print=True)
header = { 'return_url': self.system.xqueue_callback_url }
header.update({'timestamp': time.time()})
payload = {'xqueue_header': json.dumps(header), # 'xqueue_header' should eventually be derived from xqueue.queue_common.HEADER_TAG or something similar
'xml': xmlstr,
'edX_cmd': 'get_score',
'edX_tests': self.tests,
'processor': self.code,
}
payload.update(extra_payload)
# Contact queue server
try:
r = requests.post(self.url, data=payload)
except Exception as err:
msg = "Error in CodeResponse %s: cannot connect to queue server url=%s" % (err, self.url)
log.error(msg)
raise Exception(msg)
return r
#-----------------------------------------------------------------------------
class ExternalResponse(LoncapaResponse):
'''
Grade the students input using an external server.
......@@ -1072,5 +1191,5 @@ class ImageResponse(LoncapaResponse):
# TEMPORARY: List of all response subclasses
# FIXME: To be replaced by auto-registration
__all__ = [ NumericalResponse, FormulaResponse, CustomResponse, SchematicResponse, MultipleChoiceResponse, TrueFalseResponse, ExternalResponse, ImageResponse, OptionResponse, SymbolicResponse, StringResponse ]
__all__ = [ CodeResponse, NumericalResponse, FormulaResponse, CustomResponse, SchematicResponse, MultipleChoiceResponse, TrueFalseResponse, ExternalResponse, ImageResponse, OptionResponse, SymbolicResponse, StringResponse ]
......@@ -275,6 +275,7 @@ class CapaModule(XModule):
'problem_reset': self.reset_problem,
'problem_save': self.save_problem,
'problem_show': self.get_answer,
'score_update': self.update_score,
}
if dispatch not in handlers:
......@@ -321,6 +322,12 @@ class CapaModule(XModule):
#TODO: Not 404
raise self.system.exception404
def update_score(self, get):
score_msg = get['response']
self.lcp.update_score(score_msg)
return dict() # No AJAX return is needed
def get_answer(self, get):
'''
For the "show answer" button.
......
......@@ -102,10 +102,25 @@ environments, defined in `cms/envs`.
- Core rendering path: Still TBD
### Static file processing
- CSS -- we use a superset of CSS called SASS. It supports nice things like includes and variables, and compiles to CSS. The compiler is called `sass`.
- javascript -- we use coffeescript, which compiles to js, and is much nicer to work with. Look for `*.coffee` files. We use _jasmine_ for testing js.
- _mako_ -- we use this for templates, and have a fork called mitxmako (TODO: why did we have to fork mako?)
We use a fork of django-pipeline to make sure that the js and css always reflect the latest `*.coffee` and `*.sass` files (We're hoping to get our changes merged in the official version soon). This works differently in development and production. Test uses the production settings.
In production, the django `collectstatic` command recompiles everything and puts all the generated static files in a static/ dir. A starting point in the code is `django-pipeline/pipeline/packager.py:pack`.
In development, we don't use collectstatic, instead accessing the files in place. The auto-compilation is run via `common/djangoapps/pipeline_mako/templates/static_content.html`. Details: templates include `<%namespace name='static' file='static_content.html'/>`, then something like `<%static:css group='application'/>` to call the functions in `common/djangoapps/pipeline_mako/__init__.py`, which call the `django-pipeline` compilers.
### Other modules
- Wiki -- in `lms/djangoapps/simplewiki`. Has some markdown extentions for embedding circuits, videos, etc.
## Testing
See `testing.md`.
......
......@@ -28,7 +28,7 @@ class I4xSystem(object):
'''
def __init__(self, ajax_url, track_function,
get_module, render_template, replace_urls,
user=None, filestore=None):
user=None, filestore=None, xqueue_callback_url=None):
'''
Create a closure around the system environment.
......@@ -48,6 +48,7 @@ class I4xSystem(object):
that capa_module can use to fix up the static urls in ajax results.
'''
self.ajax_url = ajax_url
self.xqueue_callback_url = xqueue_callback_url
self.track_function = track_function
self.filestore = filestore
self.get_module = get_module
......@@ -207,6 +208,7 @@ def get_module(user, request, location, student_module_cache, position=None):
# Setup system context for module instance
ajax_url = settings.MITX_ROOT_URL + '/modx/' + descriptor.location.url() + '/'
xqueue_callback_url = settings.MITX_ROOT_URL + '/xqueue/' + user.username + '/' + descriptor.location.url() + '/'
def _get_module(location):
(module, _, _, _) = get_module(user, request, location, student_module_cache, position)
......@@ -218,6 +220,7 @@ def get_module(user, request, location, student_module_cache, position=None):
system = I4xSystem(track_function=make_track_function(request),
render_template=render_to_string,
ajax_url=ajax_url,
xqueue_callback_url=xqueue_callback_url,
# TODO (cpennington): Figure out how to share info between systems
filestore=descriptor.system.resources_fs,
get_module=_get_module,
......@@ -321,6 +324,53 @@ def add_histogram(module):
module.get_html = get_html
return module
# THK: TEMPORARY BYPASS OF AUTH!
from django.views.decorators.csrf import csrf_exempt
from django.contrib.auth.models import User
@csrf_exempt
def xqueue_callback(request, username, id, dispatch):
# Parse xqueue response
get = request.POST.copy()
try:
header = json.loads(get.pop('xqueue_header')[0]) # 'dict'
except Exception as err:
msg = "Error in xqueue_callback %s: Invalid return format" % err
raise Exception(msg)
# Should proceed only when the request timestamp is more recent than problem timestamp
timestamp = header['timestamp']
# Retrieve target StudentModule
user = User.objects.get(username=username)
student_module_cache = StudentModuleCache(user, modulestore().get_item(id))
instance, instance_module, shared_module, module_type = get_module(request.user, request, id, student_module_cache)
if instance_module is None:
log.debug("Couldn't find module '%s' for user '%s'",
id, request.user)
raise Http404
oldgrade = instance_module.grade
old_instance_state = instance_module.state
# We go through the "AJAX" path
# So far, the only dispatch from xqueue will be 'score_update'
try:
ajax_return = instance.handle_ajax(dispatch, get) # Can ignore the "ajax" return in 'xqueue_callback'
except:
log.exception("error processing ajax call")
raise
# Save state back to database
instance_module.state = instance.get_instance_state()
if instance.get_score():
instance_module.grade = instance.get_score()['score']
if instance_module.grade != oldgrade or instance_module.state != old_instance_state:
instance_module.save()
return HttpResponse("")
def modx_dispatch(request, dispatch=None, id=None):
''' Generic view for extensions. This is where AJAX calls go.
......@@ -339,7 +389,7 @@ def modx_dispatch(request, dispatch=None, id=None):
student_module_cache = StudentModuleCache(request.user, modulestore().get_item(id))
instance, instance_module, shared_module, module_type = get_module(request.user, request, id, student_module_cache)
if instance_module is None:
log.debug("Couldn't find module '%s' for user '%s'",
id, request.user)
......
......@@ -9,15 +9,21 @@ from django.core.context_processors import csrf
from django.conf import settings
#valid_templates=['index.html', 'staff.html', 'info.html', 'credits.html']
valid_templates=['index.html',
'tos.html',
'privacy.html',
'honor.html',
'copyright.html',
valid_templates=['index.html',
'tos.html',
'privacy.html',
'honor.html',
'help.html',
'copyright.html',
'404.html',
'mitx_help.html']
'mitx_help.html',
'pressrelease.html',
'about.html',
'faq.html',
'press.html',
'contact.html']
if settings.STATIC_GRAB:
if settings.STATIC_GRAB:
valid_templates = valid_templates+['server-down.html',
'server-error.html'
'server-overloaded.html',
......@@ -27,7 +33,7 @@ if settings.STATIC_GRAB:
'6002x-press-release.html'
]
def index(request, template):
def index(request, template):
csrf_token = csrf(request)['csrf_token']
if template in valid_templates:
return render_to_response(template, {'error' : '',
......@@ -37,7 +43,7 @@ def index(request, template):
valid_auth_templates=['help.html']
def auth_index(request, template):
def auth_index(request, template):
if not request.user.is_authenticated():
return redirect('/')
......
"""
This file demonstrates writing tests using the unittest module. These will pass
when you run "manage.py test".
Replace this with more appropriate tests for your application.
"""
from django.test import TestCase
class SimpleTest(TestCase):
def test_basic_addition(self):
"""
Tests that 1 + 1 always equals 2.
"""
self.assertEqual(1 + 1, 2)
......@@ -10,6 +10,7 @@ sessions. Assumes structure:
from .common import *
from .logsettings import get_logger_config
import os
from path import path
INSTALLED_APPS = [
app
......@@ -28,6 +29,9 @@ TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'
# Local Directories
TEST_ROOT = path("test_root")
# Want static files in the same dir for running on jenkins.
STATIC_ROOT = TEST_ROOT / "staticfiles"
COURSES_ROOT = TEST_ROOT / "data"
DATA_DIR = COURSES_ROOT
MAKO_TEMPLATES['course'] = [DATA_DIR]
......@@ -77,9 +81,24 @@ SECRET_KEY = '85920908f28904ed733fe576320db18cabd7b6cd'
############################ FILE UPLOADS (ASKBOT) #############################
DEFAULT_FILE_STORAGE = 'django.core.files.storage.FileSystemStorage'
MEDIA_ROOT = PROJECT_ROOT / "uploads"
MEDIA_ROOT = TEST_ROOT / "uploads"
MEDIA_URL = "/static/uploads/"
STATICFILES_DIRS.append(("uploads", MEDIA_ROOT))
new_staticfiles_dirs = []
# Strip out any static files that aren't in the repository root
# so that the tests can run with only the mitx directory checked out
for static_dir in STATICFILES_DIRS:
# Handle both tuples and non-tuple directory definitions
try:
_, data_dir = static_dir
except ValueError:
data_dir = static_dir
if not data_dir.startswith(REPO_ROOT):
new_staticfiles_dirs.append(static_dir)
STATICFILES_DIRS = new_staticfiles_dirs
FILE_UPLOAD_TEMP_DIR = PROJECT_ROOT / "uploads"
FILE_UPLOAD_HANDLERS = (
'django.core.files.uploadhandler.MemoryFileUploadHandler',
......
$(document).ready(function () {
$('a#login').click(function() {
$('.modal.login-modal').addClass("visible");
$('.modal-overlay').addClass("visible");
});
$('div.close-modal').click(function() {
$('.modal.login-modal').removeClass("visible");
$('.modal-overlay').removeClass("visible");
});
(function($){
$.fn.extend({
leanModal: function(options) {
var defaults = {
top: 100,
overlay: 0.5,
closeButton: null,
position: 'fixed'
}
$('a#signup').click(function() {
$('.modal.signup-modal').addClass("visible");
$('.modal-overlay').addClass("visible");
});
$('div.close-modal').click(function() {
$('.modal.signup-modal').removeClass("visible");
$('.modal-overlay').removeClass("visible");
});
var overlay = $("<div id='lean_overlay'></div>");
$("body").append(overlay);
$('.hero').click(function() {
$('.modal.video-modal').addClass("visible");
$('.modal-overlay').addClass("visible");
});
$('div.close-modal').click(function() {
$('.modal.video-modal').removeClass("visible");
$('.modal-overlay').removeClass("visible");
options = $.extend(defaults, options);
return this.each(function() {
var o = options;
$(this).click(function(e) {
$(".modal").hide();
var modal_id = $(this).attr("href");
$("#lean_overlay").click(function() {
close_modal(modal_id);
});
$(o.closeButton).click(function() {
close_modal(modal_id);
});
var modal_height = $(modal_id).outerHeight();
var modal_width = $(modal_id).outerWidth();
$('#lean_overlay').css({ 'display' : 'block', opacity : 0 });
$('#lean_overlay').fadeTo(200,o.overlay);
$('iframe', modal_id).attr('src', $('iframe', modal_id).data('src'));
$(modal_id).css({
'display' : 'block',
'position' : o.position,
'opacity' : 0,
'z-index': 11000,
'left' : 50 + '%',
'margin-left' : -(modal_width/2) + "px",
'top' : o.top + "px"
})
$(modal_id).fadeTo(200,1);
e.preventDefault();
});
});
function close_modal(modal_id){
$("#lean_overlay").fadeOut(200);
$('iframe', modal_id).attr('src', '');
$(modal_id).css({ 'display' : 'none' });
}
}
});
});
$("a[rel*=leanModal]").each(function(){
$(this).leanModal({ top : 120, overlay: 1, closeButton: ".close-modal", position: 'absolute' });
embed = $($(this).attr('href')).find('iframe')
if(embed.length > 0) {
embed.data('src', embed.attr('src') + '?autoplay=1');
embed.attr('src', '');
}
});
})(jQuery);
......@@ -15,7 +15,8 @@
a {
border-bottom: 3px solid transparent;
color: $lighter-base-font-color;
font: italic 1.2rem/1.4rem $serif;
font-family: $serif;
font-style: italic;
@include inline-block;
letter-spacing: 1px;
margin: 0px 15px;
......@@ -26,6 +27,7 @@
&:hover, &.active {
border-color: rgb(200,200,200);
color: $base-font-color;
text-decoration: none;
}
}
}
......@@ -70,10 +72,6 @@
}
&.right {
h2 {
text-align: right;
}
.photo {
float: right;
margin-left: flex-gutter();
......@@ -87,27 +85,26 @@
}
.faq {
display: none;
@include clearfix;
nav.categories {
border-right: 1px solid rgb(220,220,220);
border: 1px solid rgb(220,220,220);
@include box-sizing(border-box);
float: left;
margin-right: flex-gutter();
padding-right: 20px;
margin-left: flex-gutter();
padding: 20px;
width: flex-grid(3);
a {
display: block;
letter-spacing: 1px;
margin-right: -20px;
padding: 10px 20px 10px 0;
text-align: right;
text-transform: uppercase;
margin: 0px -20px;
padding: 12px 0px 12px 20px;
text-align: left;
&:hover {
background: rgb(245,245,245);
text-decoration: none;
}
}
}
......@@ -135,7 +132,7 @@
h3 {
font-family: $sans-serif;
font-weight: bold;
font-weight: 700;
margin-bottom: 15px;
}
}
......@@ -143,7 +140,26 @@
}
.press {
display: none;
.press-resources {
@include clearfix;
margin-bottom: 60px;
.pressreleases, .identity-assets {
background: rgb(245,245,245);
border: 1px solid rgb(200,200,200);
@include box-sizing(border-box);
@include border-radius(4px);
float: left;
padding: 20px 30px;
text-align: center;
width: flex-grid(6);
}
.pressreleases {
margin-right: flex-gutter();
}
}
.press-story {
border-bottom: 1px solid rgb(220,220,220);
......@@ -179,14 +195,17 @@
width: flex-grid(10);
header {
margin-bottom: 15px;
margin-bottom: 10px;
h3 {
font-family: $sans-serif;
font-weight: bold;
font-weight: 700;
margin-bottom: 5px;
}
a {
span.post-date {
color: $lighter-base-font-color;
margin-right: 10px;
}
}
}
......@@ -194,7 +213,6 @@
}
.contact {
display: none;
@include clearfix;
margin: 0 auto;
width: flex-grid(10);
......@@ -202,14 +220,32 @@
.map {
background: rgb(245,245,245);
float: left;
height: 180px;
height: 280px;
margin-right: flex-gutter();
overflow: hidden;
width: flex-grid(6);
img {
min-height: 100%;
max-width: 100%;
}
}
.address {
.contacts {
@include box-sizing(border-box);
float: left;
padding-left: 40px;
width: flex-grid(6);
ul {
list-style: none;
margin: 0px;
padding: 0px;
li {
margin-bottom: 10px;
}
}
}
}
}
......@@ -75,7 +75,10 @@
h1 {
color: $base-font-color;
font: italic bold 2.4rem/3rem $sans-serif;
font-family: $sans-serif;
font-style: italic;
font-weight: 800;
letter-spacing: 0px;
text-transform: none;
}
......
......@@ -14,7 +14,7 @@
@include border-radius(4px);
@include box-sizing(border-box);
color: $base-font-color;
font: bold 1.4rem/1.6rem $sans-serif;
font: 700 1.2em/1.2em $sans-serif;
margin: 0px;
overflow: hidden;
padding: 15px 10px 17px;
......@@ -44,12 +44,12 @@
p {
color: $lighter-base-font-color;
font: 300 1.2rem/1.6rem $sans-serif;
font-family: $sans-serif;
text-shadow: 0 1px rgba(255,255,255, 0.8);
span {
font-weight: 700;
margin-left: 5px;
margin-left: 10px;
text-transform: none;
}
}
......@@ -64,43 +64,52 @@
margin: 0px;
width: flex-grid(9);
> header {
border-bottom: 1px solid rgb(210,210,210);
margin-bottom: 30px;
}
.empty-dashboard-message {
border-top: 1px solid rgb(210,210,210);
padding: 80px 0px;
text-align: center;
p {
color: $lighter-base-font-color;
font-style: italic;
margin-bottom: 20px;
text-shadow: 0 1px rgba(255,255,255, 0.6);
-webkit-font-smoothing: antialiased;
}
a {
background: rgb(240,240,240);
@include background-image(linear-gradient(-90deg, rgb(245,245,245) 0%, rgb(243,243,243) 50%, rgb(237,237,237) 50%, rgb(235,235,235) 100%));
border: 1px solid rgb(220,220,220);
@include border-radius(4px);
@include box-shadow(0 1px 8px 0 rgba(0,0,0, 0.1));
@include box-sizing(border-box);
color: $base-font-color;
font: 300 1.2rem/1.6rem $sans-serif;
@include inline-block;
margin-left: 5px;
padding: 5px 10px;
text-shadow: 0 1px rgba(255,255,255, 0.6);
a {
background: rgb(240,240,240);
@include background-image(linear-gradient(-90deg, rgb(245,245,245) 0%, rgb(243,243,243) 50%, rgb(237,237,237) 50%, rgb(235,235,235) 100%));
border: 1px solid rgb(220,220,220);
@include border-radius(4px);
@include box-shadow(0 1px 8px 0 rgba(0,0,0, 0.1));
@include box-sizing(border-box);
color: $base-font-color;
font-family: $sans-serif;
@include inline-block;
letter-spacing: 1px;
margin-left: 5px;
padding: 5px 10px;
text-shadow: 0 1px rgba(255,255,255, 0.6);
&:hover {
color: $blue;
text-decoration: none;
}
}
}
.my-course {
background: rgb(250,250,250);
@include background-image(linear-gradient(-90deg, rgb(253,253,253), rgb(243,243,243)));
@include background-image(linear-gradient(-90deg, rgb(253,253,253), rgb(240,240,240)));
border: 1px solid rgb(190,190,190);
@include border-radius(3px);
@include box-shadow(0 1px 8px 0 rgba(0,0,0, 0.1), inset 0 -1px 0 0 rgba(255,255,255, 0.8), inset 0 1px 0 0 rgba(255,255,255, 0.8));
@include box-sizing(border-box);
@include clearfix;
font-size: 0em;
margin-right: flex-gutter();
margin-bottom: 25px;
overflow: hidden;
......@@ -161,7 +170,7 @@
&:hover {
.shade {
background: rgba(255,255,255, 0.1);
background: rgba(255,255,255, 0.3);
@include background-image(linear-gradient(-90deg, rgba(255,255,255, 0.3) 0%,
rgba(0,0,0, 0.3) 100%));
}
......@@ -179,80 +188,91 @@
> hgroup {
border-bottom: 1px solid rgb(210,210,210);
@include box-shadow(0 1px 0 0 rgba(255,255,255, 0.6));
margin-bottom: 20px;
padding: 15px 0px;
padding: 12px 0px;
width: 100%;
h2 {
a.university {
background: rgba(255,255,255, 1);
border: 1px solid rgb(180,180,180);
@include border-radius(3px);
@include box-shadow(inset 0 0 3px 0 rgba(0,0,0, 0.2), 0 1px 0 0 rgba(255,255,255, 0.6));
color: $lighter-base-font-color;
display: block;
font-style: italic;
font-weight: 800;
@include inline-block;
margin-right: 10px;
padding: 5px 10px;
vertical-align: middle;
&:hover {
color: $blue;
text-decoration: none;
}
}
h3 {
@include inline-block;
margin-bottom: 0px;
vertical-align: middle;
a {
color: $base-font-color;
font: 800 1.6rem/2rem $sans-serif;
font-weight: 700;
text-shadow: 0 1px rgba(255,255,255, 0.6);
text-overflow: ellipsis;
white-space: nowrap;
&:hover {
color: $blue;
text-decoration: underline;
}
}
}
}
h3 {
@include inline-block;
margin-right: 10px;
vertical-align: middle;
a {
background: rgba(255,255,255, 1);
border: 1px solid rgb(180,180,180);
@include border-radius(3px);
@include box-shadow(inset 0 0 3px 0 rgba(0,0,0, 0.2), 0 1px 0 0 rgba(255,255,255, 0.6));
color: $lighter-base-font-color;
display: block;
font: italic 800 1.2rem/1.6rem $sans-serif;
padding: 5px 10px;
&:hover {
color: $blue;
}
}
.course-status {
background: $yellow;
border: 1px solid rgb(200,200,200);
@include box-shadow(0 1px 0 0 rgba(255,255,255, 0.6));
margin-top: 16px;
padding: 5px;
p {
color: $lighter-base-font-color;
font-style: italic;
letter-spacing: 1px;
text-align: center;
}
}
.meta {
@include clearfix;
margin-top: 22px;
position: relative;
@include transition(opacity, 0.15s, linear);
width: 100%;
.course-work-icon {
background: rgb(200,200,200);
float: left;
font: 300 1.2rem/1.6rem $sans-serif;
height: 22px;
width: 22px;
}
.complete {
float: right;
padding-top: 2px;
p {
color: $lighter-base-font-color;
font: italic 1.2rem/1.4rem $serif;
font-style: italic;
@include inline-block;
text-align: right;
text-shadow: 0 1px rgba(255,255,255, 0.6);
-webkit-font-smoothing: antialiased;
.completeness {
color: $base-font-color;
font: 700 1.2rem/1.4rem $sans-serif;
font-weight: 700;
margin-right: 5px;
}
}
......@@ -262,7 +282,7 @@
@include box-shadow(0 1px 0 0 rgba(255,255,255, 0.6));
left: 40px;
position: absolute;
right: 110px;
right: 130px;
.meter {
background: rgb(245,245,245);
......@@ -276,7 +296,7 @@
width: 100%;
.meter-fill {
background: rgb(120,120,120);
background: $blue;
@include background-image(linear-gradient(-45deg, rgba(255,255,255, 0.15) 25%,
transparent 25%,
transparent 50%,
......@@ -299,23 +319,17 @@
}
&:hover {
.edit {
background: rgb(220,220,220);
border-color: rgb(190,190,190);
}
.cover {
opacity: 1;
.shade {
background: rgba(255,255,255, 0.1);
@include background-image(linear-gradient(-90deg, rgba(255,255,255, 0.3) 0%,
rgba(0,0,0, 0.3) 100%));
}
.shade, .arrow {
.arrow {
opacity: 1;
}
}
.meta {
opacity: 0.9;
}
}
}
}
......
.home {
margin: 0px 0px 100px;
> header {
//background: rgb(250,250,250);
@include background-image(url('/static/images/shot-5-large.jpg'));
background-size: cover;
border-bottom: 1px solid rgb(80,80,80);
@include box-shadow(0 1px 0 0 rgba(255,255,255, 0.9), inset 0 -1px 5px 0 rgba(0,0,0, 0.1));
@include clearfix;
margin-top: -69px;
min-height: 300px;
padding: 129px 0px 50px;
width: flex-grid(12);
.inner-wrapper {
max-width: 1200px;
margin: 0 auto;
position: relative;
}
h1 {
color: rgb(255,255,255);
text-align: center;
}
a {
@include button(shiny, $blue);
@include box-sizing(border-box);
@include border-radius(3px);
display: block;
font: italic 1.4rem/1.6rem $serif;
letter-spacing: 1px;
margin: 0 auto;
padding: 15px 0px;
text-transform: uppercase;
text-align: center;
-webkit-font-smoothing: antialiased;
width: flex-grid(3);
&:hover {
color: rgb(255,255,255);
}
}
}
.university-partners {
@include background-image(linear-gradient(180deg, rgba(245,245,245, 0) 0%,
rgba(245,245,245, 1) 50%,
rgba(245,245,245, 0) 100%));
border-bottom: 1px solid rgb(210,210,210);
margin-bottom: 0px;
overflow: hidden;
position: relative;
width: flex-grid(12);
&::before {
@extend .faded-hr-divider-medium;
content: "";
display: block;
}
&::after {
@extend .faded-hr-divider-medium;
content: "";
display: block;
}
.partners {
font-size: 0em;
margin: 0 auto;
padding: 20px 0px;
text-align: center;
li.partner {
@include inline-block;
padding: 0px 30px;
position: relative;
vertical-align: middle;
&::before {
@extend .faded-vertical-divider;
content: "";
display: block;
height: 80px;
right: 0px;
position: absolute;
top: -5px;
width: 1px;
}
&::after {
@extend .faded-vertical-divider-light;
content: "";
display: block;
height: 80px;
right: 1px;
position: absolute;
top: -5px;
width: 1px;
}
&:last-child {
&::before {
display: none;
}
&::after {
display: none;
}
}
}
a {
@include transition(all, 0.25s, ease-in-out);
&::before {
@include background-image(radial-gradient(50% 50%, circle closest-side, rgba(255,255,255, 1) 0%, rgba(255,255,255, 0) 100%));
content: "";
display: block;
height: 200px;
left: 50%;
margin-left: -100px;
margin-top: -100px;
opacity: 0;
width: 200px;
position: absolute;
@include transition(all, 0.25s, ease-in-out);
top: 50%;
z-index: 1;
}
.name {
left: 0px;
position: absolute;
text-align: center;
bottom: -60px;
@include transition(all, 0.25s, ease-in-out);
width: 100%;
z-index: 2;
span {
color: $base-font-color;
font: 800 italic 2rem/2.2rem $sans-serif;
text-shadow: 0 1px rgba(255,255,255, 0.6);
@include transition(all, 0.15s, ease-in-out);
&:hover {
color: $lighter-base-font-color;
}
}
}
img {
max-width: 160px;
position: relative;
@include transition(all, 0.25s, ease-in-out);
vertical-align: middle;
z-index: 2;
}
&:hover {
&::before {
opacity: 1;
}
.name {
bottom: 20px;
}
img {
top: -100px;
}
}
}
}
}
.highlighted-courses {
border-bottom: 1px solid rgb(210,210,210);
@include box-sizing(border-box);
margin-bottom: 60px;
width: flex-grid(12);
> h2 {
@include background-image(linear-gradient(-90deg, rgb(250,250,250), rgb(230,230,230)));
border: 1px solid rgb(200,200,200);
@include border-radius(4px);
border-top-color: rgb(190,190,190);
@include box-shadow(inset 0 0 0 1px rgba(255,255,255, 0.4), 0 0px 12px 0 rgba(0,0,0, 0.2));
color: $lighter-base-font-color;
letter-spacing: 1px;
margin-bottom: 0px;
margin-top: -15px;
padding: 15px 10px;
text-align: center;
text-transform: uppercase;
text-shadow: 0 1px rgba(255,255,255, 0.6);
.lowercase {
text-transform: none;
}
}
}
.more-info {
margin-bottom: 60px;
width: flex-grid(12);
h2 {
color: $lighter-base-font-color;
font: normal 1.4rem/1.8rem $serif;
letter-spacing: 1px;
margin-bottom: 20px;
}
.news {
font-size: 0em;
width: flex-grid(12);
> article {
background: rgb(240,240,240);
@include inline-block;
height: 150px;
margin-right: flex-gutter();
width: flex-grid(3);
&:last-child {
margin-right: 0px;
}
}
}
}
.social-media {
background: rgb(245,245,245);
border: 1px solid rgb(220,220,220);
@include border-radius(4px);
@include box-shadow(inset 0 1px 2px 0 rgba(0,0,0, 0.1));
height: 200px;
width: flex-grid(12);
h2 {
color: $lighter-base-font-color;
font: normal 1.6rem/2rem $sans-serif;
padding-top: 80px;
text-align: center;
}
}
}
......@@ -7,7 +7,7 @@
.message {
@include clearfix;
margin-bottom: 100px;
margin-bottom: 80px;
position: relative;
.photo {
......@@ -30,49 +30,35 @@
.jobs-wrapper {
@include clearfix;
float: left;
padding-top: 80px;
width: flex-grid(12);
> h2 {
border-bottom: 1px solid rgb(220,220,220);
display: none;
margin-bottom: 60px;
padding-bottom: 20px;
}
.jobs-sidebar {
@include box-sizing(border-box);
border-left: 1px solid rgb(220,220,220);
border: 1px solid rgb(220,220,220);
float: left;
padding-bottom: 20px;
padding-left: 20px;
padding: 20px;
width: flex-grid(3);
nav {
margin-bottom: 40px;
ol {
@include clearfix;
li {
float: left;
margin-right: flex-gutter();
width: flex-grid(12);
&:nth-child(4n) {
margin-right: 0px;
}
a {
display: block;
letter-spacing: 1px;
margin-left: -20px;
padding: 10px 0 10px 20px;
position: relative;
text-transform: uppercase;
&:hover {
background: rgb(245,245,245);
}
}
a {
display: block;
letter-spacing: 1px;
margin: 0px -20px;
padding: 12px 0px 12px 20px;
text-align: left;
&:hover {
background: rgb(245,245,245);
text-decoration: none;
}
}
}
......@@ -105,7 +91,7 @@
h3 {
font-family: $sans-serif;
font-weight: bold;
font-weight: 700;
margin-bottom: 15px;
}
}
......
.pressrelease {
background: rgb(250,250,250);
.container {
padding: 60px 0 120px;
h1 + hr {
margin-bottom: 60px;
}
h3 + hr {
margin-bottom: 60px;
}
h3 {
color: $lighter-base-font-color;
font-style: italic;
margin-bottom: 30px;
text-align: center;
}
> article {
border: 1px solid rgb(220,220,220);
@include border-radius(10px);
@include box-sizing(border-box);
@include box-shadow(0 2px 16px 0 rgba(0,0,0, 0.1));
margin: 0 auto;
padding: 80px 80px 40px 80px;
width: flex-grid(10);
.footer {
hr {
margin: 80px 0px 40px;
}
}
}
p + h2 {
margin-top: 60px;
}
h2 + p {
margin-top: 30px;
}
}
}
@import 'bourbon/bourbon';
@import 'reset';
@import 'font_face';
@import 'base';
@import 'base_mixins';
@import 'base_extends';
@import 'base_animations';
@import 'base_styles/reset';
@import 'base_styles/font_face';
@import 'base_styles/base';
@import 'base_styles/base_mixins';
@import 'base_styles/base_extends';
@import 'base_styles/base_animations';
@import 'sass_old/base/variables';
//@import 'sass_old/base/base';
@import 'sass_old/base/extends';
//@import 'sass_old/base/font-face';
@import 'sass_old/base/functions';
//@import 'sass_old/base/reset';
@import 'shared_forms';
@import 'shared_footer';
@import 'shared_header';
@import 'shared_list_of_courses';
@import 'shared_course_filter';
@import 'shared_modal';
@import 'shared_styles/shared_forms';
@import 'shared_styles/shared_footer';
@import 'shared_styles/shared_header';
@import 'shared_styles/shared_list_of_courses';
@import 'shared_styles/shared_course_filter';
@import 'shared_styles/shared_modal';
@import 'index';
@import 'home';
@import 'dashboard';
@import 'course';
@import 'find_courses';
@import 'course_info';
@import 'course_object';
@import 'courses';
@import 'course_about';
@import 'jobs';
@import 'about';
@import 'about_pages';
@import 'press_release';
@import 'sass_old/courseware/courseware';
@import 'sass_old/courseware/sequence-nav';
@import 'sass_old/courseware/sidebar';
@import 'sass_old/courseware/video';
@import 'sass_old/courseware/amplifier';
@import 'sass_old/courseware/problems';
......@@ -13,50 +13,62 @@ $lighter-base-font-color: rgb(160,160,160);
$blue: rgb(29,157,217);
$pink: rgb(182,37,104);
$yellow: rgb(255, 252, 221);
html, body {
background: rgb(250,250,250);
font-size: 75%;
//background: rgb(77, 82, 99);
font-family: $sans-serif;
font-size: 1em;
line-height: 1em;
}
h1, h2, h3, h4, h5, h6 {
color: $base-font-color;
font: normal 1.4rem/2rem $serif;
font: normal 1.2em/1.2em $serif;
margin: 0px;
}
h1 {
color: $lighter-base-font-color;
font: 300 2.4rem/3rem $sans-serif;
color: $base-font-color;
font: normal 2em/1.4em $sans-serif;
letter-spacing: 1px;
margin-bottom: 20px;
margin-bottom: 30px;
text-align: center;
text-transform: uppercase;
}
h2 {
color: $lighter-base-font-color;
font: normal 1.4rem/2rem $serif;
font: normal 1.2em/1.2em $serif;
letter-spacing: 1px;
margin-bottom: 15px;
text-transform: uppercase;
-webkit-font-smoothing: antialiased;
}
p + h2, ul + h2, ol + h2 {
margin-top: 40px;
}
p {
color: $base-font-color;
font: normal 1.3rem/2rem $serif;
font: normal 1em/1.6em $serif;
margin: 0px;
}
p + p {
span {
font: normal 1em/1.6em $sans-serif;
}
p + p, ul + p, ol + p {
margin-top: 20px;
}
p {
a:link, a:visited {
color: $blue;
font: normal 1.3rem/2rem $serif;
font: normal 1em/1em $serif;
text-decoration: none;
@include transition(all, 0.1s, linear);
......@@ -69,12 +81,12 @@ p {
a:link, a:visited {
color: $blue;
font: normal 1.2rem/2rem $sans-serif;
font: normal 1em/1em $sans-serif;
text-decoration: none;
@include transition(all, 0.1s, linear);
&:hover {
color: $base-font-color;
text-decoration: underline;
}
}
......@@ -90,3 +102,42 @@ a:link, a:visited {
max-width: 1200px;
width: flex-grid(12);
}
.static-container {
@include clearfix;
margin: 0 auto 0;
max-width: 1200px;
padding: 60px 0px 120px;
width: flex-grid(12);
.inner-wrapper {
margin: 0 auto 0;
width: flex-grid(10);
}
ol, ul {
list-style: disc;
li {
color: $base-font-color;
font: normal 1em/1.4em $serif;
margin: 0px;
}
}
h1 {
margin-bottom: 30px;
}
h1 + hr {
margin-bottom: 60px;
}
p + h2, ul + h2, ol + h2 {
margin-top: 40px;
}
ul + p, ol + p {
margin-top: 20px;
}
}
// home-header-pop-up animation
//************************************************************************//
.animation-home-header-pop-up {
@include animation(home-header-pop-up 1.15s ease-in-out);
@include animation-fill-mode(both);
@include animation-delay(1s);
}
@mixin home-header-pop-up-keyframes {
0% {
opacity: 0;
top: 300px;
//@include transform(scale(0.9));
}
45% {
opacity: 1;
}
65% {
top: -40px;
//@include transform(scale(1));
}
85% {
top: 10px;
}
100% {
top: 0px;
}
}
@-webkit-keyframes home-header-pop-up { @include home-header-pop-up-keyframes; }
@-moz-keyframes home-header-pop-up { @include home-header-pop-up-keyframes; }
@keyframes home-header-pop-up { @include home-header-pop-up-keyframes; }
// title appear animation
//************************************************************************//
......
......@@ -207,7 +207,6 @@ h1.top-header {
font-size: 12px;
// height:46px;
line-height: 46px;
margin: (-$body-line-height) (-$body-line-height) $body-line-height;
text-shadow: 0 1px 0 #fff;
@media print {
......@@ -215,6 +214,7 @@ h1.top-header {
}
a {
line-height: 46px;
border-bottom: 0;
color: darken($cream, 80%);
......
......@@ -34,11 +34,10 @@
@include box-sizing(border-box);
@include box-shadow(0 1px 0 0 rgba(255,255,255, 0.4), inset 0 1px 0 0 rgba(255,255,255, 0.6));
border: 1px solid rgb(200,200,200);
color: $lighter-base-font-color;
color: $base-font-color;
cursor: pointer;
font: normal 1.2rem/1.8rem $sans-serif;
height: 36px;
padding: 6px;
padding: 9px;
position: relative;
text-align: center;
text-shadow: 0 1px rgba(255,255,255, 0.8);
......@@ -51,7 +50,7 @@
@include border-radius(0px 4px 4px 4px);
border: 1px solid rgb(200,200,200);
@include box-shadow(0 2px 15px 0 rgba(0,0,0, 0.2));
padding: 10px;
padding: 20px 0px 5px 20px;
position: absolute;
visibility: hidden;
width: 200px;
......@@ -59,9 +58,7 @@
li {
list-style: none;
a {
}
margin-bottom: 15px;
}
}
......@@ -70,7 +67,7 @@
background: rgb(255,255,255);
@include background-image(linear-gradient(-90deg, rgb(250,250,250), rgb(255,255,255)));
@include border-radius(4px 4px 0px 0px);
border-bottom: none;
border-bottom: 1px dotted rgb(200,200,200);
@include box-shadow(0 2px 0 -1px rgb(255,255,255));
color: $base-font-color;
height: 40px;
......@@ -87,13 +84,16 @@
input[type="text"] {
@include border-radius(3px 0px 0px 3px);
float: left;
height: 36px;
width: 200px;
}
input[type="submit"] {
@include border-radius(0px 3px 3px 0px);
float: left;
height: 36px;
padding: 2px 20px;
}
}
}
......
......@@ -3,7 +3,6 @@ footer {
border-top: 1px solid rgb(200,200,200);
@include box-shadow(inset 0 1px 3px 0 rgba(0,0,0, 0.1));
margin: 0 auto;
padding: 0 0 40px;
width: flex-grid(12);
&.fixed-bottom {
......@@ -14,110 +13,169 @@ footer {
nav {
@include box-sizing(border-box);
@include clearfix;
max-width: 1200px;
margin: 0 auto;
padding: 20px 10px 0;
padding: 30px 10px 0;
width: flex-grid(12);
.copyright {
float: left;
padding-top: 2px;
.top {
border-bottom: 1px solid rgb(200,200,200);
@include clearfix;
padding-bottom: 30px;
width: flex-grid(12);
text-align: center;
a.logo {
@include background-image(url('/static/images/logo.png'));
background-position: 0 -24px;
background-repeat: no-repeat;
@include inline-block;
float: left;
height: 23px;
margin-right: 15px;
margin-top: 2px;
padding-right: 15px;
position: relative;
width: 47px;
vertical-align: middle;
&:hover {
background-position: 0 0;
}
ol {
float: right;
&::after {
@extend .faded-vertical-divider;
content: "";
display: block;
height: 30px;
right: 0px;
position: absolute;
top: -2px;
width: 1px;
}
}
li {
@include inline-block;
list-style: none;
padding: 0px 15px;
position: relative;
vertical-align: middle;
p {
color: $lighter-base-font-color;
font: italic 1.2rem/1.6rem $serif;
@include inline-block;
margin: 0 auto;
padding-top: 4px;
text-align: center;
vertical-align: middle;
&::after {
@extend .faded-vertical-divider;
content: "";
display: block;
height: 30px;
right: 0px;
position: absolute;
top: -5px;
width: 1px;
}
a {
color: $lighter-base-font-color;
font: italic 1.2rem/1.6rem $serif;
margin-left: 5px;
a:link, a:visited {
color: $lighter-base-font-color;
letter-spacing: 1px;
padding: 6px 0px;
}
}
}
}
ol {
float: right;
font-size: 0em;
li {
@include inline-block;
list-style: none;
padding: 0px 15px;
position: relative;
vertical-align: middle;
&::after {
@extend .faded-vertical-divider;
content: "";
display: block;
height: 30px;
right: 0px;
position: absolute;
top: -5px;
width: 1px;
.primary {
@include clearfix;
float: left;
a.logo {
@include background-image(url('/static/images/logo.png'));
background-position: 0 -24px;
background-repeat: no-repeat;
@include inline-block;
height: 22px;
margin-right: 15px;
margin-top: 2px;
padding-right: 15px;
position: relative;
width: 47px;
vertical-align: middle;
&:hover {
background-position: 0 0;
}
&::after {
@extend .faded-vertical-divider;
content: "";
display: block;
height: 30px;
right: 0px;
position: absolute;
top: -3px;
width: 1px;
}
}
a:link, a:visited {
a {
color: $lighter-base-font-color;
font: 300 1.2rem/1.6rem $sans-serif;
@include inline-block;
letter-spacing: 1px;
padding: 6px 0px;
margin-right: 20px;
padding-top: 2px;
vertical-align: middle;
&:hover {
color: $base-font-color;
text-decoration: none;
}
}
}
.social {
float: right;
&.social {
border: none;
margin: 0 0 0 5px;
padding: 0;
&::after {
display: none;
}
a {
opacity: 0.7;
padding: 0 0 0 10px;
@include transition(all, 0.1s, linear);
&:hover {
opacity: 0.7;
opacity: 1;
}
}
}
}
}
.bottom {
@include clearfix;
opacity: 0.8;
padding: 10px 0px 30px;
@include transition(all, 0.15s, linear);
width: flex-grid(12);
&:hover {
opacity: 1;
}
.copyright {
float: left;
p {
color: $lighter-base-font-color;
font-style: italic;
@include inline-block;
margin: 0 auto;
padding-top: 1px;
text-align: center;
vertical-align: middle;
a {
color: $lighter-base-font-color;
font-style: italic;
margin-left: 5px;
&:hover {
color: $blue;
}
}
}
}
.secondary {
float: right;
text-align: left;
a {
color: $lighter-base-font-color;
font-family: $serif;
font-style: italic;
letter-spacing: 1px;
line-height: 1.6em;
margin-left: 20px;
text-transform: lowercase;
&:hover {
color: $blue;
}
}
}
}
}
}
......@@ -3,7 +3,7 @@ form {
label {
color: $base-font-color;
font: italic 300 1.2rem/1.6rem $serif;
font: italic 300 1rem/1.6rem $serif;
margin-bottom: 5px;
text-shadow: 0 1px rgba(255,255,255, 0.4);
-webkit-font-smoothing: antialiased;
......@@ -17,9 +17,8 @@ form {
@include border-radius(3px);
@include box-shadow(0 1px 0 0 rgba(255,255,255, 0.6), inset 0 0 3px 0 rgba(0,0,0, 0.1));
@include box-sizing(border-box);
font: italic 300 1.2rem/1.6rem $serif;
font: italic 300 1rem/1.6rem $serif;
height: 35px;
@include inline-block;
padding: 5px 12px;
vertical-align: top;
-webkit-font-smoothing: antialiased;
......@@ -38,9 +37,8 @@ form {
input[type="submit"] {
@include button(shiny, $blue);
@include border-radius(3px);
font: 300 1.2rem/1.6rem $sans-serif;
font: normal 1.2rem/1.6rem $sans-serif;
height: 35px;
@include inline-block;
letter-spacing: 1px;
text-transform: uppercase;
vertical-align: top;
......
header.global {
//background: rgb(255,255,255);
background: rgba(245,245,245, 0.9);
border-bottom: 1px solid rgb(190,190,190);
@include box-shadow(0 1px 5px 0 rgba(0,0,0, 0.1));
//@include background-image(linear-gradient(-90deg, rgb(255,255,255), rgba(235,235,235, 1)));
//@include background-image(linear-gradient(-90deg, rgb(255,255,255), rgba(228,239,243, 1)));
//@include background-image(linear-gradient(-90deg, rgb(255,255,255), rgba(240,240,240, 0.9)));
//border-color: rgb(177, 210, 222);
@include background-image(linear-gradient(-90deg, rgba(255,255,255, 1), rgba(230,230,230, 0.9)));
height: 68px;
position: relative;
width: 100%;
......@@ -24,7 +19,7 @@ header.global {
h1.logo {
float: left;
margin: 9px 15px 0px 0px;
margin: 6px 15px 0px 0px;
padding-right: 20px;
position: relative;
......@@ -35,7 +30,7 @@ header.global {
height: 50px;
position: absolute;
right: 1px;
top: -12px;
top: -8px;
width: 1px;
}
......@@ -51,12 +46,12 @@ header.global {
}
a {
@include background-image(url('/static/images/logo.png'));
@include background-image(url('/static/images/header-logo.png'));
background-position: 0 0;
background-repeat: no-repeat;
display: block;
height: 23px;
width: 47px;
height: 31px;
width: 64px;
}
}
......@@ -90,12 +85,10 @@ header.global {
color: $lighter-base-font-color;
color: $blue;
display: block;
//font: italic 1.2rem/1.4rem $serif;
font: normal 1.2rem/1.4rem $sans-serif;
font-family: $sans-serif;
@include inline-block;
margin: 0px 30px 0px 0px;
text-decoration: none;
//text-transform: lowercase;
text-transform: uppercase;
text-shadow: 0 1px rgba(255,255,255, 0.6);
......@@ -121,8 +114,9 @@ header.global {
@include box-shadow(0 1px 0 0 rgba(255,255,255, 0.6));
color: $base-font-color;
display: inline-block;
font: normal 1.2rem/1.4rem $sans-serif;
font-family: $sans-serif;
@include inline-block;
line-height: 1em;
margin: 1px 5px;
padding: 10px 12px;
text-decoration: none;
......@@ -147,12 +141,6 @@ header.global {
position: relative;
text-transform: none;
@media screen and (max-width: 768px) {
font-size: 0em;
padding: 10px 0px;
width: 38px;
}
.avatar {
background: rgb(220,220,220);
@include border-radius(3px);
......@@ -239,8 +227,9 @@ header.global {
@include border-radius(3px);
color: rgba(255,255,255, 0.9);
display: block;
font: italic 1.2rem/1.4rem $serif;
font-family: $serif;
height: auto;
line-height: 1em;
margin: 5px 0px;
overflow: hidden;
padding: 3px 5px 4px;
......
......@@ -10,7 +10,6 @@
@include box-sizing(border-box);
@include box-shadow(0 1px 10px 0 rgba(0,0,0, 0.15), inset 0 0 0 1px rgba(255,255,255, 0.9));
float: left;
font-size: 0em;
margin-right: flex-gutter();
margin-bottom: 30px;
position: relative;
......@@ -34,12 +33,8 @@
p {
color: rgb(255,255,255);
font: 300 1.2rem/1.4rem $sans-serif;
padding: 5px 12px;
&.university {
float: left;
}
line-height: 1.2em;
padding: 4px 12px 5px;
}
}
......@@ -74,8 +69,8 @@
h2 {
color: $base-font-color;
font: 800 1.2rem/1.6rem $sans-serif;
padding-top: 10px;
margin-bottom: 0px;
padding-top: 9px;
text-shadow: 0 1px rgba(255,255,255, 0.6);
text-overflow: ellipsis;
white-space: nowrap;
......@@ -87,7 +82,7 @@
@include box-sizing(border-box);
color: $base-font-color;
display: block;
font: bold 2rem/2.2rem $sans-serif;
font: bold 1.6em/1.2em $sans-serif;
height: 100%;
opacity: 0.6;
padding-top: 10px;
......@@ -102,7 +97,7 @@
&:hover {
@include background-image(linear-gradient(-90deg, rgba(255,255,255, 1), rgba(255,255,255, 0.8)));
h2, p, .info-link {
h2, .info-link {
color: $blue;
opacity: 1;
}
......@@ -139,7 +134,7 @@
@include box-sizing(border-box);
height: 100px;
overflow: hidden;
padding: 10px 10px 15px 10px;
padding: 10px 10px 12px 10px;
position: relative;
width: 100%;
......@@ -152,33 +147,26 @@
.bottom {
@include box-sizing(border-box);
@include clearfix;
padding: 6px 10px;
padding: 0px 10px 10px 10px;
width: 100%;
> p, a {
.university {
border-right: 1px solid rgb(200,200,200);
color: $lighter-base-font-color;
font: 300 1.2rem/1.4rem $sans-serif;
letter-spacing: 1px;
padding: 0;
&.university {
border-right: 1px solid $lighter-base-font-color;
display: block;
float: left;
margin-right: 10px;
padding-right: 10px;
&:hover {
color: $blue;
}
}
margin-right: 10px;
padding-right: 10px;
&.dates {
float: left;
margin-top: 0px;
&:hover {
color: $blue;
}
}
.start-date {
color: $lighter-base-font-color;
letter-spacing: 1px;
}
}
}
......
.modal-overlay {
//background: rgba(255,255,255, 0.7);
@include background-image(radial-gradient(50% 30%, circle cover, rgba(0,0,0, 0.3), rgba(0,0,0, 0.8)));
bottom: 0;
content: "";
display: none;
left: 0;
position: fixed;
right: 0;
top: 0;
z-index: 5;
&.visible {
display: block;
}
#lean_overlay {
background: transparent;
@include background-image(radial-gradient(50% 30%, circle cover, rgba(0,0,0, 0.3), rgba(0,0,0, 0.8)));
display: none;
height:100%;
left: 0px;
position: fixed;
top: 0px;
width:100%;
z-index:100;
}
.modal {
......@@ -23,40 +18,39 @@
color: #fff;
display: none;
left: 50%;
margin-left: -(grid-width(6)) / 2;
padding: 8px;
position: absolute;
top: 170px;
width: grid-width(6);
z-index: 10;
&::before {
@include background-image(radial-gradient(50% 30%, circle cover, rgba(0,0,0, 0.3), rgba(0,0,0, 0.8)));
bottom: 0;
content: "";
left: 0;
position: fixed;
right: 0;
top: 0;
z-index: 1;
}
&.visible {
display: block;
}
z-index: 12;
&.video-modal {
left: 50%;
margin-left: -281px;
width: 562px;
padding: 10px;
width: 582px;
.inner-wrapper {
background: #000;
@include box-shadow(none);
height: 315px;
padding: 0px;
padding: 10px;
width: 560px;
}
}
&.home-page-video-modal {
left: 50%;
padding: 10px;
width: 662px;
.inner-wrapper {
background: #000;
@include box-shadow(none);
height: 360px;
padding: 10px;
width: 640px;
}
}
.inner-wrapper {
background: rgb(245,245,245);
@include border-radius(0px);
......@@ -104,21 +98,33 @@
}
}
h3 {
color: $lighter-base-font-color;
font: normal 1.4rem/1.8rem $serif;
letter-spacing: 1px;
padding-bottom: 20px;
h2 {
position: relative;
text-align: center;
text-shadow: 0 1px rgba(255,255,255, 0.4);
text-transform: uppercase;
vertical-align: middle;
-webkit-font-smoothing: antialiased;
z-index: 2;
}
}
#enroll_error, #login_error {
background: rgb(253, 87, 87);
border: 1px solid rgb(202, 17, 17);
color: rgb(143, 14, 14);
display: none;
margin-bottom: 20px;
padding: 12px;
}
//#enroll {
//padding: 0 40px;
//h1 {
//font: normal 1em/1.6em $sans-serif;
//margin-bottom: 10px;
//text-align: left;
//}
//}
form {
margin-bottom: 12px;
padding: 0px 40px;
......@@ -159,8 +165,8 @@
}
a {
font: italic normal 1.2rem/1.6rem $serif;
text-decoration: underline;
font-family: $serif;
font-style: italic;
}
}
......@@ -171,7 +177,7 @@
p {
color: $lighter-base-font-color;
font: 300 1.2rem/1.6rem $sans-serif;
font-family: $sans-serif;
}
hr {
......@@ -227,13 +233,19 @@
p {
color: $lighter-base-font-color;
font: italic 1.2rem/1.6rem $serif;
font-style: italic;
text-align: center;
-webkit-font-smoothing: antialiased;
span {
color: $lighter-base-font-color;
font-family: $serif;
font-style: italic;
}
a {
color: $lighter-base-font-color;
font: italic 1.2rem/1.6rem $serif;
font-family: $serif;
font-style: italic;
text-decoration: underline;
&:hover {
......
<%namespace name='static' file='static_content.html'/>
<%inherit file="main.html" />
<section class="container about">
<nav>
<a href="/t/about.html">Vision</a>
<a href="/t/faq.html">Faq</a>
<a href="/t/press.html">Press</a>
<a href="/t/contact.html" class="active">Contact</a>
</nav>
<section class="contact">
<div class="map">
<img src="${static.url('images/edx-location.png')}">
</div>
<div class="contacts">
<h2>Email Contacts</h2>
<ul>
<li><p>System-related questions: <a href="mailto:technical@mitx.mit.edu">technical@mitx.mit.edu</a></p></li>
<li><p>Content-related questions: <a href="mailto:content@mitx.mit.edu">content@mitx.mit.edu</a></p></li>
<li><p>Bug reports: <a href="mailto:bugs@mitx.mit.edu">bugs@mitx.mit.edu</a></p></li>
<li><p>Suggestions: <a href="mailto:suggestions@mitx.mit.edu">suggestions@mitx.mit.edu</a></p></li>
</ul>
<h2>Physical Address</h2>
<ul>
<li><p>11 Cambridge Center</p></li>
<li><p>Cambridge, MA 02142</p></li>
</ul>
</div>
</section>
</section>
<%inherit file="marketing.html" />
<%! from django.core.urlresolvers import reverse %>
<%inherit file="main.html" />
<section class="copyright">
<%namespace name='static' file='static_content.html'/>
<div>
<section class="static-container copyright">
<h1> Licensing Information </h1>
<hr class="horizontal-divider">
<ul>
<li>
<h2>Videos and Exercises</h2>
<p> Copyright &copy; 2012 MIT. All rights reserved. In order to
further MIT's goal of making education accessible and affordable
to the world, MIT is planning to make <i>MITx</i> course content
available under open source licenses.
</p>
</li>
<div class="inner-wrapper">
<h2>Videos and Exercises</h2>
<p> Copyright &copy; 2012 MIT. All rights reserved. In order to further MIT's goal of making education accessible and affordable to the world, MIT is planning to make <i>MITx</i> course content available under open source licenses.</p>
<li>
<h2>Textbook</h2>
<p> Copyright &copy; 2005 Elsevier Inc. All Rights
Reserved. Used with permission. While our goal is to build
courses with as much free and open content as possible, we
apologize that we do not have the ability to do so
entirely. </p>
</li>
<h2>Textbook</h2>
<p> Copyright &copy; 2005 Elsevier Inc. All Rights Reserved. Used with permission. While our goal is to build courses with as much free and open content as possible, we apologize that we do not have the ability to do so entirely. </p>
<li>
<h2>Student-generated content</h2>
<td>Copyright &copy; 2012. All Rights Reserved. Due to privacy
concerns, we do not know what portion of these will be released
under open licenses. </td></li>
</ul>
<h2>Student-generated content</h2>
<p>Copyright &copy; 2012. All Rights Reserved. Due to privacy concerns, we do not know what portion of these will be released under open licenses.</p>
<p>MIT and <i>MITx</i> are trademarks of the Massachusetts Institute
of Technology, and may not be used without permission.</p>
<p>MIT and <i>MITx</i> are trademarks of the Massachusetts Institute of Technology, and may not be used without permission.</p>
</div>
</section>
......@@ -23,7 +23,7 @@
</div>
<div class="bottom">
<a href="#" class="university">${course.get_about_section('university')}</a>
<p class="dates"><span class="start">7/23/12</span></p>
<span class="start-date">7/23/12</span>
</div>
</section>
</div>
......
......@@ -9,14 +9,14 @@
<div class="logo">
<img src="${static.url('images/edx_bw.png')}" />
</div>
<h2>Explore courses from universities around the world.</h2>
<h2>Explore courses from leading universities.</h2>
</hgroup>
</div>
</header>
<section class="container">
## I'm removing this for now since we aren't using it for the fall.
## <%include file="course_filter.html" />
<%include file="course_filter.html" />
<section class="courses">
%for course in courses:
<%include file="course.html" args="course=course" />
......
......@@ -31,79 +31,41 @@
% if len(courses) > 0:
% for course in courses:
<article class="my-course">
<a href="${reverse('info', args=[course.id])}">
<div class="cover">
<div class="shade"></div>
<div class="arrow"></div>
<img src="${static.url('images/circuits.jpeg')}" />
</div>
<section class="info">
<hgroup>
% for instructor in course.instructors:
<h3>${course.get_about_section('university')}</h3>
% endfor
<h2>${course.get_about_section("title")}</h2>
</hgroup>
<section class="meta">
<div class="complete">
<p>60% complete</p>
</div>
<div class="progress">
<div class="meter">
<div class="meter-fill"></div>
</div>
</div>
<div class="end-date">
<p>End date: <time>6/10/12</time></p>
<a href="${reverse('info', args=[course.id])}" class="cover" style="background-image: url('static/images/courses/python.png')">
<div class="shade"></div>
<div class="arrow"></div>
</a>
<section class="info">
<hgroup>
<a href="#" class="university">${course.get_about_section('university')}</a>
<h3><a href="${reverse('info', args=[course.id])}">${course.get_about_section("title")}</a></h3>
</hgroup>
<section class="course-status">
<p>Class Starts - <span>9/2/2012</span></div>
</section>
<section class="meta">
<div src="" class="course-work-icon"></div>
<div class="progress">
<div class="meter">
<div class="meter-fill"></div>
</div>
</section>
</div>
<div class="complete">
<p><span class="completeness">60%</span> compleat</p>
</div>
</section>
</a>
</section>
</article>
% endfor
% else:
<section class="empty-dashboard-message">
<p>Looks like you aren't registered for any courses. You should take a minute and <a href="${reverse('courses')}" class="find-courses">Find some courses!</a></p>
<p>Looks like you haven't registered for any courses yet.</p>
<a href="${reverse('courses')}">Find courses now!</a>
</section>
% endif
<article class="my-course">
<a href="/info" class="cover" style="background-image: url('static/images/courses/python.png')">
<div class="shade"></div>
<div class="arrow"></div>
</a>
<section class="info">
<hgroup>
<h3><a href="">HarvardX</a></h3>
<h2><a href="/info">CS 102 Python</a></h2>
</hgroup>
</section>
</article>
<article class="my-course">
<a href="/info" class="cover" style="background-image: url('static/images/courses/python.png')">
<div class="shade"></div>
<div class="arrow"></div>
</a>
<section class="info">
<hgroup>
<h3><a href="">HarvardX</a></h3>
<h2><a href="/info">CS 102 Python</a></h2>
</hgroup>
<section class="meta">
<div src="" class="course-work-icon"></div>
<div class="progress">
<div class="meter">
<div class="meter-fill"></div>
</div>
</div>
<div class="complete">
<p><span class="completeness">60%</span> compleat</p>
</div>
</section>
</section>
</article>
</section>
</section>
Your account for edX's on-line ${course_title} course
Your account for edX
<%namespace name='static' file='static_content.html'/>
<%inherit file="main.html" />
<section class="container about">
<nav>
<a href="/t/about.html">Vision</a>
<a href="/t/faq.html" class="active">Faq</a>
<a href="/t/press.html">Press</a>
<a href="/t/contact.html">Contact</a>
</nav>
<section class="faq">
<section class="responses">
<section id="the-organization" class="category">
<h2>The Organization</h2>
<article class="response">
<h3>What is edX?</h3>
<p>An organization established by MIT and Harvard that will develop an open-source technology platform to deliver online courses. EdX will support Harvard and MIT faculty in conducting research on teaching and learning on campus through tools that enrich classroom and laboratory experiences. At the same time, edX also will reach learners around the world through online course materials. The edX website will begin by hosting MITx and Harvardx content, with the goal of aping content from other universities interested in joining the platform. <!-- EdX will also support the Harvard and MIT faculty in conducting research on teaching and learning.--></p>
</article>
<article class="response">
<h3>What are MITx and Harvardx?</h3>
<p>Portfolios of MIT and Harvard online courses offered to learners around the world through edX. </p>
</article>
<article class="response">
<h3>What technology will edX use?</h3>
<p>An open-source online learning platform that will feature teaching designed specifically for the web. Features will include: self-paced learning, online discussion groups, wiki-based collaborative learning, assessment of learning as a student progresses through a course, and online laboratories. The platform will also serve as a laboratory from which data will be gathered to better understand how students learn. Because it is open source, the platform will be continuously improved.</p>
</article>
<article class="response">
<h3>Is there anything innovative about the online technology?</h3>
<p>Yes. It will move beyond the standard model of online education that relies on watching video content and will offer an interactive experience for students. And the technology will be open source; other universities will be able to leverage the innovative technology to create their own online offerings.</p>
</article>
<article class="response">
<h3>Why are MIT and Harvard doing this?</h3>
<p>To improve education on campus and around the world:</p>
<ul>
<li>
<p>On campus, edX research will enhance our understanding of how students learn and how technologies can best be used as part of our larger efforts to improve teaching and learning.</p>
</li>
<li>
<p>Beyond our campuses, edX will expand access to education, allow for certificates of mastery to be earned by able learners, and make the open source platform available to other institutions.</p>
</li>
</ul>
</article>
</section>
<section id="technology-platform" class="category">
<h2>Technology Platform</h2>
<article class="response">
<h3>Why did Harvard and MIT decide to partner with each other?</h3>
<p>We share a vision for greater access to education. Based on our long history of collaboration, we know we can leverage our strengths to best serve the world.</p>
</article>
<article class="response">
<h3>How is this different from what other universities are doing online?</h3>
<p>EdX will be entirely our universities&#8217; shared educational missions. Also, a primary goal of edX is to improve teaching and learning on campus by supporting faculty from both universities in conducting significant research on how students learn. </p>
</article>
<article class="response">
<h3>Who will lead edX?</h3>
<p>EdX is a priority for the leadership of both Harvard and MIT, and it will be governed by a board made up of key leaders from both institutions, appointed by each university&#8217;s president. MIT Professor of Electrical Engineering and Computer Science Anant Agarwal will be the initial President of edX and will report to the board.</p>
</article>
<article class="response">
<h3>Does the effort have a staff?</h3>
<p>EdX is a significant undertaking that will require significant resources. The full scope of the staff has not been determined, but there will be a dedicated staff to the initiative.</p>
</article>
</section>
<section id="learning-objectives" class="category">
<h2>Learning Objectives</h2>
<article class="response">
<h3>Who can take edX courses? Will there be an admissions process?</h3>
<p>EdX will be available to anyone in the world with an internet connection, and in general, there will not be an admissions process. For a modest fee, and as determined by the edX board, MIT and Harvard, credentials will be granted only to students who earn them by demonstrating mastery of the material of a subject.</p>
</article>
<article class="response">
<h3>Will the certificates be awarded by Harvard and/or MIT?</h3>
<p>As determined by the edX board, MIT and Harvard, online learners who demonstrate mastery of subjects could earn a certificate of completion, but such certificates would not be issued under the name Harvard or MIT. </p>
</article>
<article class="response">
<h3>What will the scope of the online courses be? How many? Which faculty? </h3>
<p>Our goal is to offer a wide variety of courses across disciplines.</p>
</article>
<article class="response">
<h3>Will Harvard and MIT students be able to take these courses for credit?</h3>
<p>No. MITx and Harvardx courses will not be offered for credit at either university. The online content will be used to extend and enrich on campus courses.</p>
</article>
</section>
<section id="the-students" class="category">
<h2>The Students</h2>
<article class="response">
<h3>How will success be measured?</h3>
<p>Progress in student learning research and the demand for online courses will both be measured as indications of success. However, a plan for measuring the full success of edX will be developed in consultation with faculty from MIT and Harvard.</p>
</article>
<article class="response">
<h3>Who is the learner? Domestic or international? Age range?</h3>
<p>Improving teaching and learning for students on our campuses is one of our primary goals. Beyond that, we don&#8217;t have a target group of potential learners, as the goal is to make these courses available to anyone in the world &#8211; from any demographic &#8211; who has interest in advancing their own knowledge. The only requirement is to have a computer with an internet connection.</p>
</article>
<article class="response">
<h3>Many institutions are partnering in this space. Is the MIT/Harvard partnership exclusive? Will other institutions be able to collaborate with edX?</h3>
<p>It is our intention that over time other universities will join MIT and Harvard in offering courses on the edX platform. The gathering of many universities&#8217; educational content together on one site will enable learners worldwide to access the course content of any participating university from a single website, and to use a set of online educational tools shared by all participating universities. </p>
</article>
<article class="response">
<h3>Will MIT and Harvard standards apply here?</h3>
<p>The reach changes exponentially, but the rigor remains the same.</p>
</article>
<article class="response">
<h3>How do you intend to test whether this approach is improving learning?</h3>
<p>Both institutions have assembled faculty who will look at data collection and analytical tools for assessing the results.</p>
</article>
</section>
</section>
<nav class="categories">
<a href="#the-organization">The organization</a>
<a href="#technology-platform">Technology Platform</a>
<a href="#learning-objectives">Learning Objectives</a>
<a href="#the-students">The Students</a>
</nav>
</section>
</section>
......@@ -3,28 +3,34 @@
<footer>
<nav>
<section class="copyright">
<a href="${reverse('root')}" class="logo"></a>
<p>&copy; 2012 edX, <a href="#">some rights reserved.</a></p>
</section>
<ol>
<li>
<section class="top">
<section class="primary">
<a href="${reverse('root')}" class="logo"></a>
<a href="${reverse('courses')}">Find Courses</a>
</li>
<li>
<a href="${reverse('about_edx')}">About</a>
</li>
<li>
<a href="/t/about.html">About</a>
<a href="#">Blog</a>
</li>
<li>
<a href="${reverse('jobs')}">Jobs</a>
</li>
<li class="social">
<a href="/t/jobs.html">Jobs</a>
</section>
<section class="social">
<a href="#"><img src="${static.url('images/linkedin.png')}" /></a>
<a href="#"><img src="${static.url('images/facebook.png')}" /></a>
<a href="#"><img src="${static.url('images/twitter.png')}" /></a>
</li>
</ol>
</section>
</section>
<section class="bottom">
<section class="copyright">
<p>&copy; 2012 edX, <a href="/t/copyright.html">some rights reserved.</a></p>
</section>
<section class="secondary">
<a href="/t/tos.html">Terms of Service</a>
<a href="/t/privacy.html">Privacy Policy</a>
<a href="/t/honor.html">Honor Code</a>
<a href="/t/help.html">Help</a>
</section>
</section>
</nav>
</footer>
<%! from django.core.urlresolvers import reverse %>
<%inherit file="main.html" />
<%namespace name='static' file='static_content.html'/>
<%block name="title"><title>Help - MITx 6.002x</title></%block>
<section class="help main-content">
<section class="static-container help">
<h1>Help</h1>
<hr class="horizontal-divider">
<section class="self-help">
<div class="inner-wrapper">
<h2>Self-help</h2>
<ul>
<li>Read
the <a href="http://mitx.mit.edu/6002x-faq.html">FAQ</a>
carefully</li>
<li>Check the <a href="/info">course updates</a> -- we will
announce major errors and issues there </li>
<li>Check whether the issues has been asked on
the <a href="/discussion">discussion forums</a>, and if not,
ask</li>
<li>Ask in the IRC channel (irc.mitx.mit.edu, channel #6002)]</li>
<li>Check the <a href="/info">course handouts.</a></li>
<li><p>Read the <a href="/t/faq.html">FAQ</a> carefully</p></li>
<li><p>Check the <a href="/info">course updates</a> -- we will announce major errors and issues there </p></li>
<li><p>Check whether the issues has been asked on the <a href="/discussion">discussion forums</a>, and if not, ask</p></li>
<li><p>Ask in the IRC channel (irc.mitx.mit.edu, channel #6002)]</p></li>
<li><p>Check the <a href="/info">course handouts.</a></p></li>
</ul>
</section>
<section class="help-email">
<h2>Help email</h2>
<p> If you can't solve your problems with self-help, we have several
e-mail addresses set up:</p>
<dl>
<dt>System-related questions</dt>
<dd><a href="mailto:technical@mitx.mit.edu">technical@mitx.mit.edu</a></dd>
<dt>Content-related questions</dt>
<dd><a href="mailto:content@mitx.mit.edu">content@mitx.mit.edu</a></dd>
<dt>Bug reports</dt>
<dd><a href="mailto:bugs@mitx.mit.edu">bugs@mitx.mit.edu</a></dd>
<dt>Suggestions</dt>
<dd><a href="mailto:suggestions@mitx.mit.edu">suggestions@mitx.mit.edu</a></dd>
</dl>
<p> Please bear in mind that while we read them, we do not
expect to have time to respond to all e-mails. For technical
questions, please make sure you are using the latest version
of <a href="http://www.mozilla.org/en-US/firefox/new/">Firefox</a>
or <a href="https://www.google.com/chrome/">Chrome</a>, and
include browser and version in your e-mail, as well as
screenshots or other pertinent details. </p>
</section>
<h2>Help email</h2>
<p> If you can't solve your problems with self-help, we have several e-mail addresses set up:</p>
<ul>
<li><p>System-related questions: <a href="mailto:technical@mitx.mit.edu">technical@mitx.mit.edu</a></p></li>
<li><p>Content-related questions: <a href="mailto:content@mitx.mit.edu">content@mitx.mit.edu</a></p></li>
<li><p>Bug reports: <a href="mailto:bugs@mitx.mit.edu">bugs@mitx.mit.edu</a></p></li>
<li><p>Suggestions: <a href="mailto:suggestions@mitx.mit.edu">suggestions@mitx.mit.edu</a></p></li>
</ul>
<p>Please bear in mind that while we read them, we do not expect to have time to respond to all e-mails. For technical questions, please make sure you are using the latest version of <a href="http://www.mozilla.org/en-US/firefox/new/">Firefox</a> or <a href="https://www.google.com/chrome/">Chrome</a>, and include browser and version in your e-mail, as well as screenshots or other pertinent details.</p>
</div>
</section>
<%inherit file="marketing.html" />
<%! from django.core.urlresolvers import reverse %>
<%inherit file="main.html" />
<section class="honor-code">
<div>
<h1> Collaboration Policy </h1>
<%namespace name='static' file='static_content.html'/>
<section class="static-container honor-code">
<h1> Collaboration Policy </h1>
<hr class="horizontal-divider">
<div class="inner-wrapper">
<p> By enrolling in a course on <i>edX</i>, you are joining a
special worldwide community of learners. The aspiration
of <i>edX</i> is to provide anyone in the world who has the
motivation and ability to engage edX coursework the opportunity
to attain the best edX-based educational experience that
Internet technology enables. You are part of the community who
will help <i>edX</i> achieve this goal.
will help <i>edX</i> achieve this goal.</p>
<p> <i>edX</i> depends upon your motivation to learn the material
and to do so with honesty. In order to participate
in <i>edX</i>, you must agree to the Honor Code below and any
additional terms specific to a class. This Honor Code, and any
additional terms, will be posted on each class website.
<div style="color:darkred;">
<h2> <i>edX</i> Honor Code Pledge</h2>
<p> By enrolling in an <i>edX</i> course, I agree that I will:
<ul>
<li> Complete all mid-terms and final exams with my own work
and only my own work. I will not submit the work of any
other person.
<li> Maintain only one user account and not let anyone else
use my username and/or password.
<li> Not engage in any activity that would dishonestly improve
my results, or improve or hurt the results of others.
<li> Not post answers to problems that are being used to
assess student performance.
</ul>
</div>
<p> Unless otherwise indicated by the instructor of an <i>edX</i>
course, learners on <i>edX</i> are encouraged to:
<ul>
<li> Collaborate with others on the lecture videos, exercises,
homework and labs.
<li> Discuss with others general concepts and materials in
each course.
<li> Present ideas and written work to fellow <i>edX</i>
learners or others for comment or criticism.
</ul>
additional terms, will be posted on each class website.</p>
<h2><i>edX</i> Honor Code Pledge</h2>
<p> By enrolling in an <i>edX</i> course, I agree that I will:</p>
<ul>
<li>
<p>Complete all mid-terms and final exams with my own work and only my own work. I will not submit the work of any other person.</p>
</li>
<li>
<p>Maintain only one user account and not let anyone else use my username and/or password.</p>
</li>
<li>
<p>Not engage in any activity that would dishonestly improve my results, or improve or hurt the results of others.</p>
</li>
<li>
<p>Not post answers to problems that are being used to assess student performance.</p>
</li>
</ul>
<p> Unless otherwise indicated by the instructor of an <i>edX</i> course, learners on <i>edX</i> are encouraged to:</p>
<ul>
<li>
<p>Collaborate with others on the lecture videos, exercises, homework and labs.</p>
</li>
<li>
<p>Discuss with others general concepts and materials in each course.</p>
</li>
<li>
<p>Present ideas and written work to fellow <i>edX</i> learners or others for comment or criticism.</p>
</li>
</ul>
</div>
</section>
......@@ -4,15 +4,41 @@
<section class="home">
<header>
<div class="inner-wrapper">
<h1>The Future of Online Education</h1>
<a href="${reverse('courses')}" class="find-courses">Find Courses</a>
<div class="outer-wrapper">
<div class="inner-wrapper">
<div class="title">
<h1>The Future of Online Education</h1>
<div class="main-cta">
<a href="${reverse('courses')}" class="find-courses">Find Courses</a>
</div>
<div class="social-sharing">
<div class="sharing-message">Share with friends and family!</div>
<a href="#" class="share">
<img src="${static.url('images/twitter-sharing.png')}">
</a>
<a href="#" class="share">
<img src="${static.url('images/facebook-sharing.png')}">
</a>
<a href="#" class="share">
<img src="${static.url('images/email-sharing.png')}">
</a>
</div>
</div>
<a href="#video-modal" class="media" rel="leanModal">
<div class="hero">
<img src="${static.url('images/courses/space1.jpg')}" />
<div class="play-intro"></div>
</div>
</a>
</div>
</div>
</header>
<section class="container">
<section class="highlighted-courses">
<h2>Explore courses from <span class="lowercase">edX</span> universities</h2>
<h2>Explore courses from <span class="lowercase">edX</span> universities</h2>
<section class="university-partners">
<ol class="partners">
......@@ -49,15 +75,54 @@
%endfor
</section>
</section>
</section>
<section class="container">
<section class="more-info">
<h2>edX News & Announcements</h2>
<header>
<h2>edX News & Announcements</h2>
<a href="/t/press.html">Read More &rarr;</a>
</header>
<section class="news">
<article></article>
<article></article>
<article></article>
<article></article>
<section class="blog-posts">
<article>
<a href="#" class="post-graphics">
<img src="${static.url('images/courses/space1.jpg')}" />
</a>
<div class="post-name">
<a href="">Online Classes Cut Costs, But Do They Dilute Brands?</a>
<p class="post-date">7/12/2012</p>
</div>
</article>
<article>
<a href="#" class="post-graphics">
<img src="${static.url('images/courses/space1.jpg')}" />
</a>
<div class="post-name">
<a href="">Online Classes Cut Costs, But Do They Dilute Brands?</a>
<p class="post-date">7/12/2012</p>
</div>
</article>
<article>
<a href="#" class="post-graphics">
<img src="${static.url('images/courses/space1.jpg')}" />
</a>
<div class="post-name">
<a href="">Online Classes Cut Costs, But Do They Dilute Brands?</a>
<p class="post-date">7/12/2012</p>
</div>
</article>
</section>
</section>
</section>
</section>
</section>
<section id="video-modal" class="modal home-page-video-modal">
<div class="inner-wrapper">
<iframe width="640" height="360" src="http://www.youtube.com/embed/SA6ELdIRkRU" frameborder="0" allowfullscreen></iframe>
</div>
</section>
......@@ -16,6 +16,7 @@
<p>Harvard President Drew Faust said, “edX gives Harvard and MIT an unprecedented opportunity to dramatically extend our collective reach by conducting groundbreaking research into effective education and by extending online access to quality higher education.”
</div>
</section>
<hr class="horizontal-divider">
<section class="jobs-wrapper">
<h2>We are currently looking for</h2>
......@@ -61,17 +62,9 @@
<section class="jobs-sidebar">
<h2>Positions</h2>
<nav>
<ol>
<li>
<a href="#edx-fellow">edX Fellow</a>
</li>
<li>
<a href="#content-engineer">Content Engineer</a>
</li>
<li>
<a href="#technology-team">Technology Team</a>
</li>
</ol>
<a href="#edx-fellow">edX Fellow</a>
<a href="#content-engineer">Content Engineer</a>
<a href="#technology-team">Technology Team</a>
</nav>
<h2>How to Apply</h2>
<p>E-mail your resume, coverletter and any other materials to <a href="#">careers@edxonline.org</a></p>
......
<%! from django.core.urlresolvers import reverse %>
<%namespace name='static' file='static_content.html'/>
<section class="modal login-modal">
<section id="login-modal" class="modal login-modal">
<div class="inner-wrapper">
<header>
<h3>Log In</h3>
<h2>Log In</h2>
<hr>
</header>
......@@ -18,13 +18,13 @@
Remember me
</label>
<div class="submit">
<input name="submit" type="submit" value="Submit">
<input name="submit" type="submit" value="Access My Courses">
</div>
</form>
<section class="login-extra">
<p>
<span>Not enrolled? <a href="#">Sign up.</a></span>
<span>Not enrolled? <a href="#signup-modal" class="close-login" rel="leanModal">Sign up.</a></span>
<a href="#" class="pwd-reset">Forgot password?</a>
</p>
</section>
......@@ -64,7 +64,7 @@
} else if($('#login_error').length == 0) {
$('#login_form').prepend('<div id="login_error">Email or password is incorrect.</div>');
} else {
$('#login_error').stop().css("background-color", "#933").animate({ backgroundColor: "#333"}, 2000);
$('#login_error').stop().css("display", "block");
}
}
);
......
......@@ -34,13 +34,13 @@
%else:
<ol class="guest">
<li class="secondary">
<a href="${reverse('about_edx')}">About</a>
<a href="/t/about.html">About</a>
<a href="#">Blog</a>
<a href="${reverse('jobs')}">Jobs</a>
<a href="#" id="login">Log In</a>
<a href="#login-modal" id="login" rel="leanModal">Log In</a>
</li>
<li class="primary">
<a href="#" id="signup">Sign Up</a>
<a href="#signup-modal" id="signup" rel="leanModal">Sign Up</a>
</li>
</ol>
</nav>
......
......@@ -11,22 +11,20 @@
<div class="intro-inner-wrapper">
<section class="intro">
<hgroup>
<h1>${course.get_about_section("title")} <h2><a href="#">${course.get_about_section("university")}</a></h2></h1>
<h1>${course.get_about_section("title")}</h1><h2><a href="#">${course.get_about_section("university")}</a></h2>
</hgroup>
<div class="course-dates">
<p>Class Starts: <span class="start-date">7/12/12</span></p>
<p>Final Exam: <span class="start-date">12/09/12</span></p>
<p>Total Length: <span class="course-length">15 weeks</span></p>
</div>
</section>
<section class="actions">
<div class="register-wrapper">
<div class="main-cta">
<a href="${reverse('enroll', args=[course.id])}" class="register">Register</a>
</div>
<section class="social-sharing">
<p><span class="num-people-registered">1,435</span> students already registed!</p>
</section>
</section>
<a href="#video-modal" class="media" rel="leanModal">
<div class="hero">
<img src="${static.url('images/courses/circuits.jpeg')}" />
<div class="play-intro"></div>
</div>
</a>
</div>
</header>
......@@ -45,20 +43,6 @@
<section class="about">
<h2>About this course</h2>
<p>${course.get_about_section("description")}</p>
<h2>Requirements</h2>
<p>${course.get_about_section("requirements")}</p>
<h2>Syllabus</h2>
<p>${course.get_about_section("syllabus")}</p>
<h2>Textbook</h2>
${course.get_about_section("textbook")}
<h2>Frequently Asked Questions</h2>
<p>${course.get_about_section("faq")}</p>
<p>${course.get_about_section("more_info")}</p>
</section>
<section class="course-staff">
......@@ -87,26 +71,60 @@
<p>Research Scientist at MIT. His research focus is in finding ways to apply techniques from control systems to optimizing the learning process. Dr. Mitros has worked as an analog designer at Texas Instruments, Talking Lights, and most recently, designed the analog front end for a novel medical imaging modality for Rhythmia Medical.</p>
</article>
</section>
</section>
</div>
<section class="course-sidebar">
<div class="media">
<div class="hero">
<img src="${static.url('images/courses/circuits.jpeg')}" />
<div class="play-intro"></div>
</div>
<%include file="../video_modal.html" />
<section class="requirements">
<h2>Requirements</h2>
<p>${course.get_about_section("requirements")}</p>
</section>
<section class="syllabus">
<h2>Syllabus</h2>
<p>${course.get_about_section("syllabus")}</p>
</section>
<section class="text-book">
<h2>Textbook</h2>
${course.get_about_section("textbook")}
</section>
<section class="course-faq">
<h2>Frequently Asked Questions</h2>
<p>${course.get_about_section("faq")}</p>
</section>
</div>
</section>
<section class="course-sidebar">
<section class="course-summary">
<h3>Course Sumamry</h3>
<p>${course.get_about_section("short_description")}</p>
</section>
<header>
<!--
-<a href="#" class="university-name">${course.get_about_section("university")}</a><span>${course.get_about_section("title")}</span>
-->
<div class="social-sharing">
<div class="sharing-message">Share with friends and family!</div>
<a href="#" class="share">
<img src="${static.url('images/twitter-sharing.png')}">
</a>
<a href="#" class="share">
<img src="${static.url('images/facebook-sharing.png')}">
</a>
<a href="#" class="share">
<img src="${static.url('images/email-sharing.png')}">
</a>
</div>
</header>
<section class="dates">
<p>Course Number <span class="start-date">(${course.get_about_section("number")})</span></p>
<ol class="important-dates">
<li><img src=""><p>Classes Start</p><span class="start-date">7/12/12</span></li>
<li><img src=""><p>Final Exam</p><span class="final-date">12/09/12</span></li>
<li><img src=""><p>Course Length</p><span class="course-length">15 weeks</span></li>
<li><img src=""><p>Course Number</p><span class="course-number">${course.get_about_section("number")}</span></li>
</ol>
</section>
</section>
</section>
</section>
<%include file="../video_modal.html" />
<%namespace name='static' file='static_content.html'/>
<%inherit file="main.html" />
<section class="container about">
<nav>
<a href="/t/about.html">Vision</a>
<a href="/t/faq.html">Faq</a>
<a href="/t/press.html" class="active">Press</a>
<a href="/t/contact.html">Contact</a>
</nav>
<section class="press">
<section class="press-resources">
<section class="pressreleases">
<p>View our <a href="/t/pressrelease.html">Press Release</a></p>
</section>
<section class="identity-assets">
<p>Download our <a href="/t/pressrelease.html">Logos</a></p>
</section>
</section>
<article class="press-story">
<div class="article-cover">
<img src="${static.url('images/courses/circuits.jpeg')}" />
</div>
<div class="press-info">
<header>
<h3>Online Classes Cut Costs, But Do They Dilute Brands?</h3>
<span class="post-date">7/12/2012</span>
<a href="http://www.npr.org/2012/07/02/156122748/online-classes-cut-costs-but-do-they-dilute-brands">http://n.pr/Lt5ydM</a>
</header>
<p>"You know this is the Wild West. There's a lot of things we have to figure out," Agarwal says. "And you know if anybody says they know exactly what they're doing, I think that would be a far cry from reality."</p>
</div>
</article>
<article class="press-story">
<div class="article-cover">
<img src="${static.url('images/courses/circuits.jpeg')}" />
</div>
<div class="press-info">
<header>
<h3>Online Classes Cut Costs, But Do They Dilute Brands?</h3>
<span class="post-date">7/12/2012</span>
<a href="http://www.npr.org/2012/07/02/156122748/online-classes-cut-costs-but-do-they-dilute-brands">http://n.pr/Lt5ydM</a>
</header>
<p>"You know this is the Wild West. There's a lot of things we have to figure out," Agarwal says. "And you know if anybody says they know exactly what they're doing, I think that would be a far cry from reality."</p>
</div>
</article>
<article class="press-story">
<div class="article-cover">
<img src="${static.url('images/courses/circuits.jpeg')}" />
</div>
<div class="press-info">
<header>
<h3>Online Classes Cut Costs, But Do They Dilute Brands?</h3>
<span class="post-date">7/12/2012</span>
<a href="http://www.npr.org/2012/07/02/156122748/online-classes-cut-costs-but-do-they-dilute-brands">http://n.pr/Lt5ydM</a>
</header>
<p>"You know this is the Wild West. There's a lot of things we have to figure out," Agarwal says. "And you know if anybody says they know exactly what they're doing, I think that would be a far cry from reality."</p>
</div>
</article>
<article class="press-story">
<div class="article-cover">
<img src="${static.url('images/courses/circuits.jpeg')}" />
</div>
<div class="press-info">
<header>
<h3>Online Classes Cut Costs, But Do They Dilute Brands?</h3>
<span class="post-date">7/12/2012</span>
<a href="http://www.npr.org/2012/07/02/156122748/online-classes-cut-costs-but-do-they-dilute-brands">http://n.pr/Lt5ydM</a>
</header>
<p>"You know this is the Wild West. There's a lot of things we have to figure out," Agarwal says. "And you know if anybody says they know exactly what they're doing, I think that would be a far cry from reality."</p>
</div>
</article>
</section>
</section>
<%! from django.core.urlresolvers import reverse %>
<%inherit file="main.html" />
<%namespace name='static' file='static_content.html'/>
<section class="pressrelease">
<section class="container">
<h1>MIT and Harvard announce edX</h1>
<hr class="horizontal-divider">
<article>
<h2>Joint venture builds on MITx and Harvard distance learning; aims to benefit campus-based education and beyond</h2>
<p>Harvard University and the Massachusetts Institute of Technology (MIT) today announced edX, a transformational new partnership in online education. Through edX, the two institutions will collaborate to enhance campus-based teaching and learning and build a global community of online learners.</p>
<p>EdX will build on both universities’ experience in offering online instructional content. The technological platform recently established by MITx, which will serve as the foundation for the new learning system, was designed to offer online versions of MIT courses featuring video lesson segments, embedded quizzes, immediate feedback, student-ranked questions and answers, online laboratories, and student paced learning. Certificates of mastery will be available for those motivated and able to demonstrate their knowledge of the course material.</p>
<p>MIT and Harvard expect that over time other universities will join them in offering courses on the edX platform. The gathering of many universities’ educational content together on one site will enable learners worldwide to access the course content of any participating university from a single website, and to use a set of online educational tools shared by all participating universities. </p>
<p>EdX will release its learning platform as open source software so it can be used by other universities and organizations who wish to host the platform themselves. Because the learning technology will be available as open-source software, other universities and individuals will be able to help edX improve and add features to the technology.</p>
<p>MIT and Harvard will use the jointly operated edX platform to research how students learn and how technologies can facilitate effective teaching both on-campus and online. The edX platform will enable the study of which teaching methods and tools are most successful. The findings of this research will be used to inform how faculty use technology in their teaching, which will enhance the experience for students on campus and for the millions expected to take advantage of these new online offerings.</p>
<p>“EdX represents a unique opportunity to improve education on our own campuses through online learning, while simultaneously creating a bold new educational path for millions of learners worldwide,” MIT President Susan Hockfield said.</p>
<p>Harvard President Drew Faust said, “edX gives Harvard and MIT an unprecedented opportunity to dramatically extend our collective reach by conducting groundbreaking research into effective education and by extending online access to quality higher education.”</p>
<p>“Harvard and MIT will use these new technologies and the research they will make possible to lead the direction of online learning in a way that benefits our students, our peers, and people across the nation and the globe,” Faust continued.</p>
<h2>Jointly Owned Not-for-Profit Structure</h2>
<p>The initiative will be overseen by a not-for-profit organization based in Cambridge, Massachusetts, to be owned and governed equally by the two universities. MIT and Harvard have committed to a combined $60 million ($30 million each) in institutional support, grants and philanthropy to launch the collaboration. </p>
<p>MIT’s Director of the Computer Science and Artificial Intelligence Laboratory Anant Agarwal, who has led the development of the MITx platform under the leadership of MIT provost L. Rafael Reif, will serve as the first president of edX. </p>
<p>At Harvard, Provost Alan Garber will direct the Harvardx effort and Faculty of Arts and Sciences Dean Michael D. Smith will play a leading role in working with faculty to develop and deliver courses. </p>
<p>It is anticipated that near-term course offerings from a range of Harvard and MIT schools will be included on the edX platform.</p>
<h2>Research to Enhance Residential Model</h2>
<p>EdX will enhance the traditional residential model of undergraduate education on both campuses by supporting an unlimited number of experimental online approaches to teaching that can be used by Harvard and MIT faculty and which will benefit students in Cambridge and Boston. It will also have the benefit of providing global access to some of the world-class instruction that already occurs in Cambridge and Boston, but which is only one aspect of the full Harvard College and MIT experience.</p>
<p>“The campus environment offers opportunities and experiences that cannot be replicated online,” said Hockfield. “EdX is designed to improve, not replace, the campus experience.” </p>
<p>EdX will be separate from ongoing distance learning initiatives at both institutions, including MIT OpenCourseWare and courses offered by schools at Harvard such as the Harvard Extension School, the Harvard Business School and the Harvard Medical School.</p>
<h2>First Courses by Fall 2012</h2>
<p>The universities will work to develop further the online learning platform already begun with MITx and to populate the edX website with courses from the MIT and Harvard faculty. During the early stages, the two universities will work cooperatively to offer as broad an initial set of courses as possible. A first set of courses is scheduled to be announced in early summer and to start in Fall, 2012.</p>
<p>“We are already moving forward quickly,” said Anant Agarwal. “There’s a lot of energy in the air, and the teams at Harvard and MIT can’t wait to collaborate.”</p>
<section class="footer">
<hr class="horizontal-divider">
<div class="logo"></div><h3 class="date">4 - 09 - 2012</h3>
</section>
</article>
</section>
</section>
This source diff could not be displayed because it is too large. You can view the blob instead.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment