Commit a54fcd97 by David Ormsbee

Merge pull request #5 from MITx/pmitros/name-change

Name and e-mail change functionality
parents 393044fb 162fa594
# encoding: utf-8
import datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models
class Migration(SchemaMigration):
def forwards(self, orm):
# Adding model 'PendingEmailChange'
db.create_table('student_pendingemailchange', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('user', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['auth.User'], unique=True)),
('new_email', self.gf('django.db.models.fields.CharField')(db_index=True, max_length=255, blank=True)),
('activation_key', self.gf('django.db.models.fields.CharField')(unique=True, max_length=32, db_index=True)),
))
db.send_create_signal('student', ['PendingEmailChange'])
# Adding model 'PendingNameChange'
db.create_table('student_pendingnamechange', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('user', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['auth.User'], unique=True)),
('new_name', self.gf('django.db.models.fields.CharField')(max_length=255, blank=True)),
('rationale', self.gf('django.db.models.fields.CharField')(max_length=1024, blank=True)),
))
db.send_create_signal('student', ['PendingNameChange'])
# Changing field 'UserProfile.user'
db.alter_column('auth_userprofile', 'user_id', self.gf('django.db.models.fields.related.OneToOneField')(unique=True, to=orm['auth.User']))
def backwards(self, orm):
# Deleting model 'PendingEmailChange'
db.delete_table('student_pendingemailchange')
# Deleting model 'PendingNameChange'
db.delete_table('student_pendingnamechange')
# Changing field 'UserProfile.user'
db.alter_column('auth_userprofile', 'user_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'], unique=True))
models = {
'auth.group': {
'Meta': {'object_name': 'Group'},
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
},
'auth.permission': {
'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
},
'auth.user': {
'Meta': {'object_name': 'User'},
'about': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'avatar_type': ('django.db.models.fields.CharField', [], {'default': "'n'", 'max_length': '1'}),
'bronze': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}),
'consecutive_days_visit_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
'country': ('django_countries.fields.CountryField', [], {'max_length': '2', 'blank': 'True'}),
'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'date_of_birth': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
'display_tag_filter_strategy': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}),
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
'email_isvalid': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'email_key': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True'}),
'email_tag_filter_strategy': ('django.db.models.fields.SmallIntegerField', [], {'default': '1'}),
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'gold': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}),
'gravatar': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'ignored_tags': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'interesting_tags': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'last_seen': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'location': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
'new_response_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
'questions_per_page': ('django.db.models.fields.SmallIntegerField', [], {'default': '10'}),
'real_name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
'reputation': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1'}),
'seen_response_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
'show_country': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'silver': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}),
'status': ('django.db.models.fields.CharField', [], {'default': "'w'", 'max_length': '2'}),
'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}),
'website': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'})
},
'contenttypes.contenttype': {
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
},
'student.pendingemailchange': {
'Meta': {'object_name': 'PendingEmailChange'},
'activation_key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '32', 'db_index': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'new_email': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '255', 'blank': 'True'}),
'user': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['auth.User']", 'unique': 'True'})
},
'student.pendingnamechange': {
'Meta': {'object_name': 'PendingNameChange'},
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'new_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
'rationale': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}),
'user': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['auth.User']", 'unique': 'True'})
},
'student.registration': {
'Meta': {'object_name': 'Registration', 'db_table': "'auth_registration'"},
'activation_key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '32', 'db_index': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'unique': 'True'})
},
'student.userprofile': {
'Meta': {'object_name': 'UserProfile', 'db_table': "'auth_userprofile'"},
'courseware': ('django.db.models.fields.CharField', [], {'default': "'course.xml'", 'max_length': '255', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'language': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '255', 'blank': 'True'}),
'location': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '255', 'blank': 'True'}),
'meta': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '255', 'blank': 'True'}),
'user': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'profile'", 'unique': 'True', 'to': "orm['auth.User']"})
},
'student.usertestgroup': {
'Meta': {'object_name': 'UserTestGroup'},
'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '32', 'db_index': 'True'}),
'users': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.User']", 'db_index': 'True', 'symmetrical': 'False'})
}
}
complete_apps = ['student']
...@@ -12,6 +12,7 @@ import uuid ...@@ -12,6 +12,7 @@ import uuid
from django.db import models from django.db import models
from django.contrib.auth.models import User from django.contrib.auth.models import User
import json
#from cache_toolbox import cache_model, cache_relation #from cache_toolbox import cache_model, cache_relation
...@@ -29,6 +30,18 @@ class UserProfile(models.Model): ...@@ -29,6 +30,18 @@ class UserProfile(models.Model):
meta = models.CharField(blank=True, max_length=255) # JSON dictionary for future expansion meta = models.CharField(blank=True, max_length=255) # JSON dictionary for future expansion
courseware = models.CharField(blank=True, max_length=255, default='course.xml') courseware = models.CharField(blank=True, max_length=255, default='course.xml')
def get_meta(self):
js_str = self.meta
if not js_str:
js_str = dict()
else:
js_str = json.loads(self.meta)
return js_str
def set_meta(self,js):
self.meta = json.dumps(js)
## TODO: Should be renamed to generic UserGroup, and possibly ## TODO: Should be renamed to generic UserGroup, and possibly
# Given an optional field for type of group # Given an optional field for type of group
class UserTestGroup(models.Model): class UserTestGroup(models.Model):
...@@ -58,6 +71,16 @@ class Registration(models.Model): ...@@ -58,6 +71,16 @@ class Registration(models.Model):
self.user.save() self.user.save()
#self.delete() #self.delete()
class PendingNameChange(models.Model):
user = models.OneToOneField(User, unique=True, db_index=True)
new_name = models.CharField(blank=True, max_length=255)
rationale = models.CharField(blank=True, max_length=1024)
class PendingEmailChange(models.Model):
user = models.OneToOneField(User, unique=True, db_index=True)
new_email = models.CharField(blank=True, max_length=255, db_index=True)
activation_key = models.CharField(('activation key'), max_length=32, unique=True, db_index=True)
#cache_relation(User.profile) #cache_relation(User.profile)
#### Helper methods for use from python manage.py shell. #### Helper methods for use from python manage.py shell.
...@@ -88,6 +111,8 @@ def change_name(email, new_name): ...@@ -88,6 +111,8 @@ def change_name(email, new_name):
up.save() up.save()
def user_count(): def user_count():
print "All users", User.objects.all().count()
print "Active users", User.objects.filter(is_active = True).count()
return User.objects.all().count() return User.objects.all().count()
def active_user_count(): def active_user_count():
...@@ -99,12 +124,29 @@ def create_group(name, description): ...@@ -99,12 +124,29 @@ def create_group(name, description):
utg.description = description utg.description = description
utg.save() utg.save()
def add_user_to_group(group, user): def add_user_to_group(user, group):
utg = UserTestGroup.objects.get(name = group) utg = UserTestGroup.objects.get(name = group)
utg.users.add(User.objects.get(username = user)) utg.users.add(User.objects.get(username = user))
utg.save() utg.save()
def remove_user_from_group(group, user): def remove_user_from_group(user, group):
utg = UserTestGroup.objects.get(name = group) utg = UserTestGroup.objects.get(name = group)
utg.users.remove(User.objects.get(username = user)) utg.users.remove(User.objects.get(username = user))
utg.save() utg.save()
default_groups = {'email_future_courses' : 'Receive e-mails about future MITx courses',
'email_helpers' : 'Receive e-mails about how to help with MITx',
'mitx_unenroll' : 'Fully unenrolled -- no further communications',
'6002x_unenroll' : 'Took and dropped 6002x'}
def add_user_to_default_group(user, group):
try:
utg = UserTestGroup.objects.get(name = group)
except UserTestGroup.DoesNotExist:
utg = UserTestGroup()
utg.name = group
utg.description = default_groups[group]
utg.save()
utg.users.add(User.objects.get(username = user))
utg.save()
import datetime
import json import json
import logging import logging
import random import random
import string import string
import sys
import uuid
from django.conf import settings from django.conf import settings
from django.contrib.auth import logout, authenticate, login from django.contrib.auth import logout, authenticate, login
from django.contrib.auth.forms import PasswordResetForm from django.contrib.auth.forms import PasswordResetForm
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.core.context_processors import csrf from django.core.context_processors import csrf
from django.core.validators import validate_email, validate_slug from django.core.mail import send_mail
from django.core.validators import validate_email, validate_slug, ValidationError
from django.db import connection from django.db import connection
from django.http import HttpResponse, Http404 from django.http import HttpResponse, Http404
from django.shortcuts import redirect from django.shortcuts import redirect
from mitxmako.shortcuts import render_to_response, render_to_string from mitxmako.shortcuts import render_to_response, render_to_string
from mako import exceptions
from models import Registration, UserProfile
from django_future.csrf import ensure_csrf_cookie from django_future.csrf import ensure_csrf_cookie
from models import Registration, UserProfile, PendingNameChange, PendingEmailChange
log = logging.getLogger("mitx.user") log = logging.getLogger("mitx.user")
def csrf_token(context): def csrf_token(context):
''' A csrf token that can be included in a form.
'''
csrf_token = context.get('csrf_token', '') csrf_token = context.get('csrf_token', '')
if csrf_token == 'NOTPROVIDED': if csrf_token == 'NOTPROVIDED':
return '' return ''
...@@ -27,6 +35,8 @@ def csrf_token(context): ...@@ -27,6 +35,8 @@ def csrf_token(context):
@ensure_csrf_cookie @ensure_csrf_cookie
def index(request): def index(request):
''' Redirects to main page -- info page if user authenticated, or marketing if not
'''
if settings.COURSEWARE_ENABLED and request.user.is_authenticated(): if settings.COURSEWARE_ENABLED and request.user.is_authenticated():
return redirect('/info') return redirect('/info')
else: else:
...@@ -37,6 +47,7 @@ def index(request): ...@@ -37,6 +47,7 @@ def index(request):
# Need different levels of logging # Need different levels of logging
@ensure_csrf_cookie @ensure_csrf_cookie
def login_user(request, error=""): def login_user(request, error=""):
''' AJAX request to log in the user. '''
if 'email' not in request.POST or 'password' not in request.POST: if 'email' not in request.POST or 'password' not in request.POST:
return HttpResponse(json.dumps({'success':False, return HttpResponse(json.dumps({'success':False,
'error': 'Invalid login'})) # TODO: User error message 'error': 'Invalid login'})) # TODO: User error message
...@@ -78,20 +89,20 @@ def login_user(request, error=""): ...@@ -78,20 +89,20 @@ def login_user(request, error=""):
@ensure_csrf_cookie @ensure_csrf_cookie
def logout_user(request): def logout_user(request):
''' HTTP request to log in the user. Redirects to marketing page'''
logout(request) logout(request)
# print len(connection.queries), connection.queries
return redirect('/') return redirect('/')
@ensure_csrf_cookie @ensure_csrf_cookie
def change_setting(request): def change_setting(request):
''' JSON call to change a profile setting: Right now, location and language
'''
if not request.user.is_authenticated(): if not request.user.is_authenticated():
return redirect('/') return redirect('/')
up = UserProfile.objects.get(user=request.user) #request.user.profile_cache up = UserProfile.objects.get(user=request.user) #request.user.profile_cache
if 'location' in request.POST: if 'location' in request.POST:
# print "loc"
up.location=request.POST['location'] up.location=request.POST['location']
if 'language' in request.POST: if 'language' in request.POST:
# print "lang"
up.language=request.POST['language'] up.language=request.POST['language']
up.save() up.save()
...@@ -101,6 +112,7 @@ def change_setting(request): ...@@ -101,6 +112,7 @@ def change_setting(request):
@ensure_csrf_cookie @ensure_csrf_cookie
def create_account(request, post_override=None): def create_account(request, post_override=None):
''' JSON call to enroll in the course. '''
js={'success':False} js={'success':False}
post_vars = post_override if post_override else request.POST post_vars = post_override if post_override else request.POST
...@@ -111,8 +123,6 @@ def create_account(request, post_override=None): ...@@ -111,8 +123,6 @@ def create_account(request, post_override=None):
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)) return HttpResponse(json.dumps(js))
if post_vars['honor_code']!=u'true': if post_vars['honor_code']!=u'true':
js['value']="To enroll, you must follow the honor code.".format(field=a) js['value']="To enroll, you must follow the honor code.".format(field=a)
return HttpResponse(json.dumps(js)) return HttpResponse(json.dumps(js))
...@@ -140,13 +150,13 @@ def create_account(request, post_override=None): ...@@ -140,13 +150,13 @@ def create_account(request, post_override=None):
try: try:
validate_email(post_vars['email']) validate_email(post_vars['email'])
except: except ValidationError:
js['value']="Valid e-mail is required.".format(field=a) js['value']="Valid e-mail is required.".format(field=a)
return HttpResponse(json.dumps(js)) return HttpResponse(json.dumps(js))
try: try:
validate_slug(post_vars['username']) validate_slug(post_vars['username'])
except: except ValidationError:
js['value']="Username should only consist of A-Z and 0-9.".format(field=a) js['value']="Username should only consist of A-Z and 0-9.".format(field=a)
return HttpResponse(json.dumps(js)) return HttpResponse(json.dumps(js))
...@@ -178,25 +188,24 @@ def create_account(request, post_override=None): ...@@ -178,25 +188,24 @@ def create_account(request, post_override=None):
up.save() up.save()
d={'name':post_vars['name'], d={'name':post_vars['name'],
'key':r.activation_key, 'key':r.activation_key}
'site':settings.SITE_NAME}
subject = render_to_string('activation_email_subject.txt',d) subject = render_to_string('emails/activation_email_subject.txt',d)
# Email subject *must not* contain newlines # Email subject *must not* contain newlines
subject = ''.join(subject.splitlines()) subject = ''.join(subject.splitlines())
message = render_to_string('activation_email.txt',d) message = render_to_string('emails/activation_email.txt',d)
try: try:
if not settings.GENERATE_RANDOM_USER_CREDENTIALS: if 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: except:
js['value']=str(sys.exc_info()) log.exception(sys.exc_info())
js['value']='Could not send activation e-mail.'
return HttpResponse(json.dumps(js)) return HttpResponse(json.dumps(js))
js={'success':True, js={'success':True,
'value':render_to_string('registration/reg_complete.html', {'email':post_vars['email'], 'value':render_to_string('registration/reg_complete.html', {'email':post_vars['email'],
'csrf':csrf(request)['csrf_token']})} 'csrf':csrf(request)['csrf_token']})}
# print len(connection.queries), connection.queries
return HttpResponse(json.dumps(js), mimetype="application/json") return HttpResponse(json.dumps(js), mimetype="application/json")
def create_random_account(create_account_function): def create_random_account(create_account_function):
...@@ -214,8 +223,6 @@ def create_random_account(create_account_function): ...@@ -214,8 +223,6 @@ def create_random_account(create_account_function):
'honor_code' : u'true', 'honor_code' : u'true',
'terms_of_service' : u'true',} 'terms_of_service' : u'true',}
# print "Creating random account: " , post_override
return create_account_function(request, post_override = post_override) return create_account_function(request, post_override = post_override)
return inner_create_random_account return inner_create_random_account
...@@ -225,6 +232,8 @@ if settings.GENERATE_RANDOM_USER_CREDENTIALS: ...@@ -225,6 +232,8 @@ if settings.GENERATE_RANDOM_USER_CREDENTIALS:
@ensure_csrf_cookie @ensure_csrf_cookie
def activate_account(request, key): def activate_account(request, key):
''' When link in activation e-mail is clicked
'''
r=Registration.objects.filter(activation_key=key) r=Registration.objects.filter(activation_key=key)
if len(r)==1: if len(r)==1:
if not r[0].user.is_active: if not r[0].user.is_active:
...@@ -252,3 +261,198 @@ def password_reset(request): ...@@ -252,3 +261,198 @@ def password_reset(request):
else: else:
return HttpResponse(json.dumps({'success':False, return HttpResponse(json.dumps({'success':False,
'error': 'Invalid e-mail'})) 'error': 'Invalid e-mail'}))
@ensure_csrf_cookie
def reactivation_email(request):
''' Send an e-mail to reactivate a deactivated account, or to
resend an activation e-mail. Untested. '''
email = request.POST['email']
try:
user = User.objects.get(email = 'email')
except User.DoesNotExist:
return HttpResponse(json.dumps({'success':False,
'error': 'No inactive user with this e-mail exists'}))
if user.is_active:
return HttpResponse(json.dumps({'success':False,
'error': 'User is already active'}))
reg = Registration.objects.get(user = user)
reg.register(user)
d={'name':UserProfile.get(user = user).name,
'key':r.activation_key}
subject = render_to_string('reactivation_email_subject.txt',d)
subject = ''.join(subject.splitlines())
message = render_to_string('reactivation_email.txt',d)
res=u.email_user(subject, message, settings.DEFAULT_FROM_EMAIL)
return HttpResponse(json.dumps({'success':True}))
@ensure_csrf_cookie
def change_email_request(request):
''' AJAX call from the profile page. User wants a new e-mail.
'''
## Make sure it checks for existing e-mail conflicts
if not request.user.is_authenticated:
raise Http404
user = request.user
if not user.check_password(request.POST['password']):
return HttpResponse(json.dumps({'success':False,
'error':'Invalid password'}))
new_email = request.POST['new_email']
try:
validate_email(new_email)
except ValidationError:
return HttpResponse(json.dumps({'success':False,
'error':'Valid e-mail address required.'}))
if len(User.objects.filter(email = new_email)) != 0:
## CRITICAL TODO: Handle case sensitivity for e-mails
return HttpResponse(json.dumps({'success':False,
'error':'An account with this e-mail already exists.'}))
pec_list = PendingEmailChange.objects.filter(user = request.user)
if len(pec_list) == 0:
pec = PendingEmailChange()
pec.user = user
else :
pec = pec_list[0]
pec.new_email = request.POST['new_email']
pec.activation_key = uuid.uuid4().hex
pec.save()
if pec.new_email == user.email:
pec.delete()
return HttpResponse(json.dumps({'success':False,
'error':'Old email is the same as the new email.'}))
d = {'key':pec.activation_key,
'old_email' : user.email,
'new_email' : pec.new_email}
subject = render_to_string('emails/email_change_subject.txt',d)
subject = ''.join(subject.splitlines())
message = render_to_string('emails/email_change.txt',d)
res=send_mail(subject, message, settings.DEFAULT_FROM_EMAIL, [pec.new_email])
return HttpResponse(json.dumps({'success':True}))
@ensure_csrf_cookie
def confirm_email_change(request, key):
''' User requested a new e-mail. This is called when the activation
link is clicked. We confirm with the old e-mail, and update
'''
try:
pec=PendingEmailChange.objects.get(activation_key=key)
except PendingEmailChange.DoesNotExist:
return render_to_response("invalid_email_key.html", {})
user = pec.user
d = {'old_email' : user.email,
'new_email' : pec.new_email}
if len(User.objects.filter(email = pec.new_email)) != 0:
return render_to_response("email_exists.html", d)
subject = render_to_string('emails/email_change_subject.txt',d)
subject = ''.join(subject.splitlines())
message = render_to_string('emails/confirm_email_change.txt',d)
up = UserProfile.objects.get( user = user )
meta = up.get_meta()
if 'old_emails' not in meta:
meta['old_emails'] = []
meta['old_emails'].append([user.email, datetime.datetime.now().isoformat()])
up.set_meta(meta)
up.save()
user.email = pec.new_email
user.save()
pec.delete()
user.email_user(subject, message, settings.DEFAULT_FROM_EMAIL)
return render_to_response("email_change_successful.html", d)
@ensure_csrf_cookie
def change_name_request(request):
''' Log a request for a new name. '''
if not request.user.is_authenticated:
raise Http404
try:
pnc = PendingNameChange.objects.get(user = request.user)
except PendingNameChange.DoesNotExist:
pnc = PendingNameChange()
pnc.user = request.user
pnc.new_name = request.POST['new_name']
pnc.rationale = request.POST['rationale']
if len(pnc.new_name)<2:
return HttpResponse(json.dumps({'success':False,'error':'Name required'}))
if len(pnc.rationale)<2:
return HttpResponse(json.dumps({'success':False,'error':'Rationale required'}))
pnc.save()
return HttpResponse(json.dumps({'success':True}))
@ensure_csrf_cookie
def pending_name_changes(request):
''' Web page which allows staff to approve or reject name changes. '''
if not request.user.is_staff:
raise Http404
changes = list(PendingNameChange.objects.all())
js = {'students' : [{'new_name': c.new_name,
'rationale':c.rationale,
'old_name':UserProfile.objects.get(user=c.user).name,
'email':c.user.email,
'uid':c.user.id,
'cid':c.id} for c in changes]}
return render_to_response('name_changes.html', js)
@ensure_csrf_cookie
def reject_name_change(request):
''' JSON: Name change process. Course staff clicks 'reject' on a given name change '''
if not request.user.is_staff:
raise Http404
try:
pnc = PendingNameChange.objects.get(id = int(request.POST['id']))
except PendingNameChange.DoesNotExist:
return HttpResponse(json.dumps({'success':False, 'error':'Invalid ID'}))
pnc.delete()
return HttpResponse(json.dumps({'success':True}))
@ensure_csrf_cookie
def accept_name_change(request):
''' JSON: Name change process. Course staff clicks 'accept' on a given name change '''
if not request.user.is_staff:
raise Http404
try:
pnc = PendingNameChange.objects.get(id = int(request.POST['id']))
except PendingNameChange.DoesNotExist:
return HttpResponse(json.dumps({'success':False, 'error':'Invalid ID'}))
u = pnc.user
up = UserProfile.objects.get(user=u)
# Save old name
meta = up.get_meta()
if 'old_names' not in meta:
meta['old_names'] = []
meta['old_names'].append([up.name, pnc.rationale, datetime.datetime.now().isoformat()])
up.set_meta(meta)
up.name = pnc.new_name
up.save()
pnc.delete()
return HttpResponse(json.dumps({'success':True}))
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
# http://www.apache.org/licenses/LICENSE-2.0 # http://www.apache.org/licenses/LICENSE-2.0
# #
# Unless required by applicable law or agreed to in writing, software # Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, # distribuetd under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
from mako.lookup import TemplateLookup from mako.lookup import TemplateLookup
import tempfile import tempfile
from django.template import RequestContext from django.template import RequestContext
from django.conf import settings
requestcontext = None requestcontext = None
lookup = {} lookup = {}
...@@ -44,4 +45,5 @@ class MakoMiddleware(object): ...@@ -44,4 +45,5 @@ class MakoMiddleware(object):
def process_request (self, request): def process_request (self, request):
global requestcontext global requestcontext
requestcontext = RequestContext(request) requestcontext = RequestContext(request)
requestcontext['is_secure'] = request.is_secure()
requestcontext['site'] = settings.SITE_NAME
...@@ -18,18 +18,21 @@ from django.http import HttpResponse ...@@ -18,18 +18,21 @@ from django.http import HttpResponse
import mitxmako.middleware as middleware import mitxmako.middleware as middleware
from django.conf import settings from django.conf import settings
from mitxmako.middleware import requestcontext import mitxmako.middleware
def render_to_string(template_name, dictionary, context_instance=None, namespace='main'): def render_to_string(template_name, dictionary, context=None, namespace='main'):
context_instance = context_instance or Context(dictionary) context_instance = Context(dictionary)
# add dictionary to context_instance # add dictionary to context_instance
context_instance.update(dictionary or {}) context_instance.update(dictionary or {})
# collapse context_instance to a single dictionary for mako # collapse context_instance to a single dictionary for mako
context_dictionary = {} context_dictionary = {}
context_instance['settings'] = settings context_instance['settings'] = settings
context_instance['request_context'] = requestcontext for d in mitxmako.middleware.requestcontext:
context_dictionary.update(d)
for d in context_instance: for d in context_instance:
context_dictionary.update(d) context_dictionary.update(d)
if context:
context_dictionary.update(context)
# fetch and render template # fetch and render template
template = middleware.lookup[namespace].get_template(template_name) template = middleware.lookup[namespace].get_template(template_name)
return template.render(**context_dictionary) return template.render(**context_dictionary)
......
...@@ -117,7 +117,7 @@ input, select { ...@@ -117,7 +117,7 @@ input, select {
font-weight: 800; font-weight: 800;
font-style: italic; } font-style: italic; }
.clearfix:after, .topbar:after, nav.sequence-nav:after, div.book-wrapper section.book nav:after, div.wiki-wrapper section.wiki-body header:after, html body section.main-content:after, html body section.outside-app:after, div.header-wrapper header:after, div.header-wrapper header hgroup:after, div.header-wrapper header nav ul:after, footer:after, li.calc-main div#calculator_wrapper form:after, li.calc-main div#calculator_wrapper form div.input-wrapper:after, div.leanModal_box#enroll ol:after, div.course-wrapper section.course-content .problem-set:after, div.course-wrapper section.course-content section.problems-wrapper:after, div.course-wrapper section.course-content div#seq_content:after, div.course-wrapper section.course-content ol.vert-mod > li:after, section.course-content div.video-subtitles div.video-wrapper section.video-controls:after, section.course-content div.video-subtitles div.video-wrapper section.video-controls div#slider:after, section.course-content nav.sequence-bottom ul:after, div#graph-container:after, div#schematic-container:after, div.book-wrapper section.book nav ul:after, div.info-wrapper section.updates > ol > li:after, div.info-wrapper section.handouts ol li:after, div.profile-wrapper section.course-info > ol > li:after, div#wiki_panel div#wiki_create_form:after, div.wiki-wrapper section.wiki-body:after, ul.badge-list li.badge:after { .clearfix:after, .topbar:after, nav.sequence-nav:after, div.book-wrapper section.book nav:after, div.wiki-wrapper section.wiki-body header:after, html body section.main-content:after, html body section.outside-app:after, div.header-wrapper header:after, div.header-wrapper header hgroup:after, div.header-wrapper header nav ul:after, footer:after, li.calc-main div#calculator_wrapper form:after, li.calc-main div#calculator_wrapper form div.input-wrapper:after, div.leanModal_box#enroll ol:after, div.course-wrapper section.course-content .problem-set:after, div.course-wrapper section.course-content section.problems-wrapper:after, div.course-wrapper section.course-content div#seq_content:after, div.course-wrapper section.course-content ol.vert-mod > li:after, section.course-content div.video-subtitles div.video-wrapper section.video-controls:after, section.course-content div.video-subtitles div.video-wrapper section.video-controls div#slider:after, section.course-content nav.sequence-bottom ul:after, div#graph-container:after, div#schematic-container:after, div.book-wrapper section.book nav ul:after, div.info-wrapper section.updates > ol > li:after, div.info-wrapper section.handouts ol li:after, div.profile-wrapper section.course-info header:after, div.profile-wrapper section.course-info > ol > li:after, div#wiki_panel div#wiki_create_form:after, div.wiki-wrapper section.wiki-body:after, ul.badge-list li.badge:after {
content: "."; content: ".";
display: block; display: block;
height: 0; height: 0;
...@@ -134,7 +134,7 @@ input, select { ...@@ -134,7 +134,7 @@ input, select {
display: table; display: table;
width: 100%; } width: 100%; }
h1.top-header, div.course-wrapper section.course-content h1, div.info-wrapper section.updates > h1, div.profile-wrapper section.course-info > h1, div.gradebook-wrapper section.gradebook-content h1, div.question-list-header { h1.top-header, div.course-wrapper section.course-content h1, div.info-wrapper section.updates > h1, div.profile-wrapper section.course-info header, div.gradebook-wrapper section.gradebook-content h1, div.question-list-header {
background: #f3f3f3; background: #f3f3f3;
border-bottom: 1px solid #e3e3e3; border-bottom: 1px solid #e3e3e3;
margin: -22.652px -22.652px 22.652px; margin: -22.652px -22.652px 22.652px;
...@@ -222,7 +222,7 @@ h1.top-header, div.course-wrapper section.course-content h1, div.info-wrapper se ...@@ -222,7 +222,7 @@ h1.top-header, div.course-wrapper section.course-content h1, div.info-wrapper se
.sidebar a, section.course-index a, div.book-wrapper section.book-sidebar a, div.info-wrapper section.handouts a, div.profile-wrapper section.user-info a, div#wiki_panel a, div.discussion-wrapper aside a { .sidebar a, section.course-index a, div.book-wrapper section.book-sidebar a, div.info-wrapper section.handouts a, div.profile-wrapper section.user-info a, div#wiki_panel a, div.discussion-wrapper aside a {
font-style: normal; font-style: normal;
border: none; } border: none; }
.sidebar .bottom-border, section.course-index .bottom-border, div.book-wrapper section.book-sidebar .bottom-border, div.info-wrapper section.handouts .bottom-border, div.profile-wrapper section.user-info .bottom-border, div#wiki_panel .bottom-border, div.discussion-wrapper aside .bottom-border, .sidebar h3, section.course-index .sidebar h3, .sidebar section.course-index h3, div.book-wrapper section.book-sidebar .sidebar h3, .sidebar div.book-wrapper section.book-sidebar h3, div.info-wrapper section.handouts .sidebar h3, .sidebar div.info-wrapper section.handouts h3, div.profile-wrapper section.user-info .sidebar h3, .sidebar div.profile-wrapper section.user-info h3, div#wiki_panel .sidebar h3, .sidebar div#wiki_panel h3, div.discussion-wrapper aside .sidebar h3, .sidebar div.discussion-wrapper aside h3, .sidebar section.course-index h3, section.course-index .sidebar h3, section.course-index h3, div.book-wrapper section.book-sidebar section.course-index h3, section.course-index div.book-wrapper section.book-sidebar h3, div.info-wrapper section.handouts section.course-index h3, section.course-index div.info-wrapper section.handouts h3, div.profile-wrapper section.user-info section.course-index h3, section.course-index div.profile-wrapper section.user-info h3, div#wiki_panel section.course-index h3, section.course-index div#wiki_panel h3, div.discussion-wrapper aside section.course-index h3, section.course-index div.discussion-wrapper aside h3, .sidebar div.book-wrapper section.book-sidebar h3, div.book-wrapper section.book-sidebar .sidebar h3, section.course-index div.book-wrapper section.book-sidebar h3, div.book-wrapper section.book-sidebar section.course-index h3, div.book-wrapper section.book-sidebar h3, div.info-wrapper section.handouts div.book-wrapper section.book-sidebar h3, div.book-wrapper section.book-sidebar div.info-wrapper section.handouts h3, div.profile-wrapper section.user-info div.book-wrapper section.book-sidebar h3, div.book-wrapper section.book-sidebar div.profile-wrapper section.user-info h3, div#wiki_panel div.book-wrapper section.book-sidebar h3, div.book-wrapper section.book-sidebar div#wiki_panel h3, div.discussion-wrapper aside div.book-wrapper section.book-sidebar h3, div.book-wrapper section.book-sidebar div.discussion-wrapper aside h3, .sidebar div.info-wrapper section.handouts h3, div.info-wrapper section.handouts .sidebar h3, section.course-index div.info-wrapper section.handouts h3, div.info-wrapper section.handouts section.course-index h3, div.book-wrapper section.book-sidebar div.info-wrapper section.handouts h3, div.info-wrapper section.handouts div.book-wrapper section.book-sidebar h3, div.info-wrapper section.handouts h3, div.profile-wrapper section.user-info div.info-wrapper section.handouts h3, div.info-wrapper section.handouts div.profile-wrapper section.user-info h3, div#wiki_panel div.info-wrapper section.handouts h3, div.info-wrapper section.handouts div#wiki_panel h3, div.discussion-wrapper aside div.info-wrapper section.handouts h3, div.info-wrapper section.handouts div.discussion-wrapper aside h3, .sidebar div.profile-wrapper section.user-info h3, div.profile-wrapper section.user-info .sidebar h3, section.course-index div.profile-wrapper section.user-info h3, div.profile-wrapper section.user-info section.course-index h3, div.book-wrapper section.book-sidebar div.profile-wrapper section.user-info h3, div.profile-wrapper section.user-info div.book-wrapper section.book-sidebar h3, div.info-wrapper section.handouts div.profile-wrapper section.user-info h3, div.profile-wrapper section.user-info div.info-wrapper section.handouts h3, div.profile-wrapper section.user-info h3, div#wiki_panel div.profile-wrapper section.user-info h3, div.profile-wrapper section.user-info div#wiki_panel h3, div.discussion-wrapper aside div.profile-wrapper section.user-info h3, div.profile-wrapper section.user-info div.discussion-wrapper aside h3, .sidebar div#wiki_panel h3, div#wiki_panel .sidebar h3, section.course-index div#wiki_panel h3, div#wiki_panel section.course-index h3, div.book-wrapper section.book-sidebar div#wiki_panel h3, div#wiki_panel div.book-wrapper section.book-sidebar h3, div.info-wrapper section.handouts div#wiki_panel h3, div#wiki_panel div.info-wrapper section.handouts h3, div.profile-wrapper section.user-info div#wiki_panel h3, div#wiki_panel div.profile-wrapper section.user-info h3, div#wiki_panel h3, div.discussion-wrapper aside div#wiki_panel h3, div#wiki_panel div.discussion-wrapper aside h3, .sidebar div.discussion-wrapper aside h3, div.discussion-wrapper aside .sidebar h3, section.course-index div.discussion-wrapper aside h3, div.discussion-wrapper aside section.course-index h3, div.book-wrapper section.book-sidebar div.discussion-wrapper aside h3, div.discussion-wrapper aside div.book-wrapper section.book-sidebar h3, div.info-wrapper section.handouts div.discussion-wrapper aside h3, div.discussion-wrapper aside div.info-wrapper section.handouts h3, div.profile-wrapper section.user-info div.discussion-wrapper aside h3, div.discussion-wrapper aside div.profile-wrapper section.user-info h3, div#wiki_panel div.discussion-wrapper aside h3, div.discussion-wrapper aside div#wiki_panel h3, div.discussion-wrapper aside h3, .sidebar div#wiki_panel input[type="button"], section.course-index .sidebar div#wiki_panel input[type="button"], .sidebar div#wiki_panel section.course-index input[type="button"], div.book-wrapper section.book-sidebar .sidebar div#wiki_panel input[type="button"], .sidebar div#wiki_panel div.book-wrapper section.book-sidebar input[type="button"], div.info-wrapper section.handouts .sidebar div#wiki_panel input[type="button"], .sidebar div#wiki_panel div.info-wrapper section.handouts input[type="button"], div.profile-wrapper section.user-info .sidebar div#wiki_panel input[type="button"], .sidebar div#wiki_panel div.profile-wrapper section.user-info input[type="button"], .sidebar div#wiki_panel input[type="button"], div.discussion-wrapper aside .sidebar div#wiki_panel input[type="button"], .sidebar div#wiki_panel div.discussion-wrapper aside input[type="button"], div#wiki_panel .sidebar input[type="button"], section.course-index div#wiki_panel .sidebar input[type="button"], div#wiki_panel .sidebar section.course-index input[type="button"], div.book-wrapper section.book-sidebar div#wiki_panel .sidebar input[type="button"], div#wiki_panel .sidebar div.book-wrapper section.book-sidebar input[type="button"], div.info-wrapper section.handouts div#wiki_panel .sidebar input[type="button"], div#wiki_panel .sidebar div.info-wrapper section.handouts input[type="button"], div.profile-wrapper section.user-info div#wiki_panel .sidebar input[type="button"], div#wiki_panel .sidebar div.profile-wrapper section.user-info input[type="button"], div#wiki_panel .sidebar input[type="button"], div.discussion-wrapper aside div#wiki_panel .sidebar input[type="button"], div#wiki_panel .sidebar div.discussion-wrapper aside input[type="button"], .sidebar section.course-index div#wiki_panel input[type="button"], section.course-index div#wiki_panel .sidebar input[type="button"], section.course-index div#wiki_panel input[type="button"], div.book-wrapper section.book-sidebar section.course-index div#wiki_panel input[type="button"], section.course-index div#wiki_panel div.book-wrapper section.book-sidebar input[type="button"], div.info-wrapper section.handouts section.course-index div#wiki_panel input[type="button"], section.course-index div#wiki_panel div.info-wrapper section.handouts input[type="button"], div.profile-wrapper section.user-info section.course-index div#wiki_panel input[type="button"], section.course-index div#wiki_panel div.profile-wrapper section.user-info input[type="button"], section.course-index div#wiki_panel input[type="button"], div.discussion-wrapper aside section.course-index div#wiki_panel input[type="button"], section.course-index div#wiki_panel div.discussion-wrapper aside input[type="button"], .sidebar div#wiki_panel section.course-index input[type="button"], div#wiki_panel section.course-index .sidebar input[type="button"], div#wiki_panel section.course-index input[type="button"], div.book-wrapper section.book-sidebar div#wiki_panel section.course-index input[type="button"], div#wiki_panel section.course-index div.book-wrapper section.book-sidebar input[type="button"], div.info-wrapper section.handouts div#wiki_panel section.course-index input[type="button"], div#wiki_panel section.course-index div.info-wrapper section.handouts input[type="button"], div.profile-wrapper section.user-info div#wiki_panel section.course-index input[type="button"], div#wiki_panel section.course-index div.profile-wrapper section.user-info input[type="button"], div#wiki_panel section.course-index input[type="button"], div.discussion-wrapper aside div#wiki_panel section.course-index input[type="button"], div#wiki_panel section.course-index div.discussion-wrapper aside input[type="button"], .sidebar div.book-wrapper section.book-sidebar div#wiki_panel input[type="button"], div.book-wrapper section.book-sidebar div#wiki_panel .sidebar input[type="button"], section.course-index div.book-wrapper section.book-sidebar div#wiki_panel input[type="button"], div.book-wrapper section.book-sidebar div#wiki_panel section.course-index input[type="button"], div.book-wrapper section.book-sidebar div#wiki_panel input[type="button"], div.info-wrapper section.handouts div.book-wrapper section.book-sidebar div#wiki_panel input[type="button"], div.book-wrapper section.book-sidebar div#wiki_panel div.info-wrapper section.handouts input[type="button"], div.profile-wrapper section.user-info div.book-wrapper section.book-sidebar div#wiki_panel input[type="button"], div.book-wrapper section.book-sidebar div#wiki_panel div.profile-wrapper section.user-info input[type="button"], div.book-wrapper section.book-sidebar div#wiki_panel input[type="button"], div.discussion-wrapper aside div.book-wrapper section.book-sidebar div#wiki_panel input[type="button"], div.book-wrapper section.book-sidebar div#wiki_panel div.discussion-wrapper aside input[type="button"], .sidebar div#wiki_panel div.book-wrapper section.book-sidebar input[type="button"], div#wiki_panel div.book-wrapper section.book-sidebar .sidebar input[type="button"], section.course-index div#wiki_panel div.book-wrapper section.book-sidebar input[type="button"], div#wiki_panel div.book-wrapper section.book-sidebar section.course-index input[type="button"], div#wiki_panel div.book-wrapper section.book-sidebar input[type="button"], div.info-wrapper section.handouts div#wiki_panel div.book-wrapper section.book-sidebar input[type="button"], div#wiki_panel div.book-wrapper section.book-sidebar div.info-wrapper section.handouts input[type="button"], div.profile-wrapper section.user-info div#wiki_panel div.book-wrapper section.book-sidebar input[type="button"], div#wiki_panel div.book-wrapper section.book-sidebar div.profile-wrapper section.user-info input[type="button"], div#wiki_panel div.book-wrapper section.book-sidebar input[type="button"], div.discussion-wrapper aside div#wiki_panel div.book-wrapper section.book-sidebar input[type="button"], div#wiki_panel div.book-wrapper section.book-sidebar div.discussion-wrapper aside input[type="button"], .sidebar div.info-wrapper section.handouts div#wiki_panel input[type="button"], div.info-wrapper section.handouts div#wiki_panel .sidebar input[type="button"], section.course-index div.info-wrapper section.handouts div#wiki_panel input[type="button"], div.info-wrapper section.handouts div#wiki_panel section.course-index input[type="button"], div.book-wrapper section.book-sidebar div.info-wrapper section.handouts div#wiki_panel input[type="button"], div.info-wrapper section.handouts div#wiki_panel div.book-wrapper section.book-sidebar input[type="button"], div.info-wrapper section.handouts div#wiki_panel input[type="button"], div.profile-wrapper section.user-info div.info-wrapper section.handouts div#wiki_panel input[type="button"], div.info-wrapper section.handouts div#wiki_panel div.profile-wrapper section.user-info input[type="button"], div.info-wrapper section.handouts div#wiki_panel input[type="button"], div.discussion-wrapper aside div.info-wrapper section.handouts div#wiki_panel input[type="button"], div.info-wrapper section.handouts div#wiki_panel div.discussion-wrapper aside input[type="button"], .sidebar div#wiki_panel div.info-wrapper section.handouts input[type="button"], div#wiki_panel div.info-wrapper section.handouts .sidebar input[type="button"], section.course-index div#wiki_panel div.info-wrapper section.handouts input[type="button"], div#wiki_panel div.info-wrapper section.handouts section.course-index input[type="button"], div.book-wrapper section.book-sidebar div#wiki_panel div.info-wrapper section.handouts input[type="button"], div#wiki_panel div.info-wrapper section.handouts div.book-wrapper section.book-sidebar input[type="button"], div#wiki_panel div.info-wrapper section.handouts input[type="button"], div.profile-wrapper section.user-info div#wiki_panel div.info-wrapper section.handouts input[type="button"], div#wiki_panel div.info-wrapper section.handouts div.profile-wrapper section.user-info input[type="button"], div#wiki_panel div.info-wrapper section.handouts input[type="button"], div.discussion-wrapper aside div#wiki_panel div.info-wrapper section.handouts input[type="button"], div#wiki_panel div.info-wrapper section.handouts div.discussion-wrapper aside input[type="button"], .sidebar div.profile-wrapper section.user-info div#wiki_panel input[type="button"], div.profile-wrapper section.user-info div#wiki_panel .sidebar input[type="button"], section.course-index div.profile-wrapper section.user-info div#wiki_panel input[type="button"], div.profile-wrapper section.user-info div#wiki_panel section.course-index input[type="button"], div.book-wrapper section.book-sidebar div.profile-wrapper section.user-info div#wiki_panel input[type="button"], div.profile-wrapper section.user-info div#wiki_panel div.book-wrapper section.book-sidebar input[type="button"], div.info-wrapper section.handouts div.profile-wrapper section.user-info div#wiki_panel input[type="button"], div.profile-wrapper section.user-info div#wiki_panel div.info-wrapper section.handouts input[type="button"], div.profile-wrapper section.user-info div#wiki_panel input[type="button"], div.profile-wrapper section.user-info div#wiki_panel input[type="button"], div.discussion-wrapper aside div.profile-wrapper section.user-info div#wiki_panel input[type="button"], div.profile-wrapper section.user-info div#wiki_panel div.discussion-wrapper aside input[type="button"], .sidebar div#wiki_panel div.profile-wrapper section.user-info input[type="button"], div#wiki_panel div.profile-wrapper section.user-info .sidebar input[type="button"], section.course-index div#wiki_panel div.profile-wrapper section.user-info input[type="button"], div#wiki_panel div.profile-wrapper section.user-info section.course-index input[type="button"], div.book-wrapper section.book-sidebar div#wiki_panel div.profile-wrapper section.user-info input[type="button"], div#wiki_panel div.profile-wrapper section.user-info div.book-wrapper section.book-sidebar input[type="button"], div.info-wrapper section.handouts div#wiki_panel div.profile-wrapper section.user-info input[type="button"], div#wiki_panel div.profile-wrapper section.user-info div.info-wrapper section.handouts input[type="button"], div#wiki_panel div.profile-wrapper section.user-info input[type="button"], div#wiki_panel div.profile-wrapper section.user-info input[type="button"], div.discussion-wrapper aside div#wiki_panel div.profile-wrapper section.user-info input[type="button"], div#wiki_panel div.profile-wrapper section.user-info div.discussion-wrapper aside input[type="button"], .sidebar div#wiki_panel input[type="button"], div#wiki_panel .sidebar input[type="button"], section.course-index div#wiki_panel input[type="button"], div#wiki_panel section.course-index input[type="button"], div.book-wrapper section.book-sidebar div#wiki_panel input[type="button"], div#wiki_panel div.book-wrapper section.book-sidebar input[type="button"], div.info-wrapper section.handouts div#wiki_panel input[type="button"], div#wiki_panel div.info-wrapper section.handouts input[type="button"], div.profile-wrapper section.user-info div#wiki_panel input[type="button"], div#wiki_panel div.profile-wrapper section.user-info input[type="button"], div#wiki_panel input[type="button"], div.discussion-wrapper aside div#wiki_panel input[type="button"], div#wiki_panel div.discussion-wrapper aside input[type="button"], .sidebar div.discussion-wrapper aside div#wiki_panel input[type="button"], div.discussion-wrapper aside div#wiki_panel .sidebar input[type="button"], section.course-index div.discussion-wrapper aside div#wiki_panel input[type="button"], div.discussion-wrapper aside div#wiki_panel section.course-index input[type="button"], div.book-wrapper section.book-sidebar div.discussion-wrapper aside div#wiki_panel input[type="button"], div.discussion-wrapper aside div#wiki_panel div.book-wrapper section.book-sidebar input[type="button"], div.info-wrapper section.handouts div.discussion-wrapper aside div#wiki_panel input[type="button"], div.discussion-wrapper aside div#wiki_panel div.info-wrapper section.handouts input[type="button"], div.profile-wrapper section.user-info div.discussion-wrapper aside div#wiki_panel input[type="button"], div.discussion-wrapper aside div#wiki_panel div.profile-wrapper section.user-info input[type="button"], div.discussion-wrapper aside div#wiki_panel input[type="button"], div.discussion-wrapper aside div#wiki_panel input[type="button"], .sidebar div#wiki_panel div.discussion-wrapper aside input[type="button"], div#wiki_panel div.discussion-wrapper aside .sidebar input[type="button"], section.course-index div#wiki_panel div.discussion-wrapper aside input[type="button"], div#wiki_panel div.discussion-wrapper aside section.course-index input[type="button"], div.book-wrapper section.book-sidebar div#wiki_panel div.discussion-wrapper aside input[type="button"], div#wiki_panel div.discussion-wrapper aside div.book-wrapper section.book-sidebar input[type="button"], div.info-wrapper section.handouts div#wiki_panel div.discussion-wrapper aside input[type="button"], div#wiki_panel div.discussion-wrapper aside div.info-wrapper section.handouts input[type="button"], div.profile-wrapper section.user-info div#wiki_panel div.discussion-wrapper aside input[type="button"], div#wiki_panel div.discussion-wrapper aside div.profile-wrapper section.user-info input[type="button"], div#wiki_panel div.discussion-wrapper aside input[type="button"], div#wiki_panel div.discussion-wrapper aside input[type="button"], .sidebar div.info-wrapper section.handouts h1, div.info-wrapper section.handouts .sidebar h1, section.course-index div.info-wrapper section.handouts h1, div.info-wrapper section.handouts section.course-index h1, div.book-wrapper section.book-sidebar div.info-wrapper section.handouts h1, div.info-wrapper section.handouts div.book-wrapper section.book-sidebar h1, div.info-wrapper section.handouts h1, div.profile-wrapper section.user-info div.info-wrapper section.handouts h1, div.info-wrapper section.handouts div.profile-wrapper section.user-info h1, div#wiki_panel div.info-wrapper section.handouts h1, div.info-wrapper section.handouts div#wiki_panel h1, div.discussion-wrapper aside div.info-wrapper section.handouts h1, div.info-wrapper section.handouts div.discussion-wrapper aside h1, .sidebar div.profile-wrapper section.user-info h1, div.profile-wrapper section.user-info .sidebar h1, section.course-index div.profile-wrapper section.user-info h1, div.profile-wrapper section.user-info section.course-index h1, div.book-wrapper section.book-sidebar div.profile-wrapper section.user-info h1, div.profile-wrapper section.user-info div.book-wrapper section.book-sidebar h1, div.info-wrapper section.handouts div.profile-wrapper section.user-info h1, div.profile-wrapper section.user-info div.info-wrapper section.handouts h1, div.profile-wrapper section.user-info h1, div#wiki_panel div.profile-wrapper section.user-info h1, div.profile-wrapper section.user-info div#wiki_panel h1, div.discussion-wrapper aside div.profile-wrapper section.user-info h1, div.profile-wrapper section.user-info div.discussion-wrapper aside h1, .sidebar div#wiki_panel h2, div#wiki_panel .sidebar h2, section.course-index div#wiki_panel h2, div#wiki_panel section.course-index h2, div.book-wrapper section.book-sidebar div#wiki_panel h2, div#wiki_panel div.book-wrapper section.book-sidebar h2, div.info-wrapper section.handouts div#wiki_panel h2, div#wiki_panel div.info-wrapper section.handouts h2, div.profile-wrapper section.user-info div#wiki_panel h2, div#wiki_panel div.profile-wrapper section.user-info h2, div#wiki_panel h2, div.discussion-wrapper aside div#wiki_panel h2, div#wiki_panel div.discussion-wrapper aside h2, .sidebar div.discussion-wrapper aside h1, div.discussion-wrapper aside .sidebar h1, section.course-index div.discussion-wrapper aside h1, div.discussion-wrapper aside section.course-index h1, div.book-wrapper section.book-sidebar div.discussion-wrapper aside h1, div.discussion-wrapper aside div.book-wrapper section.book-sidebar h1, div.info-wrapper section.handouts div.discussion-wrapper aside h1, div.discussion-wrapper aside div.info-wrapper section.handouts h1, div.profile-wrapper section.user-info div.discussion-wrapper aside h1, div.discussion-wrapper aside div.profile-wrapper section.user-info h1, div#wiki_panel div.discussion-wrapper aside h1, div.discussion-wrapper aside div#wiki_panel h1, div.discussion-wrapper aside h1 { .sidebar .bottom-border, section.course-index .bottom-border, div.book-wrapper section.book-sidebar .bottom-border, div.info-wrapper section.handouts .bottom-border, div.profile-wrapper section.user-info .bottom-border, div#wiki_panel .bottom-border, div.discussion-wrapper aside .bottom-border, .sidebar h3, section.course-index .sidebar h3, .sidebar section.course-index h3, div.book-wrapper section.book-sidebar .sidebar h3, .sidebar div.book-wrapper section.book-sidebar h3, div.info-wrapper section.handouts .sidebar h3, .sidebar div.info-wrapper section.handouts h3, div.profile-wrapper section.user-info .sidebar h3, .sidebar div.profile-wrapper section.user-info h3, div#wiki_panel .sidebar h3, .sidebar div#wiki_panel h3, div.discussion-wrapper aside .sidebar h3, .sidebar div.discussion-wrapper aside h3, .sidebar section.course-index h3, section.course-index .sidebar h3, section.course-index h3, div.book-wrapper section.book-sidebar section.course-index h3, section.course-index div.book-wrapper section.book-sidebar h3, div.info-wrapper section.handouts section.course-index h3, section.course-index div.info-wrapper section.handouts h3, div.profile-wrapper section.user-info section.course-index h3, section.course-index div.profile-wrapper section.user-info h3, div#wiki_panel section.course-index h3, section.course-index div#wiki_panel h3, div.discussion-wrapper aside section.course-index h3, section.course-index div.discussion-wrapper aside h3, .sidebar div.book-wrapper section.book-sidebar h3, div.book-wrapper section.book-sidebar .sidebar h3, section.course-index div.book-wrapper section.book-sidebar h3, div.book-wrapper section.book-sidebar section.course-index h3, div.book-wrapper section.book-sidebar h3, div.info-wrapper section.handouts div.book-wrapper section.book-sidebar h3, div.book-wrapper section.book-sidebar div.info-wrapper section.handouts h3, div.profile-wrapper section.user-info div.book-wrapper section.book-sidebar h3, div.book-wrapper section.book-sidebar div.profile-wrapper section.user-info h3, div#wiki_panel div.book-wrapper section.book-sidebar h3, div.book-wrapper section.book-sidebar div#wiki_panel h3, div.discussion-wrapper aside div.book-wrapper section.book-sidebar h3, div.book-wrapper section.book-sidebar div.discussion-wrapper aside h3, .sidebar div.info-wrapper section.handouts h3, div.info-wrapper section.handouts .sidebar h3, section.course-index div.info-wrapper section.handouts h3, div.info-wrapper section.handouts section.course-index h3, div.book-wrapper section.book-sidebar div.info-wrapper section.handouts h3, div.info-wrapper section.handouts div.book-wrapper section.book-sidebar h3, div.info-wrapper section.handouts h3, div.profile-wrapper section.user-info div.info-wrapper section.handouts h3, div.info-wrapper section.handouts div.profile-wrapper section.user-info h3, div#wiki_panel div.info-wrapper section.handouts h3, div.info-wrapper section.handouts div#wiki_panel h3, div.discussion-wrapper aside div.info-wrapper section.handouts h3, div.info-wrapper section.handouts div.discussion-wrapper aside h3, .sidebar div.profile-wrapper section.user-info h3, div.profile-wrapper section.user-info .sidebar h3, section.course-index div.profile-wrapper section.user-info h3, div.profile-wrapper section.user-info section.course-index h3, div.book-wrapper section.book-sidebar div.profile-wrapper section.user-info h3, div.profile-wrapper section.user-info div.book-wrapper section.book-sidebar h3, div.info-wrapper section.handouts div.profile-wrapper section.user-info h3, div.profile-wrapper section.user-info div.info-wrapper section.handouts h3, div.profile-wrapper section.user-info h3, div#wiki_panel div.profile-wrapper section.user-info h3, div.profile-wrapper section.user-info div#wiki_panel h3, div.discussion-wrapper aside div.profile-wrapper section.user-info h3, div.profile-wrapper section.user-info div.discussion-wrapper aside h3, .sidebar div#wiki_panel h3, div#wiki_panel .sidebar h3, section.course-index div#wiki_panel h3, div#wiki_panel section.course-index h3, div.book-wrapper section.book-sidebar div#wiki_panel h3, div#wiki_panel div.book-wrapper section.book-sidebar h3, div.info-wrapper section.handouts div#wiki_panel h3, div#wiki_panel div.info-wrapper section.handouts h3, div.profile-wrapper section.user-info div#wiki_panel h3, div#wiki_panel div.profile-wrapper section.user-info h3, div#wiki_panel h3, div.discussion-wrapper aside div#wiki_panel h3, div#wiki_panel div.discussion-wrapper aside h3, .sidebar div.discussion-wrapper aside h3, div.discussion-wrapper aside .sidebar h3, section.course-index div.discussion-wrapper aside h3, div.discussion-wrapper aside section.course-index h3, div.book-wrapper section.book-sidebar div.discussion-wrapper aside h3, div.discussion-wrapper aside div.book-wrapper section.book-sidebar h3, div.info-wrapper section.handouts div.discussion-wrapper aside h3, div.discussion-wrapper aside div.info-wrapper section.handouts h3, div.profile-wrapper section.user-info div.discussion-wrapper aside h3, div.discussion-wrapper aside div.profile-wrapper section.user-info h3, div#wiki_panel div.discussion-wrapper aside h3, div.discussion-wrapper aside div#wiki_panel h3, div.discussion-wrapper aside h3, .sidebar div#wiki_panel input[type="button"], section.course-index .sidebar div#wiki_panel input[type="button"], .sidebar div#wiki_panel section.course-index input[type="button"], div.book-wrapper section.book-sidebar .sidebar div#wiki_panel input[type="button"], .sidebar div#wiki_panel div.book-wrapper section.book-sidebar input[type="button"], div.info-wrapper section.handouts .sidebar div#wiki_panel input[type="button"], .sidebar div#wiki_panel div.info-wrapper section.handouts input[type="button"], div.profile-wrapper section.user-info .sidebar div#wiki_panel input[type="button"], .sidebar div#wiki_panel div.profile-wrapper section.user-info input[type="button"], .sidebar div#wiki_panel input[type="button"], div.discussion-wrapper aside .sidebar div#wiki_panel input[type="button"], .sidebar div#wiki_panel div.discussion-wrapper aside input[type="button"], div#wiki_panel .sidebar input[type="button"], section.course-index div#wiki_panel .sidebar input[type="button"], div#wiki_panel .sidebar section.course-index input[type="button"], div.book-wrapper section.book-sidebar div#wiki_panel .sidebar input[type="button"], div#wiki_panel .sidebar div.book-wrapper section.book-sidebar input[type="button"], div.info-wrapper section.handouts div#wiki_panel .sidebar input[type="button"], div#wiki_panel .sidebar div.info-wrapper section.handouts input[type="button"], div.profile-wrapper section.user-info div#wiki_panel .sidebar input[type="button"], div#wiki_panel .sidebar div.profile-wrapper section.user-info input[type="button"], div#wiki_panel .sidebar input[type="button"], div.discussion-wrapper aside div#wiki_panel .sidebar input[type="button"], div#wiki_panel .sidebar div.discussion-wrapper aside input[type="button"], .sidebar section.course-index div#wiki_panel input[type="button"], section.course-index div#wiki_panel .sidebar input[type="button"], section.course-index div#wiki_panel input[type="button"], div.book-wrapper section.book-sidebar section.course-index div#wiki_panel input[type="button"], section.course-index div#wiki_panel div.book-wrapper section.book-sidebar input[type="button"], div.info-wrapper section.handouts section.course-index div#wiki_panel input[type="button"], section.course-index div#wiki_panel div.info-wrapper section.handouts input[type="button"], div.profile-wrapper section.user-info section.course-index div#wiki_panel input[type="button"], section.course-index div#wiki_panel div.profile-wrapper section.user-info input[type="button"], section.course-index div#wiki_panel input[type="button"], div.discussion-wrapper aside section.course-index div#wiki_panel input[type="button"], section.course-index div#wiki_panel div.discussion-wrapper aside input[type="button"], .sidebar div#wiki_panel section.course-index input[type="button"], div#wiki_panel section.course-index .sidebar input[type="button"], div#wiki_panel section.course-index input[type="button"], div.book-wrapper section.book-sidebar div#wiki_panel section.course-index input[type="button"], div#wiki_panel section.course-index div.book-wrapper section.book-sidebar input[type="button"], div.info-wrapper section.handouts div#wiki_panel section.course-index input[type="button"], div#wiki_panel section.course-index div.info-wrapper section.handouts input[type="button"], div.profile-wrapper section.user-info div#wiki_panel section.course-index input[type="button"], div#wiki_panel section.course-index div.profile-wrapper section.user-info input[type="button"], div#wiki_panel section.course-index input[type="button"], div.discussion-wrapper aside div#wiki_panel section.course-index input[type="button"], div#wiki_panel section.course-index div.discussion-wrapper aside input[type="button"], .sidebar div.book-wrapper section.book-sidebar div#wiki_panel input[type="button"], div.book-wrapper section.book-sidebar div#wiki_panel .sidebar input[type="button"], section.course-index div.book-wrapper section.book-sidebar div#wiki_panel input[type="button"], div.book-wrapper section.book-sidebar div#wiki_panel section.course-index input[type="button"], div.book-wrapper section.book-sidebar div#wiki_panel input[type="button"], div.info-wrapper section.handouts div.book-wrapper section.book-sidebar div#wiki_panel input[type="button"], div.book-wrapper section.book-sidebar div#wiki_panel div.info-wrapper section.handouts input[type="button"], div.profile-wrapper section.user-info div.book-wrapper section.book-sidebar div#wiki_panel input[type="button"], div.book-wrapper section.book-sidebar div#wiki_panel div.profile-wrapper section.user-info input[type="button"], div.book-wrapper section.book-sidebar div#wiki_panel input[type="button"], div.discussion-wrapper aside div.book-wrapper section.book-sidebar div#wiki_panel input[type="button"], div.book-wrapper section.book-sidebar div#wiki_panel div.discussion-wrapper aside input[type="button"], .sidebar div#wiki_panel div.book-wrapper section.book-sidebar input[type="button"], div#wiki_panel div.book-wrapper section.book-sidebar .sidebar input[type="button"], section.course-index div#wiki_panel div.book-wrapper section.book-sidebar input[type="button"], div#wiki_panel div.book-wrapper section.book-sidebar section.course-index input[type="button"], div#wiki_panel div.book-wrapper section.book-sidebar input[type="button"], div.info-wrapper section.handouts div#wiki_panel div.book-wrapper section.book-sidebar input[type="button"], div#wiki_panel div.book-wrapper section.book-sidebar div.info-wrapper section.handouts input[type="button"], div.profile-wrapper section.user-info div#wiki_panel div.book-wrapper section.book-sidebar input[type="button"], div#wiki_panel div.book-wrapper section.book-sidebar div.profile-wrapper section.user-info input[type="button"], div#wiki_panel div.book-wrapper section.book-sidebar input[type="button"], div.discussion-wrapper aside div#wiki_panel div.book-wrapper section.book-sidebar input[type="button"], div#wiki_panel div.book-wrapper section.book-sidebar div.discussion-wrapper aside input[type="button"], .sidebar div.info-wrapper section.handouts div#wiki_panel input[type="button"], div.info-wrapper section.handouts div#wiki_panel .sidebar input[type="button"], section.course-index div.info-wrapper section.handouts div#wiki_panel input[type="button"], div.info-wrapper section.handouts div#wiki_panel section.course-index input[type="button"], div.book-wrapper section.book-sidebar div.info-wrapper section.handouts div#wiki_panel input[type="button"], div.info-wrapper section.handouts div#wiki_panel div.book-wrapper section.book-sidebar input[type="button"], div.info-wrapper section.handouts div#wiki_panel input[type="button"], div.profile-wrapper section.user-info div.info-wrapper section.handouts div#wiki_panel input[type="button"], div.info-wrapper section.handouts div#wiki_panel div.profile-wrapper section.user-info input[type="button"], div.info-wrapper section.handouts div#wiki_panel input[type="button"], div.discussion-wrapper aside div.info-wrapper section.handouts div#wiki_panel input[type="button"], div.info-wrapper section.handouts div#wiki_panel div.discussion-wrapper aside input[type="button"], .sidebar div#wiki_panel div.info-wrapper section.handouts input[type="button"], div#wiki_panel div.info-wrapper section.handouts .sidebar input[type="button"], section.course-index div#wiki_panel div.info-wrapper section.handouts input[type="button"], div#wiki_panel div.info-wrapper section.handouts section.course-index input[type="button"], div.book-wrapper section.book-sidebar div#wiki_panel div.info-wrapper section.handouts input[type="button"], div#wiki_panel div.info-wrapper section.handouts div.book-wrapper section.book-sidebar input[type="button"], div#wiki_panel div.info-wrapper section.handouts input[type="button"], div.profile-wrapper section.user-info div#wiki_panel div.info-wrapper section.handouts input[type="button"], div#wiki_panel div.info-wrapper section.handouts div.profile-wrapper section.user-info input[type="button"], div#wiki_panel div.info-wrapper section.handouts input[type="button"], div.discussion-wrapper aside div#wiki_panel div.info-wrapper section.handouts input[type="button"], div#wiki_panel div.info-wrapper section.handouts div.discussion-wrapper aside input[type="button"], .sidebar div.profile-wrapper section.user-info div#wiki_panel input[type="button"], div.profile-wrapper section.user-info div#wiki_panel .sidebar input[type="button"], section.course-index div.profile-wrapper section.user-info div#wiki_panel input[type="button"], div.profile-wrapper section.user-info div#wiki_panel section.course-index input[type="button"], div.book-wrapper section.book-sidebar div.profile-wrapper section.user-info div#wiki_panel input[type="button"], div.profile-wrapper section.user-info div#wiki_panel div.book-wrapper section.book-sidebar input[type="button"], div.info-wrapper section.handouts div.profile-wrapper section.user-info div#wiki_panel input[type="button"], div.profile-wrapper section.user-info div#wiki_panel div.info-wrapper section.handouts input[type="button"], div.profile-wrapper section.user-info div#wiki_panel input[type="button"], div.profile-wrapper section.user-info div#wiki_panel input[type="button"], div.discussion-wrapper aside div.profile-wrapper section.user-info div#wiki_panel input[type="button"], div.profile-wrapper section.user-info div#wiki_panel div.discussion-wrapper aside input[type="button"], .sidebar div#wiki_panel div.profile-wrapper section.user-info input[type="button"], div#wiki_panel div.profile-wrapper section.user-info .sidebar input[type="button"], section.course-index div#wiki_panel div.profile-wrapper section.user-info input[type="button"], div#wiki_panel div.profile-wrapper section.user-info section.course-index input[type="button"], div.book-wrapper section.book-sidebar div#wiki_panel div.profile-wrapper section.user-info input[type="button"], div#wiki_panel div.profile-wrapper section.user-info div.book-wrapper section.book-sidebar input[type="button"], div.info-wrapper section.handouts div#wiki_panel div.profile-wrapper section.user-info input[type="button"], div#wiki_panel div.profile-wrapper section.user-info div.info-wrapper section.handouts input[type="button"], div#wiki_panel div.profile-wrapper section.user-info input[type="button"], div#wiki_panel div.profile-wrapper section.user-info input[type="button"], div.discussion-wrapper aside div#wiki_panel div.profile-wrapper section.user-info input[type="button"], div#wiki_panel div.profile-wrapper section.user-info div.discussion-wrapper aside input[type="button"], .sidebar div#wiki_panel input[type="button"], div#wiki_panel .sidebar input[type="button"], section.course-index div#wiki_panel input[type="button"], div#wiki_panel section.course-index input[type="button"], div.book-wrapper section.book-sidebar div#wiki_panel input[type="button"], div#wiki_panel div.book-wrapper section.book-sidebar input[type="button"], div.info-wrapper section.handouts div#wiki_panel input[type="button"], div#wiki_panel div.info-wrapper section.handouts input[type="button"], div.profile-wrapper section.user-info div#wiki_panel input[type="button"], div#wiki_panel div.profile-wrapper section.user-info input[type="button"], div#wiki_panel input[type="button"], div.discussion-wrapper aside div#wiki_panel input[type="button"], div#wiki_panel div.discussion-wrapper aside input[type="button"], .sidebar div.discussion-wrapper aside div#wiki_panel input[type="button"], div.discussion-wrapper aside div#wiki_panel .sidebar input[type="button"], section.course-index div.discussion-wrapper aside div#wiki_panel input[type="button"], div.discussion-wrapper aside div#wiki_panel section.course-index input[type="button"], div.book-wrapper section.book-sidebar div.discussion-wrapper aside div#wiki_panel input[type="button"], div.discussion-wrapper aside div#wiki_panel div.book-wrapper section.book-sidebar input[type="button"], div.info-wrapper section.handouts div.discussion-wrapper aside div#wiki_panel input[type="button"], div.discussion-wrapper aside div#wiki_panel div.info-wrapper section.handouts input[type="button"], div.profile-wrapper section.user-info div.discussion-wrapper aside div#wiki_panel input[type="button"], div.discussion-wrapper aside div#wiki_panel div.profile-wrapper section.user-info input[type="button"], div.discussion-wrapper aside div#wiki_panel input[type="button"], div.discussion-wrapper aside div#wiki_panel input[type="button"], .sidebar div#wiki_panel div.discussion-wrapper aside input[type="button"], div#wiki_panel div.discussion-wrapper aside .sidebar input[type="button"], section.course-index div#wiki_panel div.discussion-wrapper aside input[type="button"], div#wiki_panel div.discussion-wrapper aside section.course-index input[type="button"], div.book-wrapper section.book-sidebar div#wiki_panel div.discussion-wrapper aside input[type="button"], div#wiki_panel div.discussion-wrapper aside div.book-wrapper section.book-sidebar input[type="button"], div.info-wrapper section.handouts div#wiki_panel div.discussion-wrapper aside input[type="button"], div#wiki_panel div.discussion-wrapper aside div.info-wrapper section.handouts input[type="button"], div.profile-wrapper section.user-info div#wiki_panel div.discussion-wrapper aside input[type="button"], div#wiki_panel div.discussion-wrapper aside div.profile-wrapper section.user-info input[type="button"], div#wiki_panel div.discussion-wrapper aside input[type="button"], div#wiki_panel div.discussion-wrapper aside input[type="button"], .sidebar div.info-wrapper section.handouts h1, div.info-wrapper section.handouts .sidebar h1, section.course-index div.info-wrapper section.handouts h1, div.info-wrapper section.handouts section.course-index h1, div.book-wrapper section.book-sidebar div.info-wrapper section.handouts h1, div.info-wrapper section.handouts div.book-wrapper section.book-sidebar h1, div.info-wrapper section.handouts h1, div.profile-wrapper section.user-info div.info-wrapper section.handouts h1, div.info-wrapper section.handouts div.profile-wrapper section.user-info h1, div#wiki_panel div.info-wrapper section.handouts h1, div.info-wrapper section.handouts div#wiki_panel h1, div.discussion-wrapper aside div.info-wrapper section.handouts h1, div.info-wrapper section.handouts div.discussion-wrapper aside h1, .sidebar div.profile-wrapper section.user-info header, div.profile-wrapper section.user-info .sidebar header, section.course-index div.profile-wrapper section.user-info header, div.profile-wrapper section.user-info section.course-index header, div.book-wrapper section.book-sidebar div.profile-wrapper section.user-info header, div.profile-wrapper section.user-info div.book-wrapper section.book-sidebar header, div.info-wrapper section.handouts div.profile-wrapper section.user-info header, div.profile-wrapper section.user-info div.info-wrapper section.handouts header, div.profile-wrapper section.user-info header, div#wiki_panel div.profile-wrapper section.user-info header, div.profile-wrapper section.user-info div#wiki_panel header, div.discussion-wrapper aside div.profile-wrapper section.user-info header, div.profile-wrapper section.user-info div.discussion-wrapper aside header, .sidebar div#wiki_panel h2, div#wiki_panel .sidebar h2, section.course-index div#wiki_panel h2, div#wiki_panel section.course-index h2, div.book-wrapper section.book-sidebar div#wiki_panel h2, div#wiki_panel div.book-wrapper section.book-sidebar h2, div.info-wrapper section.handouts div#wiki_panel h2, div#wiki_panel div.info-wrapper section.handouts h2, div.profile-wrapper section.user-info div#wiki_panel h2, div#wiki_panel div.profile-wrapper section.user-info h2, div#wiki_panel h2, div.discussion-wrapper aside div#wiki_panel h2, div#wiki_panel div.discussion-wrapper aside h2, .sidebar div.discussion-wrapper aside h1, div.discussion-wrapper aside .sidebar h1, section.course-index div.discussion-wrapper aside h1, div.discussion-wrapper aside section.course-index h1, div.book-wrapper section.book-sidebar div.discussion-wrapper aside h1, div.discussion-wrapper aside div.book-wrapper section.book-sidebar h1, div.info-wrapper section.handouts div.discussion-wrapper aside h1, div.discussion-wrapper aside div.info-wrapper section.handouts h1, div.profile-wrapper section.user-info div.discussion-wrapper aside h1, div.discussion-wrapper aside div.profile-wrapper section.user-info h1, div#wiki_panel div.discussion-wrapper aside h1, div.discussion-wrapper aside div#wiki_panel h1, div.discussion-wrapper aside h1 {
-webkit-box-shadow: 0 1px 0 #eeeeee; -webkit-box-shadow: 0 1px 0 #eeeeee;
-moz-box-shadow: 0 1px 0 #eeeeee; -moz-box-shadow: 0 1px 0 #eeeeee;
box-shadow: 0 1px 0 #eeeeee; box-shadow: 0 1px 0 #eeeeee;
...@@ -848,7 +848,8 @@ div.leanModal_box { ...@@ -848,7 +848,8 @@ div.leanModal_box {
-moz-box-sizing: border-box; -moz-box-sizing: border-box;
box-sizing: border-box; box-sizing: border-box;
display: none; display: none;
padding: 45.304px; } padding: 45.304px;
text-align: left; }
div.leanModal_box a.modal_close { div.leanModal_box a.modal_close {
color: #aaa; color: #aaa;
display: block; display: block;
...@@ -1008,6 +1009,23 @@ div#pwd_reset p { ...@@ -1008,6 +1009,23 @@ div#pwd_reset p {
div#pwd_reset input[type="email"] { div#pwd_reset input[type="email"] {
margin-bottom: 22.652px; } margin-bottom: 22.652px; }
div#apply_name_change, div#change_email, div#unenroll, div#deactivate-account {
max-width: 700px; }
div#apply_name_change ul, div#change_email ul, div#unenroll ul, div#deactivate-account ul {
list-style: none; }
div#apply_name_change ul li, div#change_email ul li, div#unenroll ul li, div#deactivate-account ul li {
margin-bottom: 11.326px; }
div#apply_name_change ul li textarea, div#apply_name_change ul li input[type="email"], div#apply_name_change ul li input[type="number"], div#apply_name_change ul li input[type="password"], div#apply_name_change ul li input[type="search"], div#apply_name_change ul li input[type="tel"], div#apply_name_change ul li input[type="text"], div#apply_name_change ul li input[type="url"], div#apply_name_change ul li input[type="color"], div#apply_name_change ul li input[type="date"], div#apply_name_change ul li input[type="datetime"], div#apply_name_change ul li input[type="datetime-local"], div#apply_name_change ul li input[type="month"], div#apply_name_change ul li input[type="time"], div#apply_name_change ul li input[type="week"], div#change_email ul li textarea, div#change_email ul li input[type="email"], div#change_email ul li input[type="number"], div#change_email ul li input[type="password"], div#change_email ul li input[type="search"], div#change_email ul li input[type="tel"], div#change_email ul li input[type="text"], div#change_email ul li input[type="url"], div#change_email ul li input[type="color"], div#change_email ul li input[type="date"], div#change_email ul li input[type="datetime"], div#change_email ul li input[type="datetime-local"], div#change_email ul li input[type="month"], div#change_email ul li input[type="time"], div#change_email ul li input[type="week"], div#unenroll ul li textarea, div#unenroll ul li input[type="email"], div#unenroll ul li input[type="number"], div#unenroll ul li input[type="password"], div#unenroll ul li input[type="search"], div#unenroll ul li input[type="tel"], div#unenroll ul li input[type="text"], div#unenroll ul li input[type="url"], div#unenroll ul li input[type="color"], div#unenroll ul li input[type="date"], div#unenroll ul li input[type="datetime"], div#unenroll ul li input[type="datetime-local"], div#unenroll ul li input[type="month"], div#unenroll ul li input[type="time"], div#unenroll ul li input[type="week"], div#deactivate-account ul li textarea, div#deactivate-account ul li input[type="email"], div#deactivate-account ul li input[type="number"], div#deactivate-account ul li input[type="password"], div#deactivate-account ul li input[type="search"], div#deactivate-account ul li input[type="tel"], div#deactivate-account ul li input[type="text"], div#deactivate-account ul li input[type="url"], div#deactivate-account ul li input[type="color"], div#deactivate-account ul li input[type="date"], div#deactivate-account ul li input[type="datetime"], div#deactivate-account ul li input[type="datetime-local"], div#deactivate-account ul li input[type="month"], div#deactivate-account ul li input[type="time"], div#deactivate-account ul li input[type="week"] {
display: block;
width: 100%;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box; }
div#apply_name_change ul li textarea, div#change_email ul li textarea, div#unenroll ul li textarea, div#deactivate-account ul li textarea {
height: 60px; }
div#apply_name_change ul li input[type="submit"], div#change_email ul li input[type="submit"], div#unenroll ul li input[type="submit"], div#deactivate-account ul li input[type="submit"] {
white-space: normal; }
div#feedback_div form ol li { div#feedback_div form ol li {
float: none; float: none;
width: 100%; } width: 100%; }
...@@ -3420,10 +3438,22 @@ div.profile-wrapper section.user-info { ...@@ -3420,10 +3438,22 @@ div.profile-wrapper section.user-info {
border-radius: 0px 4px 4px 0; border-radius: 0px 4px 4px 0;
border-left: 1px solid #d3d3d3; border-left: 1px solid #d3d3d3;
border-right: 0; } border-right: 0; }
div.profile-wrapper section.user-info h1 { div.profile-wrapper section.user-info header {
padding: 11.326px 22.652px; padding: 11.326px 22.652px;
font-size: 18px;
margin: 0; } margin: 0; }
div.profile-wrapper section.user-info header h1 {
font-size: 18px;
margin: 0;
padding-right: 30px; }
div.profile-wrapper section.user-info header a {
position: absolute;
top: 13px;
right: 11.326px;
text-transform: uppercase;
font-size: 12px;
color: #999; }
div.profile-wrapper section.user-info header a:hover {
color: #555; }
div.profile-wrapper section.user-info ul { div.profile-wrapper section.user-info ul {
list-style: none; } list-style: none; }
div.profile-wrapper section.user-info ul li { div.profile-wrapper section.user-info ul li {
...@@ -3477,18 +3507,55 @@ div.profile-wrapper section.user-info ul li div#location_sub:empty, div.profile- ...@@ -3477,18 +3507,55 @@ div.profile-wrapper section.user-info ul li div#location_sub:empty, div.profile-
padding: 0; } padding: 0; }
div.profile-wrapper section.user-info ul li div#description { div.profile-wrapper section.user-info ul li div#description {
font-size: 12px; } font-size: 12px; }
div.profile-wrapper section.user-info ul li a#change_language, div.profile-wrapper section.user-info ul li a#change_location { div.profile-wrapper section.user-info ul li a#change_language, div.profile-wrapper section.user-info ul li a#change_location, div.profile-wrapper section.user-info ul li a.edit-email, div.profile-wrapper section.user-info ul li a.name-edit, div.profile-wrapper section.user-info ul li a.email-edit {
position: absolute; position: absolute;
top: 9px; top: 9px;
right: 11.326px; right: 11.326px;
text-transform: uppercase; text-transform: uppercase;
font-size: 12px; font-size: 12px;
color: #999; } color: #999; }
div.profile-wrapper section.user-info ul li a#change_language:hover, div.profile-wrapper section.user-info ul li a#change_location:hover { div.profile-wrapper section.user-info ul li a#change_language:hover, div.profile-wrapper section.user-info ul li a#change_location:hover, div.profile-wrapper section.user-info ul li a.edit-email:hover, div.profile-wrapper section.user-info ul li a.name-edit:hover, div.profile-wrapper section.user-info ul li a.email-edit:hover {
color: #555; }
div.profile-wrapper section.user-info ul li p {
font-size: 12px;
margin-bottom: 0;
margin-top: 4px;
color: #999; }
div.profile-wrapper section.user-info ul li a.deactivate {
color: #aaa;
font-style: italic; }
div.profile-wrapper section.user-info ul li input {
background: none;
border: none;
-webkit-box-shadow: none;
-moz-box-shadow: none;
box-shadow: none;
color: #999;
font-size: 12px;
font-weight: normal;
margin: 0;
padding: 0;
position: absolute;
right: 11.326px;
text-transform: uppercase;
top: 9px; }
div.profile-wrapper section.user-info ul li input:hover {
color: #555; } color: #555; }
div.profile-wrapper section.user-info div#change_password_pop { div.profile-wrapper section.user-info div#change_password_pop {
padding: 7px 22.652px; border-bottom: 1px solid #d3d3d3;
color: #4D4D4D; } -webkit-box-shadow: 0 1px 0 #eeeeee;
-moz-box-shadow: 0 1px 0 #eeeeee;
box-shadow: 0 1px 0 #eeeeee;
color: #4D4D4D;
padding: 7px 22.652px; }
div.profile-wrapper section.user-info div#change_password_pop h2 {
margin-top: 0;
font-weight: bold;
text-transform: uppercase;
font-size: 14px; }
div.profile-wrapper section.course-info header h1 {
margin: 0;
float: left; }
div.profile-wrapper section.course-info div#grade-detail-graph { div.profile-wrapper section.course-info div#grade-detail-graph {
width: 100%; width: 100%;
min-height: 300px; } min-height: 300px; }
......
...@@ -5,18 +5,7 @@ Last Updated: 2010-09-17 ...@@ -5,18 +5,7 @@ Last Updated: 2010-09-17
Author: Richard Clark - http://richclarkdesign.com Author: Richard Clark - http://richclarkdesign.com
Twitter: @rich_clark Twitter: @rich_clark
*/ */
html, body, div, span, object, iframe, html, body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, abbr, address, cite, code, del, dfn, em, img, ins, kbd, q, samp, small, strong, var, b, i, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, figcaption, figure, footer, header, hgroup, menu, nav, section, summary, time, mark, audio, video {
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
abbr, address, cite, code,
del, dfn, em, img, ins, kbd, q, samp,
small, strong, var,
b, i,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td,
article, aside, canvas, details, figcaption, figure,
footer, header, hgroup, menu, nav, section, summary,
time, mark, audio, video {
margin: 0; margin: 0;
padding: 0; padding: 0;
border: 0; border: 0;
...@@ -28,8 +17,7 @@ time, mark, audio, video { ...@@ -28,8 +17,7 @@ time, mark, audio, video {
body { body {
line-height: 1; } line-height: 1; }
article, aside, details, figcaption, figure, article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section {
footer, header, hgroup, menu, nav, section {
display: block; } display: block; }
nav ul { nav ul {
...@@ -38,8 +26,7 @@ nav ul { ...@@ -38,8 +26,7 @@ nav ul {
blockquote, q { blockquote, q {
quotes: none; } quotes: none; }
blockquote:before, blockquote:after, blockquote:before, blockquote:after, q:before, q:after {
q:before, q:after {
content: ''; content: '';
content: none; } content: none; }
...@@ -140,27 +127,27 @@ input, select { ...@@ -140,27 +127,27 @@ input, select {
.subpage > div, section.copyright > div, section.tos > div, section.privacy-policy > div, section.honor-code > div { .subpage > div, section.copyright > div, section.tos > div, section.privacy-policy > div, section.honor-code > div {
padding-left: 34.171%; } padding-left: 34.171%; }
@media screen and (max-width: 940px) { @media screen and (max-width: 940px) {
.subpage > div, section.copyright > div, section.tos > div, section.privacy-policy > div, section.honor-code > div { .subpage > div, section.copyright > div, section.tos > div, section.privacy-policy > div, section.honor-code > div {
padding-left: 0; } } padding-left: 0; } }
.subpage > div p, section.copyright > div p, section.tos > div p, section.privacy-policy > div p, section.honor-code > div p { .subpage > div p, section.copyright > div p, section.tos > div p, section.privacy-policy > div p, section.honor-code > div p {
margin-bottom: 25.888px; margin-bottom: 25.888px;
line-height: 25.888px; } line-height: 25.888px; }
.subpage > div h1, section.copyright > div h1, section.tos > div h1, section.privacy-policy > div h1, section.honor-code > div h1 { .subpage > div h1, section.copyright > div h1, section.tos > div h1, section.privacy-policy > div h1, section.honor-code > div h1 {
margin-bottom: 12.944px; } margin-bottom: 12.944px; }
.subpage > div h2, section.copyright > div h2, section.tos > div h2, section.privacy-policy > div h2, section.honor-code > div h2 { .subpage > div h2, section.copyright > div h2, section.tos > div h2, section.privacy-policy > div h2, section.honor-code > div h2 {
font: 18px "Open Sans", Helvetica, Arial, sans-serif; font: 18px "Open Sans", Helvetica, Arial, sans-serif;
color: #000; color: #000;
margin-bottom: 12.944px; } margin-bottom: 12.944px; }
.subpage > div ul, section.copyright > div ul, section.tos > div ul, section.privacy-policy > div ul, section.honor-code > div ul { .subpage > div ul, section.copyright > div ul, section.tos > div ul, section.privacy-policy > div ul, section.honor-code > div ul {
list-style: disc outside none; } list-style: disc outside none; }
.subpage > div ul li, section.copyright > div ul li, section.tos > div ul li, section.privacy-policy > div ul li, section.honor-code > div ul li { .subpage > div ul li, section.copyright > div ul li, section.tos > div ul li, section.privacy-policy > div ul li, section.honor-code > div ul li {
list-style: disc outside none; list-style: disc outside none;
line-height: 25.888px; } line-height: 25.888px; }
.subpage > div dl, section.copyright > div dl, section.tos > div dl, section.privacy-policy > div dl, section.honor-code > div dl { .subpage > div dl, section.copyright > div dl, section.tos > div dl, section.privacy-policy > div dl, section.honor-code > div dl {
margin-bottom: 25.888px; } margin-bottom: 25.888px; }
.subpage > div dl dd, section.copyright > div dl dd, section.tos > div dl dd, section.privacy-policy > div dl dd, section.honor-code > div dl dd { .subpage > div dl dd, section.copyright > div dl dd, section.tos > div dl dd, section.privacy-policy > div dl dd, section.honor-code > div dl dd {
margin-bottom: 12.944px; } margin-bottom: 12.944px; }
.clearfix:after, .subpage:after, section.copyright:after, section.tos:after, section.privacy-policy:after, section.honor-code:after, header.announcement div section:after, footer:after, section.index-content:after, section.index-content section:after, section.index-content section.about section:after, div.leanModal_box#enroll ol:after { .clearfix:after, .subpage:after, section.copyright:after, section.tos:after, section.privacy-policy:after, section.honor-code:after, header.announcement div section:after, footer:after, section.index-content:after, section.index-content section:after, section.index-content section.about section:after, div.leanModal_box#enroll ol:after {
content: "."; content: ".";
...@@ -213,12 +200,12 @@ input, select { ...@@ -213,12 +200,12 @@ input, select {
-moz-box-shadow: inset 0 1px 0 #b83d3d; -moz-box-shadow: inset 0 1px 0 #b83d3d;
box-shadow: inset 0 1px 0 #b83d3d; box-shadow: inset 0 1px 0 #b83d3d;
-webkit-font-smoothing: antialiased; } -webkit-font-smoothing: antialiased; }
.button:hover, header.announcement div section.course section a:hover, section.index-content section.course a:hover, section.index-content section.staff a:hover, section.index-content section.about-course section.cta a.enroll:hover { .button:hover, header.announcement div section.course section a:hover, section.index-content section.course a:hover, section.index-content section.staff a:hover, section.index-content section.about-course section.cta a.enroll:hover {
background-color: #732626; background-color: #732626;
border-color: #4d1919; } border-color: #4d1919; }
.button span, header.announcement div section.course section a span, section.index-content section.course a span, section.index-content section.staff a span, section.index-content section.about-course section.cta a.enroll span { .button span, header.announcement div section.course section a span, section.index-content section.course a span, section.index-content section.staff a span, section.index-content section.about-course section.cta a.enroll span {
font-family: Garamond, Baskerville, "Baskerville Old Face", "Hoefler Text", "Times New Roman", serif; font-family: Garamond, Baskerville, "Baskerville Old Face", "Hoefler Text", "Times New Roman", serif;
font-style: italic; } font-style: italic; }
p.ie-warning { p.ie-warning {
display: block !important; display: block !important;
...@@ -231,37 +218,37 @@ body { ...@@ -231,37 +218,37 @@ body {
background-color: #fff; background-color: #fff;
color: #444; color: #444;
font: 16px Georgia, serif; } font: 16px Georgia, serif; }
body :focus { body :focus {
outline-color: #ccc; } outline-color: #ccc; }
body h1 { body h1 {
font: 800 24px "Open Sans", Helvetica, Arial, sans-serif; } font: 800 24px "Open Sans", Helvetica, Arial, sans-serif; }
body li { body li {
margin-bottom: 25.888px; } margin-bottom: 25.888px; }
body em { body em {
font-style: italic; } font-style: italic; }
body a { body a {
color: #993333; color: #993333;
font-style: italic; font-style: italic;
text-decoration: none; } text-decoration: none; }
body a:hover, body a:focus { body a:hover, body a:focus {
color: #732626; } color: #732626; }
body input[type="email"], body input[type="number"], body input[type="password"], body input[type="search"], body input[type="tel"], body input[type="text"], body input[type="url"], body input[type="color"], body input[type="date"], body input[type="datetime"], body input[type="datetime-local"], body input[type="month"], body input[type="time"], body input[type="week"], body textarea { body input[type="email"], body input[type="number"], body input[type="password"], body input[type="search"], body input[type="tel"], body input[type="text"], body input[type="url"], body input[type="color"], body input[type="date"], body input[type="datetime"], body input[type="datetime-local"], body input[type="month"], body input[type="time"], body input[type="week"], body textarea {
-webkit-box-shadow: 0 -1px 0 white; -webkit-box-shadow: 0 -1px 0 white;
-moz-box-shadow: 0 -1px 0 white; -moz-box-shadow: 0 -1px 0 white;
box-shadow: 0 -1px 0 white; box-shadow: 0 -1px 0 white;
background-color: #eeeeee; background-color: #eeeeee;
background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #eeeeee), color-stop(100%, white)); background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #eeeeee), color-stop(100%, white));
background-image: -webkit-linear-gradient(top, #eeeeee, white); background-image: -webkit-linear-gradient(top, #eeeeee, white);
background-image: -moz-linear-gradient(top, #eeeeee, white); background-image: -moz-linear-gradient(top, #eeeeee, white);
background-image: -ms-linear-gradient(top, #eeeeee, white); background-image: -ms-linear-gradient(top, #eeeeee, white);
background-image: -o-linear-gradient(top, #eeeeee, white); background-image: -o-linear-gradient(top, #eeeeee, white);
background-image: linear-gradient(top, #eeeeee, white); background-image: linear-gradient(top, #eeeeee, white);
border: 1px solid #999; border: 1px solid #999;
font: 16px Georgia, serif; font: 16px Georgia, serif;
padding: 4px; padding: 4px;
width: 100%; } width: 100%; }
body input[type="email"]:focus, body input[type="number"]:focus, body input[type="password"]:focus, body input[type="search"]:focus, body input[type="tel"]:focus, body input[type="text"]:focus, body input[type="url"]:focus, body input[type="color"]:focus, body input[type="date"]:focus, body input[type="datetime"]:focus, body input[type="datetime-local"]:focus, body input[type="month"]:focus, body input[type="time"]:focus, body input[type="week"]:focus, body textarea:focus { body input[type="email"]:focus, body input[type="number"]:focus, body input[type="password"]:focus, body input[type="search"]:focus, body input[type="tel"]:focus, body input[type="text"]:focus, body input[type="url"]:focus, body input[type="color"]:focus, body input[type="date"]:focus, body input[type="datetime"]:focus, body input[type="datetime-local"]:focus, body input[type="month"]:focus, body input[type="time"]:focus, body input[type="week"]:focus, body textarea:focus {
border-color: #993333; } border-color: #993333; }
header.announcement { header.announcement {
-webkit-background-size: cover; -webkit-background-size: cover;
...@@ -273,474 +260,474 @@ header.announcement { ...@@ -273,474 +260,474 @@ header.announcement {
border-bottom: 1px solid #000; border-bottom: 1px solid #000;
color: #fff; color: #fff;
-webkit-font-smoothing: antialiased; } -webkit-font-smoothing: antialiased; }
header.announcement.home {
background: #e3e3e3 url("/static/images/marketing/shot-5-medium.jpg"); }
@media screen and (min-width: 1200px) {
header.announcement.home { header.announcement.home {
background: #e3e3e3 url("/static/images/marketing/shot-5-medium.jpg"); } background: #e3e3e3 url("/static/images/marketing/shot-5-large.jpg"); } }
@media screen and (min-width: 1200px) { header.announcement.home div {
header.announcement.home { padding: 258.88px 25.888px 77.664px; }
background: #e3e3e3 url("/static/images/marketing/shot-5-large.jpg"); } } @media screen and (max-width:780px) {
header.announcement.home div { header.announcement.home div {
padding: 258.88px 25.888px 77.664px; } padding: 64.72px 25.888px 51.776px; } }
@media screen and (max-width:780px) { header.announcement.home div nav h1 {
header.announcement.home div { margin-right: 0; }
padding: 64.72px 25.888px 51.776px; } } header.announcement.home div nav a.login {
header.announcement.home div nav h1 { display: none; }
margin-right: 0; } header.announcement.course {
header.announcement.home div nav a.login { background: #e3e3e3 url("/static/images/marketing/course-bg-small.jpg"); }
display: none; } @media screen and (min-width: 1200px) {
header.announcement.course {
background: #e3e3e3 url("/static/images/marketing/course-bg-large.jpg"); } }
@media screen and (max-width: 1199px) and (min-width: 700px) {
header.announcement.course { header.announcement.course {
background: #e3e3e3 url("/static/images/marketing/course-bg-small.jpg"); } background: #e3e3e3 url("/static/images/marketing/course-bg-medium.jpg"); } }
@media screen and (min-width: 1200px) { header.announcement.course div {
header.announcement.course { padding: 103.552px 25.888px 51.776px; }
background: #e3e3e3 url("/static/images/marketing/course-bg-large.jpg"); } } @media screen and (max-width:780px) {
@media screen and (max-width: 1199px) and (min-width: 700px) { header.announcement.course div {
header.announcement.course { padding: 64.72px 25.888px 51.776px; } }
background: #e3e3e3 url("/static/images/marketing/course-bg-medium.jpg"); } } header.announcement div {
header.announcement.course div { position: relative; }
padding: 103.552px 25.888px 51.776px; } header.announcement div nav {
@media screen and (max-width:780px) { position: absolute;
header.announcement.course div { top: 0;
padding: 64.72px 25.888px 51.776px; } } right: 25.888px;
header.announcement div { -webkit-border-radius: 0 0 3px 3px;
position: relative; } -moz-border-radius: 0 0 3px 3px;
header.announcement div nav { -ms-border-radius: 0 0 3px 3px;
position: absolute; -o-border-radius: 0 0 3px 3px;
top: 0; border-radius: 0 0 3px 3px;
right: 25.888px; background: #333;
-webkit-border-radius: 0 0 3px 3px; background: rgba(0, 0, 0, 0.7);
-moz-border-radius: 0 0 3px 3px; padding: 12.944px 25.888px; }
-ms-border-radius: 0 0 3px 3px; header.announcement div nav h1 {
-o-border-radius: 0 0 3px 3px; display: -moz-inline-box;
border-radius: 0 0 3px 3px; -moz-box-orient: vertical;
background: #333; display: inline-block;
background: rgba(0, 0, 0, 0.7); vertical-align: baseline;
padding: 12.944px 25.888px; } zoom: 1;
header.announcement div nav h1 { *display: inline;
display: -moz-inline-box; *vertical-align: auto;
-moz-box-orient: vertical; margin-right: 12.944px; }
display: inline-block; header.announcement div nav h1 a {
vertical-align: baseline; font: italic 800 18px "Open Sans", Helvetica, Arial, sans-serif;
zoom: 1; color: #fff;
*display: inline; text-decoration: none; }
*vertical-align: auto; header.announcement div nav h1 a:hover, header.announcement div nav h1 a:focus {
margin-right: 12.944px; } color: #999; }
header.announcement div nav h1 a { header.announcement div nav a.login {
font: italic 800 18px "Open Sans", Helvetica, Arial, sans-serif; text-decoration: none;
color: #fff; color: #fff;
text-decoration: none; } font-size: 12px;
header.announcement div nav h1 a:hover, header.announcement div nav h1 a:focus { font-style: normal;
color: #999; } font-family: "Open Sans", Helvetica, Arial, sans-serif; }
header.announcement div nav a.login { header.announcement div nav a.login:hover, header.announcement div nav a.login:focus {
text-decoration: none; color: #999; }
color: #fff; header.announcement div section {
font-size: 12px; background: #993333;
font-style: normal; display: -moz-inline-box;
font-family: "Open Sans", Helvetica, Arial, sans-serif; } -moz-box-orient: vertical;
header.announcement div nav a.login:hover, header.announcement div nav a.login:focus { display: inline-block;
color: #999; } vertical-align: baseline;
header.announcement div section { zoom: 1;
background: #993333; *display: inline;
display: -moz-inline-box; *vertical-align: auto;
-moz-box-orient: vertical; margin-left: 34.171%;
display: inline-block; padding: 25.888px 38.832px; }
vertical-align: baseline; @media screen and (max-width: 780px) {
zoom: 1; header.announcement div section {
*display: inline; margin-left: 0; } }
*vertical-align: auto; header.announcement div section h1 {
margin-left: 34.171%; font-family: "Open Sans";
padding: 25.888px 38.832px; } font-size: 30px;
@media screen and (max-width: 780px) { font-weight: 800;
header.announcement div section { display: -moz-inline-box;
margin-left: 0; } } -moz-box-orient: vertical;
header.announcement div section h1 { display: inline-block;
font-family: "Open Sans"; vertical-align: baseline;
font-size: 30px; zoom: 1;
font-weight: 800; *display: inline;
display: -moz-inline-box; *vertical-align: auto;
-moz-box-orient: vertical; line-height: 1.2em;
display: inline-block; margin: 0 25.888px 0 0; }
vertical-align: baseline; header.announcement div section h2 {
zoom: 1; font-family: "Open Sans";
*display: inline; font-size: 24px;
*vertical-align: auto; font-weight: 400;
line-height: 1.2em; display: -moz-inline-box;
margin: 0 25.888px 0 0; } -moz-box-orient: vertical;
header.announcement div section h2 { display: inline-block;
font-family: "Open Sans"; vertical-align: baseline;
font-size: 24px; zoom: 1;
font-weight: 400; *display: inline;
display: -moz-inline-box; *vertical-align: auto;
-moz-box-orient: vertical; line-height: 1.2em; }
display: inline-block; header.announcement div section.course section {
vertical-align: baseline; float: left;
zoom: 1; margin-left: 0;
*display: inline; margin-right: 3.817%;
*vertical-align: auto; padding: 0;
line-height: 1.2em; } width: 48.092%; }
header.announcement div section.course section { @media screen and (max-width: 780px) {
float: left; header.announcement div section.course section {
margin-left: 0; float: none;
margin-right: 3.817%; width: 100%;
padding: 0; margin-right: 0; } }
width: 48.092%; } header.announcement div section.course section a {
@media screen and (max-width: 780px) { background-color: #4d1919;
header.announcement div section.course section { border-color: #260d0d;
float: none; -webkit-box-shadow: inset 0 1px 0 #732626, 0 1px 0 #ac3939;
width: 100%; -moz-box-shadow: inset 0 1px 0 #732626, 0 1px 0 #ac3939;
margin-right: 0; } } box-shadow: inset 0 1px 0 #732626, 0 1px 0 #ac3939;
header.announcement div section.course section a { display: block;
background-color: #4d1919; padding: 12.944px 25.888px;
border-color: #260d0d; text-align: center; }
-webkit-box-shadow: inset 0 1px 0 #732626, 0 1px 0 #ac3939; header.announcement div section.course section a:hover {
-moz-box-shadow: inset 0 1px 0 #732626, 0 1px 0 #ac3939; background-color: #732626;
box-shadow: inset 0 1px 0 #732626, 0 1px 0 #ac3939; border-color: #4d1919; }
display: block; header.announcement div section.course p {
padding: 12.944px 25.888px; width: 48.092%;
text-align: center; } line-height: 25.888px;
header.announcement div section.course section a:hover { float: left; }
background-color: #732626; @media screen and (max-width: 780px) {
border-color: #4d1919; } header.announcement div section.course p {
header.announcement div section.course p { float: none;
width: 48.092%; width: 100%; } }
line-height: 25.888px;
float: left; }
@media screen and (max-width: 780px) {
header.announcement div section.course p {
float: none;
width: 100%; } }
footer { footer {
padding-top: 0; } padding-top: 0; }
footer div.footer-wrapper {
border-top: 1px solid #e5e5e5;
padding: 25.888px 0;
background: url("/static/images/marketing/mit-logo.png") right center no-repeat; }
@media screen and (max-width: 780px) {
footer div.footer-wrapper { footer div.footer-wrapper {
border-top: 1px solid #e5e5e5; background-position: left bottom;
padding: 25.888px 0; padding-bottom: 77.664px; } }
background: url("/static/images/marketing/mit-logo.png") right center no-repeat; } footer div.footer-wrapper a {
@media screen and (max-width: 780px) { color: #888;
footer div.footer-wrapper { text-decoration: none;
background-position: left bottom; -webkit-transition-property: all;
padding-bottom: 77.664px; } } -moz-transition-property: all;
footer div.footer-wrapper a { -ms-transition-property: all;
color: #888; -o-transition-property: all;
text-decoration: none; transition-property: all;
-webkit-transition-property: all; -webkit-transition-duration: 0.15s;
-moz-transition-property: all; -moz-transition-duration: 0.15s;
-ms-transition-property: all; -ms-transition-duration: 0.15s;
-o-transition-property: all; -o-transition-duration: 0.15s;
transition-property: all; transition-duration: 0.15s;
-webkit-transition-duration: 0.15s; -webkit-transition-timing-function: ease-out;
-moz-transition-duration: 0.15s; -moz-transition-timing-function: ease-out;
-ms-transition-duration: 0.15s; -ms-transition-timing-function: ease-out;
-o-transition-duration: 0.15s; -o-transition-timing-function: ease-out;
transition-duration: 0.15s; transition-timing-function: ease-out;
-webkit-transition-timing-function: ease-out; -webkit-transition-delay: 0;
-moz-transition-timing-function: ease-out; -moz-transition-delay: 0;
-ms-transition-timing-function: ease-out; -ms-transition-delay: 0;
-o-transition-timing-function: ease-out; -o-transition-delay: 0;
transition-timing-function: ease-out; transition-delay: 0; }
-webkit-transition-delay: 0; footer div.footer-wrapper a:hover, footer div.footer-wrapper a:focus {
-moz-transition-delay: 0; color: #666; }
-ms-transition-delay: 0; footer div.footer-wrapper p {
-o-transition-delay: 0; display: -moz-inline-box;
transition-delay: 0; } -moz-box-orient: vertical;
footer div.footer-wrapper a:hover, footer div.footer-wrapper a:focus { display: inline-block;
color: #666; } vertical-align: baseline;
footer div.footer-wrapper p { zoom: 1;
display: -moz-inline-box; *display: inline;
-moz-box-orient: vertical; *vertical-align: auto;
display: inline-block; margin-right: 25.888px; }
vertical-align: baseline; footer div.footer-wrapper ul {
zoom: 1; display: -moz-inline-box;
*display: inline; -moz-box-orient: vertical;
*vertical-align: auto; display: inline-block;
margin-right: 25.888px; } vertical-align: baseline;
footer div.footer-wrapper ul { zoom: 1;
display: -moz-inline-box; *display: inline;
-moz-box-orient: vertical; *vertical-align: auto; }
display: inline-block; @media screen and (max-width: 780px) {
vertical-align: baseline; footer div.footer-wrapper ul {
zoom: 1; margin-top: 25.888px; } }
*display: inline; footer div.footer-wrapper ul li {
*vertical-align: auto; } display: -moz-inline-box;
@media screen and (max-width: 780px) { -moz-box-orient: vertical;
footer div.footer-wrapper ul { display: inline-block;
margin-top: 25.888px; } } vertical-align: baseline;
footer div.footer-wrapper ul li { zoom: 1;
display: -moz-inline-box; *display: inline;
-moz-box-orient: vertical; *vertical-align: auto;
display: inline-block; margin-bottom: 0; }
vertical-align: baseline; footer div.footer-wrapper ul li:after {
zoom: 1; content: ' |';
*display: inline; display: inline;
*vertical-align: auto; color: #ccc; }
margin-bottom: 0; } footer div.footer-wrapper ul li:last-child:after {
footer div.footer-wrapper ul li:after { content: none; }
content: ' |'; footer div.footer-wrapper ul.social {
display: inline; float: right;
color: #ccc; } margin-right: 60px;
footer div.footer-wrapper ul li:last-child:after { position: relative;
content: none; } top: -5px; }
footer div.footer-wrapper ul.social { @media screen and (max-width: 780px) {
float: right; footer div.footer-wrapper ul.social {
margin-right: 60px; float: none; } }
position: relative; footer div.footer-wrapper ul.social li {
top: -5px; } float: left;
@media screen and (max-width: 780px) { margin-right: 12.944px; }
footer div.footer-wrapper ul.social { footer div.footer-wrapper ul.social li:after {
float: none; } } content: none;
footer div.footer-wrapper ul.social li { display: none; }
float: left; footer div.footer-wrapper ul.social li a {
margin-right: 12.944px; } display: block;
footer div.footer-wrapper ul.social li:after { height: 29px;
content: none; width: 28px;
display: none; } text-indent: -9999px; }
footer div.footer-wrapper ul.social li a { footer div.footer-wrapper ul.social li a:hover {
display: block; opacity: .8; }
height: 29px; footer div.footer-wrapper ul.social li.twitter a {
width: 28px; background: url("/static/images/marketing/twitter.png") 0 0 no-repeat; }
text-indent: -9999px; } footer div.footer-wrapper ul.social li.facebook a {
footer div.footer-wrapper ul.social li a:hover { background: url("/static/images/marketing/facebook.png") 0 0 no-repeat; }
opacity: .8; } footer div.footer-wrapper ul.social li.linkedin a {
footer div.footer-wrapper ul.social li.twitter a { background: url("/static/images/marketing/linkedin.png") 0 0 no-repeat; }
background: url("/static/images/marketing/twitter.png") 0 0 no-repeat; }
footer div.footer-wrapper ul.social li.facebook a {
background: url("/static/images/marketing/facebook.png") 0 0 no-repeat; }
footer div.footer-wrapper ul.social li.linkedin a {
background: url("/static/images/marketing/linkedin.png") 0 0 no-repeat; }
section.index-content section { section.index-content section {
float: left; } float: left; }
@media screen and (max-width: 780px) { @media screen and (max-width: 780px) {
section.index-content section { section.index-content section {
float: none; float: none;
width: auto; width: auto;
margin-right: 0; } } margin-right: 0; } }
section.index-content section h1 { section.index-content section h1 {
font-size: 800 24px "Open Sans"; font-size: 800 24px "Open Sans";
margin-bottom: 25.888px; } margin-bottom: 25.888px; }
section.index-content section p { section.index-content section p {
line-height: 25.888px; line-height: 25.888px;
margin-bottom: 25.888px; } margin-bottom: 25.888px; }
section.index-content section ul { section.index-content section ul {
margin: 0; } margin: 0; }
section.index-content section.about {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
border-right: 1px solid #e5e5e5;
margin-right: 2.513%;
padding-right: 1.256%;
width: 65.829%; }
@media screen and (max-width: 780px) {
section.index-content section.about { section.index-content section.about {
-webkit-box-sizing: border-box; width: 100%;
-moz-box-sizing: border-box; border-right: 0;
box-sizing: border-box; margin-right: 0;
border-right: 1px solid #e5e5e5; padding-right: 0; } }
margin-right: 2.513%; section.index-content section.about section {
padding-right: 1.256%; margin-bottom: 25.888px; }
width: 65.829%; } section.index-content section.about section p {
@media screen and (max-width: 780px) { width: 48.092%;
section.index-content section.about { float: left; }
width: 100%; @media screen and (max-width: 780px) {
border-right: 0; section.index-content section.about section p {
margin-right: 0; float: none;
padding-right: 0; } } width: auto; } }
section.index-content section.about section { section.index-content section.about section p:nth-child(odd) {
margin-bottom: 25.888px; } margin-right: 3.817%; }
section.index-content section.about section p { @media screen and (max-width: 780px) {
width: 48.092%; section.index-content section.about section p:nth-child(odd) {
float: left; } margin-right: 0; } }
@media screen and (max-width: 780px) { section.index-content section.about section.intro section {
section.index-content section.about section p { margin-bottom: 0; }
float: none; section.index-content section.about section.intro section.intro-text {
width: auto; } } margin-right: 3.817%;
section.index-content section.about section p:nth-child(odd) { width: 48.092%; }
margin-right: 3.817%; } @media screen and (max-width: 780px) {
@media screen and (max-width: 780px) { section.index-content section.about section.intro section.intro-text {
section.index-content section.about section p:nth-child(odd) { margin-right: 0;
margin-right: 0; } } width: auto; } }
section.index-content section.about section.intro section { section.index-content section.about section.intro section.intro-text p {
margin-bottom: 0; } margin-right: 0;
section.index-content section.about section.intro section.intro-text { width: auto;
margin-right: 3.817%; float: none; }
width: 48.092%; } section.index-content section.about section.intro section.intro-video {
@media screen and (max-width: 780px) { width: 48.092%; }
section.index-content section.about section.intro section.intro-text { @media screen and (max-width: 780px) {
margin-right: 0; section.index-content section.about section.intro section.intro-video {
width: auto; } } width: auto; } }
section.index-content section.about section.intro section.intro-text p { section.index-content section.about section.intro section.intro-video a {
margin-right: 0; display: block;
width: auto; width: 100%; }
float: none; } section.index-content section.about section.intro section.intro-video a img {
section.index-content section.about section.intro section.intro-video { width: 100%; }
width: 48.092%; } section.index-content section.about section.intro section.intro-video a span {
@media screen and (max-width: 780px) { display: none; }
section.index-content section.about section.intro section.intro-video { section.index-content section.about section.features {
width: auto; } } border-top: 1px solid #E5E5E5;
section.index-content section.about section.intro section.intro-video a { padding-top: 25.888px;
display: block; margin-bottom: 0; }
width: 100%; } section.index-content section.about section.features h2 {
section.index-content section.about section.intro section.intro-video a img { text-transform: uppercase;
width: 100%; } letter-spacing: 1px;
section.index-content section.about section.intro section.intro-video a span { color: #888;
display: none; } margin-bottom: 25.888px;
section.index-content section.about section.features { font-weight: normal;
border-top: 1px solid #E5E5E5; font-size: 14px; }
padding-top: 25.888px; section.index-content section.about section.features h2 span {
margin-bottom: 0; } text-transform: none; }
section.index-content section.about section.features h2 { section.index-content section.about section.features p {
text-transform: uppercase; width: auto;
letter-spacing: 1px; clear: both; }
color: #888; section.index-content section.about section.features p strong {
margin-bottom: 25.888px; font-family: "Open sans";
font-weight: normal; font-weight: 800; }
font-size: 14px; } section.index-content section.about section.features p a {
section.index-content section.about section.features h2 span { color: #993333;
text-transform: none; } text-decoration: none;
section.index-content section.about section.features p { -webkit-transition-property: all;
width: auto; -moz-transition-property: all;
clear: both; } -ms-transition-property: all;
section.index-content section.about section.features p strong { -o-transition-property: all;
font-family: "Open sans"; transition-property: all;
font-weight: 800; } -webkit-transition-duration: 0.15s;
section.index-content section.about section.features p a { -moz-transition-duration: 0.15s;
color: #993333; -ms-transition-duration: 0.15s;
text-decoration: none; -o-transition-duration: 0.15s;
-webkit-transition-property: all; transition-duration: 0.15s;
-moz-transition-property: all; -webkit-transition-timing-function: ease-out;
-ms-transition-property: all; -moz-transition-timing-function: ease-out;
-o-transition-property: all; -ms-transition-timing-function: ease-out;
transition-property: all; -o-transition-timing-function: ease-out;
-webkit-transition-duration: 0.15s; transition-timing-function: ease-out;
-moz-transition-duration: 0.15s; -webkit-transition-delay: 0;
-ms-transition-duration: 0.15s; -moz-transition-delay: 0;
-o-transition-duration: 0.15s; -ms-transition-delay: 0;
transition-duration: 0.15s; -o-transition-delay: 0;
-webkit-transition-timing-function: ease-out; transition-delay: 0; }
-moz-transition-timing-function: ease-out; section.index-content section.about section.features p a:hover, section.index-content section.about section.features p a:focus {
-ms-transition-timing-function: ease-out; color: #602020; }
-o-transition-timing-function: ease-out; section.index-content section.about section.features ul {
transition-timing-function: ease-out; margin-bottom: 0; }
-webkit-transition-delay: 0; section.index-content section.about section.features ul li {
-moz-transition-delay: 0; line-height: 25.888px;
-ms-transition-delay: 0; width: 48.092%;
-o-transition-delay: 0; float: left;
transition-delay: 0; } margin-bottom: 12.944px; }
section.index-content section.about section.features p a:hover, section.index-content section.about section.features p a:focus { @media screen and (max-width: 780px) {
color: #602020; } section.index-content section.about section.features ul li {
section.index-content section.about section.features ul { width: auto;
margin-bottom: 0; } float: none; } }
section.index-content section.about section.features ul li { section.index-content section.about section.features ul li:nth-child(odd) {
line-height: 25.888px; margin-right: 3.817%; }
width: 48.092%; @media screen and (max-width: 780px) {
float: left; section.index-content section.about section.features ul li:nth-child(odd) {
margin-bottom: 12.944px; } margin-right: 0; } }
@media screen and (max-width: 780px) { section.index-content section.course, section.index-content section.staff {
section.index-content section.about section.features ul li { width: 31.658%; }
width: auto; @media screen and (max-width: 780px) {
float: none; } }
section.index-content section.about section.features ul li:nth-child(odd) {
margin-right: 3.817%; }
@media screen and (max-width: 780px) {
section.index-content section.about section.features ul li:nth-child(odd) {
margin-right: 0; } }
section.index-content section.course, section.index-content section.staff { section.index-content section.course, section.index-content section.staff {
width: 31.658%; } width: auto; } }
@media screen and (max-width: 780px) { section.index-content section.course h1, section.index-content section.staff h1 {
section.index-content section.course, section.index-content section.staff { color: #888;
width: auto; } } font: normal 16px Georgia, serif;
section.index-content section.course h1, section.index-content section.staff h1 { font-size: 14px;
color: #888; letter-spacing: 1px;
font: normal 16px Georgia, serif; margin-bottom: 25.888px;
font-size: 14px; text-transform: uppercase; }
letter-spacing: 1px; section.index-content section.course h2, section.index-content section.staff h2 {
margin-bottom: 25.888px; font: 800 24px "Open Sans", Helvetica, Arial, sans-serif; }
text-transform: uppercase; } section.index-content section.course h3, section.index-content section.staff h3 {
section.index-content section.course h2, section.index-content section.staff h2 { font: 400 18px "Open Sans", Helvetica, Arial, sans-serif; }
font: 800 24px "Open Sans", Helvetica, Arial, sans-serif; } section.index-content section.course a span.arrow, section.index-content section.staff a span.arrow {
section.index-content section.course h3, section.index-content section.staff h3 { color: rgba(255, 255, 255, 0.6);
font: 400 18px "Open Sans", Helvetica, Arial, sans-serif; } font-style: normal;
section.index-content section.course a span.arrow, section.index-content section.staff a span.arrow { display: -moz-inline-box;
color: rgba(255, 255, 255, 0.6); -moz-box-orient: vertical;
font-style: normal; display: inline-block;
display: -moz-inline-box; vertical-align: baseline;
-moz-box-orient: vertical; zoom: 1;
display: inline-block; *display: inline;
vertical-align: baseline; *vertical-align: auto;
zoom: 1; padding-left: 10px; }
*display: inline; section.index-content section.course ul, section.index-content section.staff ul {
*vertical-align: auto; list-style: none; }
padding-left: 10px; } section.index-content section.course ul li img, section.index-content section.staff ul li img {
section.index-content section.course ul, section.index-content section.staff ul { float: left;
list-style: none; } margin-right: 12.944px; }
section.index-content section.course ul li img, section.index-content section.staff ul li img { section.index-content section.course h2 {
float: left; padding-top: 129.44px;
margin-right: 12.944px; } background: url("/static/images/marketing/circuits-bg.jpg") 0 0 no-repeat;
-webkit-background-size: contain;
-moz-background-size: contain;
-ms-background-size: contain;
-o-background-size: contain;
background-size: contain; }
@media screen and (max-width: 998px) and (min-width: 781px) {
section.index-content section.course h2 {
background: url("/static/images/marketing/circuits-medium-bg.jpg") 0 0 no-repeat; } }
@media screen and (max-width: 780px) {
section.index-content section.course h2 { section.index-content section.course h2 {
padding-top: 129.44px; padding-top: 129.44px;
background: url("/static/images/marketing/circuits-bg.jpg") 0 0 no-repeat; background: url("/static/images/marketing/circuits-bg.jpg") 0 0 no-repeat; } }
-webkit-background-size: contain; @media screen and (min-width: 500px) and (max-width: 781px) {
-moz-background-size: contain; section.index-content section.course h2 {
-ms-background-size: contain; padding-top: 207.104px; } }
-o-background-size: contain; section.index-content section.about-course {
background-size: contain; } -webkit-box-sizing: border-box;
@media screen and (max-width: 998px) and (min-width: 781px) { -moz-box-sizing: border-box;
section.index-content section.course h2 { box-sizing: border-box;
background: url("/static/images/marketing/circuits-medium-bg.jpg") 0 0 no-repeat; } } border-right: 1px solid #e5e5e5;
@media screen and (max-width: 780px) { margin-right: 2.513%;
section.index-content section.course h2 { padding-right: 1.256%;
padding-top: 129.44px; width: 65.829%; }
background: url("/static/images/marketing/circuits-bg.jpg") 0 0 no-repeat; } } @media screen and (max-width: 780px) {
@media screen and (min-width: 500px) and (max-width: 781px) {
section.index-content section.course h2 {
padding-top: 207.104px; } }
section.index-content section.about-course { section.index-content section.about-course {
-webkit-box-sizing: border-box; width: auto;
-moz-box-sizing: border-box; border-right: 0;
box-sizing: border-box; margin-right: 0;
border-right: 1px solid #e5e5e5; padding-right: 0; } }
margin-right: 2.513%; section.index-content section.about-course section {
padding-right: 1.256%; width: 48.092%; }
width: 65.829%; } @media screen and (max-width: 780px) {
@media screen and (max-width: 780px) { section.index-content section.about-course section {
section.index-content section.about-course { width: auto; } }
width: auto; section.index-content section.about-course section.about-info {
border-right: 0; margin-right: 3.817%; }
margin-right: 0; @media screen and (max-width: 780px) {
padding-right: 0; } } section.index-content section.about-course section.about-info {
section.index-content section.about-course section { margin-right: 0; } }
width: 48.092%; } section.index-content section.about-course section.requirements {
@media screen and (max-width: 780px) { clear: both;
section.index-content section.about-course section { width: 100%;
width: auto; } } border-top: 1px solid #E5E5E5;
section.index-content section.about-course section.about-info { padding-top: 25.888px;
margin-right: 3.817%; } margin-bottom: 0; }
@media screen and (max-width: 780px) { section.index-content section.about-course section.requirements p {
section.index-content section.about-course section.about-info { float: left;
margin-right: 0; } } width: 48.092%;
section.index-content section.about-course section.requirements { margin-right: 3.817%; }
clear: both; @media screen and (max-width: 780px) {
width: 100%; section.index-content section.about-course section.requirements p {
border-top: 1px solid #E5E5E5; margin-right: 0;
padding-top: 25.888px; float: none;
margin-bottom: 0; } width: auto; } }
section.index-content section.about-course section.requirements p { section.index-content section.about-course section.requirements p:nth-child(odd) {
float: left; margin-right: 0; }
width: 48.092%; section.index-content section.about-course section.cta {
margin-right: 3.817%; } width: 100%;
@media screen and (max-width: 780px) { text-align: center; }
section.index-content section.about-course section.requirements p { section.index-content section.about-course section.cta a.enroll {
margin-right: 0; padding: 12.944px 51.776px;
float: none; display: -moz-inline-box;
width: auto; } } -moz-box-orient: vertical;
section.index-content section.about-course section.requirements p:nth-child(odd) { display: inline-block;
margin-right: 0; } vertical-align: baseline;
section.index-content section.about-course section.cta { zoom: 1;
width: 100%; *display: inline;
text-align: center; } *vertical-align: auto;
section.index-content section.about-course section.cta a.enroll { text-align: center;
padding: 12.944px 51.776px; font: 800 18px "Open Sans", Helvetica, Arial, sans-serif; }
display: -moz-inline-box; section.index-content section.staff h1 {
-moz-box-orient: vertical; margin-top: 25.888px; }
display: inline-block;
vertical-align: baseline;
zoom: 1;
*display: inline;
*vertical-align: auto;
text-align: center;
font: 800 18px "Open Sans", Helvetica, Arial, sans-serif; }
section.index-content section.staff h1 {
margin-top: 25.888px; }
#lean_overlay { #lean_overlay {
position: fixed; position: fixed;
...@@ -767,168 +754,186 @@ div.leanModal_box { ...@@ -767,168 +754,186 @@ div.leanModal_box {
-moz-box-sizing: border-box; -moz-box-sizing: border-box;
box-sizing: border-box; box-sizing: border-box;
display: none; display: none;
padding: 51.776px; } padding: 51.776px;
div.leanModal_box a.modal_close { text-align: left; }
color: #aaa; div.leanModal_box a.modal_close {
display: block; color: #aaa;
font-style: normal; display: block;
height: 14px; font-style: normal;
position: absolute; height: 14px;
right: 12px; position: absolute;
top: 12px; right: 12px;
width: 14px; top: 12px;
z-index: 2; } width: 14px;
div.leanModal_box a.modal_close:hover { z-index: 2; }
text-decoration: none; div.leanModal_box a.modal_close:hover {
color: #993333; } text-decoration: none;
div.leanModal_box h1 { color: #993333; }
border-bottom: 1px solid #eee; div.leanModal_box h1 {
font-size: 24px; border-bottom: 1px solid #eee;
margin-bottom: 25.888px; font-size: 24px;
margin-top: 0; margin-bottom: 25.888px;
padding-bottom: 25.888px; margin-top: 0;
text-align: left; } padding-bottom: 25.888px;
div.leanModal_box#enroll { text-align: left; }
max-width: 600px; } div.leanModal_box#enroll {
div.leanModal_box#enroll ol { max-width: 600px; }
padding-top: 25.888px; } div.leanModal_box#enroll ol {
div.leanModal_box#enroll ol li.terms, div.leanModal_box#enroll ol li.honor-code { padding-top: 25.888px; }
width: auto; div.leanModal_box#enroll ol li.terms, div.leanModal_box#enroll ol li.honor-code {
float: none; } width: auto;
div.leanModal_box#enroll ol li div.tip { float: none; }
display: none; } div.leanModal_box#enroll ol li div.tip {
div.leanModal_box#enroll ol li:hover div.tip { display: none; }
background: #333; div.leanModal_box#enroll ol li:hover div.tip {
color: #fff; background: #333;
display: block; color: #fff;
font-size: 16px; display: block;
line-height: 25.888px; font-size: 16px;
margin: 0 0 0 -10px; line-height: 25.888px;
padding: 10px; margin: 0 0 0 -10px;
position: absolute; padding: 10px;
-webkit-font-smoothing: antialiased; position: absolute;
width: 500px; } -webkit-font-smoothing: antialiased;
div.leanModal_box form { width: 500px; }
text-align: left; } div.leanModal_box form {
div.leanModal_box form div#enroll_error, div.leanModal_box form div#login_error, div.leanModal_box form div#pwd_error { text-align: left; }
background-color: #333333; div.leanModal_box form div#enroll_error, div.leanModal_box form div#login_error, div.leanModal_box form div#pwd_error {
border: black; background-color: #333333;
color: #fff; border: black;
font-family: "Open sans"; color: #fff;
font-weight: bold; font-family: "Open sans";
letter-spacing: 1px; font-weight: bold;
margin: -25.888px -25.888px 25.888px; letter-spacing: 1px;
padding: 12.944px; margin: -25.888px -25.888px 25.888px;
text-shadow: 0 1px 0 #1a1a1a; padding: 12.944px;
-webkit-font-smoothing: antialiased; } text-shadow: 0 1px 0 #1a1a1a;
div.leanModal_box form div#enroll_error:empty, div.leanModal_box form div#login_error:empty, div.leanModal_box form div#pwd_error:empty { -webkit-font-smoothing: antialiased; }
padding: 0; } div.leanModal_box form div#enroll_error:empty, div.leanModal_box form div#login_error:empty, div.leanModal_box form div#pwd_error:empty {
div.leanModal_box form ol { padding: 0; }
list-style: none; div.leanModal_box form ol {
margin-bottom: 25.888px; } list-style: none;
div.leanModal_box form ol li { margin-bottom: 25.888px; }
margin-bottom: 12.944px; } div.leanModal_box form ol li {
div.leanModal_box form ol li.terms, div.leanModal_box form ol li.remember { margin-bottom: 12.944px; }
border-top: 1px solid #eee; div.leanModal_box form ol li.terms, div.leanModal_box form ol li.remember {
clear: both; border-top: 1px solid #eee;
float: none; clear: both;
padding-top: 25.888px; float: none;
width: auto; } padding-top: 25.888px;
div.leanModal_box form ol li.honor-code { width: auto; }
width: auto; div.leanModal_box form ol li.honor-code {
float: none; } width: auto;
div.leanModal_box form ol li label { float: none; }
display: block; div.leanModal_box form ol li label {
font-weight: bold; } display: block;
div.leanModal_box form ol li input[type="email"], div.leanModal_box form ol li input[type="number"], div.leanModal_box form ol li input[type="password"], div.leanModal_box form ol li input[type="search"], div.leanModal_box form ol li input[type="tel"], div.leanModal_box form ol li input[type="text"], div.leanModal_box form ol li input[type="url"], div.leanModal_box form ol li input[type="color"], div.leanModal_box form ol li input[type="date"], div.leanModal_box form ol li input[type="datetime"], div.leanModal_box form ol li input[type="datetime-local"], div.leanModal_box form ol li input[type="month"], div.leanModal_box form ol li input[type="time"], div.leanModal_box form ol li input[type="week"], div.leanModal_box form ol li textarea { font-weight: bold; }
width: 100%; div.leanModal_box form ol li input[type="email"], div.leanModal_box form ol li input[type="number"], div.leanModal_box form ol li input[type="password"], div.leanModal_box form ol li input[type="search"], div.leanModal_box form ol li input[type="tel"], div.leanModal_box form ol li input[type="text"], div.leanModal_box form ol li input[type="url"], div.leanModal_box form ol li input[type="color"], div.leanModal_box form ol li input[type="date"], div.leanModal_box form ol li input[type="datetime"], div.leanModal_box form ol li input[type="datetime-local"], div.leanModal_box form ol li input[type="month"], div.leanModal_box form ol li input[type="time"], div.leanModal_box form ol li input[type="week"], div.leanModal_box form ol li textarea {
-webkit-box-sizing: border-box; width: 100%;
-moz-box-sizing: border-box; -webkit-box-sizing: border-box;
box-sizing: border-box; } -moz-box-sizing: border-box;
div.leanModal_box form ol li input[type="checkbox"] { box-sizing: border-box; }
margin-right: 10px; } div.leanModal_box form ol li input[type="checkbox"] {
div.leanModal_box form ol li ul { margin-right: 10px; }
list-style: disc outside none; div.leanModal_box form ol li ul {
margin: 12.944px 0 25.888px 25.888px; } list-style: disc outside none;
div.leanModal_box form ol li ul li { margin: 12.944px 0 25.888px 25.888px; }
color: #666; div.leanModal_box form ol li ul li {
float: none; color: #666;
font-size: 14px; float: none;
list-style: disc outside none; font-size: 14px;
margin-bottom: 12.944px; } list-style: disc outside none;
div.leanModal_box form input[type="button"], div.leanModal_box form input[type="submit"] { margin-bottom: 12.944px; }
border: 1px solid #691b1b; div.leanModal_box form input[type="button"], div.leanModal_box form input[type="submit"] {
-webkit-border-radius: 3px; border: 1px solid #691b1b;
-moz-border-radius: 3px; -webkit-border-radius: 3px;
-ms-border-radius: 3px; -moz-border-radius: 3px;
-o-border-radius: 3px; -ms-border-radius: 3px;
border-radius: 3px; -o-border-radius: 3px;
-webkit-box-shadow: inset 0 1px 0 0 #bc5c5c; border-radius: 3px;
-moz-box-shadow: inset 0 1px 0 0 #bc5c5c; -webkit-box-shadow: inset 0 1px 0 0 #bc5c5c;
box-shadow: inset 0 1px 0 0 #bc5c5c; -moz-box-shadow: inset 0 1px 0 0 #bc5c5c;
color: white; box-shadow: inset 0 1px 0 0 #bc5c5c;
display: inline; color: white;
font-size: 11px; display: inline;
font-weight: bold; font-size: 11px;
background-color: #993333; font-weight: bold;
background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #993333), color-stop(100%, #761e1e)); background-color: #993333;
background-image: -webkit-linear-gradient(top, #993333, #761e1e); background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #993333), color-stop(100%, #761e1e));
background-image: -moz-linear-gradient(top, #993333, #761e1e); background-image: -webkit-linear-gradient(top, #993333, #761e1e);
background-image: -ms-linear-gradient(top, #993333, #761e1e); background-image: -moz-linear-gradient(top, #993333, #761e1e);
background-image: -o-linear-gradient(top, #993333, #761e1e); background-image: -ms-linear-gradient(top, #993333, #761e1e);
background-image: linear-gradient(top, #993333, #761e1e); background-image: -o-linear-gradient(top, #993333, #761e1e);
padding: 6px 18px 7px; background-image: linear-gradient(top, #993333, #761e1e);
text-shadow: 0 1px 0 #5d1414; padding: 6px 18px 7px;
-webkit-background-clip: padding-box; text-shadow: 0 1px 0 #5d1414;
font-size: 18px; -webkit-background-clip: padding-box;
padding: 12.944px; } font-size: 18px;
div.leanModal_box form input[type="button"]:hover, div.leanModal_box form input[type="submit"]:hover { padding: 12.944px; }
-webkit-box-shadow: inset 0 1px 0 0 #a44141; div.leanModal_box form input[type="button"]:hover, div.leanModal_box form input[type="submit"]:hover {
-moz-box-shadow: inset 0 1px 0 0 #a44141; -webkit-box-shadow: inset 0 1px 0 0 #a44141;
box-shadow: inset 0 1px 0 0 #a44141; -moz-box-shadow: inset 0 1px 0 0 #a44141;
cursor: pointer; box-shadow: inset 0 1px 0 0 #a44141;
background-color: #823030; cursor: pointer;
background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #823030), color-stop(100%, #691c1c)); background-color: #823030;
background-image: -webkit-linear-gradient(top, #823030, #691c1c); background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #823030), color-stop(100%, #691c1c));
background-image: -moz-linear-gradient(top, #823030, #691c1c); background-image: -webkit-linear-gradient(top, #823030, #691c1c);
background-image: -ms-linear-gradient(top, #823030, #691c1c); background-image: -moz-linear-gradient(top, #823030, #691c1c);
background-image: -o-linear-gradient(top, #823030, #691c1c); background-image: -ms-linear-gradient(top, #823030, #691c1c);
background-image: linear-gradient(top, #823030, #691c1c); } background-image: -o-linear-gradient(top, #823030, #691c1c);
div.leanModal_box form input[type="button"]:active, div.leanModal_box form input[type="submit"]:active { background-image: linear-gradient(top, #823030, #691c1c); }
border: 1px solid #691b1b; div.leanModal_box form input[type="button"]:active, div.leanModal_box form input[type="submit"]:active {
-webkit-box-shadow: inset 0 0 8px 4px #5c1919, inset 0 0 8px 4px #5c1919, 0 1px 1px 0 #eeeeee; border: 1px solid #691b1b;
-moz-box-shadow: inset 0 0 8px 4px #5c1919, inset 0 0 8px 4px #5c1919, 0 1px 1px 0 #eeeeee; -webkit-box-shadow: inset 0 0 8px 4px #5c1919, inset 0 0 8px 4px #5c1919, 0 1px 1px 0 #eeeeee;
box-shadow: inset 0 0 8px 4px #5c1919, inset 0 0 8px 4px #5c1919, 0 1px 1px 0 #eeeeee; } -moz-box-shadow: inset 0 0 8px 4px #5c1919, inset 0 0 8px 4px #5c1919, 0 1px 1px 0 #eeeeee;
box-shadow: inset 0 0 8px 4px #5c1919, inset 0 0 8px 4px #5c1919, 0 1px 1px 0 #eeeeee; }
div#login { div#login {
min-width: 400px; } min-width: 400px; }
div#login header { div#login header {
border-bottom: 1px solid #ddd; border-bottom: 1px solid #ddd;
margin-bottom: 25.888px; margin-bottom: 25.888px;
padding-bottom: 25.888px; } padding-bottom: 25.888px; }
div#login header h1 { div#login header h1 {
border-bottom: 0; border-bottom: 0;
padding-bottom: 0; padding-bottom: 0;
margin-bottom: 6.472px; } margin-bottom: 6.472px; }
div#login ol li { div#login ol li {
width: auto; width: auto;
float: none; } float: none; }
div.lost-password { div.lost-password {
text-align: left; text-align: left;
margin-top: 25.888px; } margin-top: 25.888px; }
div.lost-password a { div.lost-password a {
color: #999; } color: #999; }
div.lost-password a:hover { div.lost-password a:hover {
color: #444; } color: #444; }
div#pwd_reset p { div#pwd_reset p {
margin-bottom: 25.888px; } margin-bottom: 25.888px; }
div#pwd_reset input[type="email"] { div#pwd_reset input[type="email"] {
margin-bottom: 25.888px; } margin-bottom: 25.888px; }
div#apply_name_change, div#change_email, div#unenroll, div#deactivate-account {
max-width: 700px; }
div#apply_name_change ul, div#change_email ul, div#unenroll ul, div#deactivate-account ul {
list-style: none; }
div#apply_name_change ul li, div#change_email ul li, div#unenroll ul li, div#deactivate-account ul li {
margin-bottom: 12.944px; }
div#apply_name_change ul li textarea, div#apply_name_change ul li input[type="email"], div#apply_name_change ul li input[type="number"], div#apply_name_change ul li input[type="password"], div#apply_name_change ul li input[type="search"], div#apply_name_change ul li input[type="tel"], div#apply_name_change ul li input[type="text"], div#apply_name_change ul li input[type="url"], div#apply_name_change ul li input[type="color"], div#apply_name_change ul li input[type="date"], div#apply_name_change ul li input[type="datetime"], div#apply_name_change ul li input[type="datetime-local"], div#apply_name_change ul li input[type="month"], div#apply_name_change ul li input[type="time"], div#apply_name_change ul li input[type="week"], div#change_email ul li textarea, div#change_email ul li input[type="email"], div#change_email ul li input[type="number"], div#change_email ul li input[type="password"], div#change_email ul li input[type="search"], div#change_email ul li input[type="tel"], div#change_email ul li input[type="text"], div#change_email ul li input[type="url"], div#change_email ul li input[type="color"], div#change_email ul li input[type="date"], div#change_email ul li input[type="datetime"], div#change_email ul li input[type="datetime-local"], div#change_email ul li input[type="month"], div#change_email ul li input[type="time"], div#change_email ul li input[type="week"], div#unenroll ul li textarea, div#unenroll ul li input[type="email"], div#unenroll ul li input[type="number"], div#unenroll ul li input[type="password"], div#unenroll ul li input[type="search"], div#unenroll ul li input[type="tel"], div#unenroll ul li input[type="text"], div#unenroll ul li input[type="url"], div#unenroll ul li input[type="color"], div#unenroll ul li input[type="date"], div#unenroll ul li input[type="datetime"], div#unenroll ul li input[type="datetime-local"], div#unenroll ul li input[type="month"], div#unenroll ul li input[type="time"], div#unenroll ul li input[type="week"], div#deactivate-account ul li textarea, div#deactivate-account ul li input[type="email"], div#deactivate-account ul li input[type="number"], div#deactivate-account ul li input[type="password"], div#deactivate-account ul li input[type="search"], div#deactivate-account ul li input[type="tel"], div#deactivate-account ul li input[type="text"], div#deactivate-account ul li input[type="url"], div#deactivate-account ul li input[type="color"], div#deactivate-account ul li input[type="date"], div#deactivate-account ul li input[type="datetime"], div#deactivate-account ul li input[type="datetime-local"], div#deactivate-account ul li input[type="month"], div#deactivate-account ul li input[type="time"], div#deactivate-account ul li input[type="week"] {
display: block;
width: 100%;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box; }
div#apply_name_change ul li textarea, div#change_email ul li textarea, div#unenroll ul li textarea, div#deactivate-account ul li textarea {
height: 60px; }
div#apply_name_change ul li input[type="submit"], div#change_email ul li input[type="submit"], div#unenroll ul li input[type="submit"], div#deactivate-account ul li input[type="submit"] {
white-space: normal; }
div#feedback_div form ol li { div#feedback_div form ol li {
float: none; float: none;
width: 100%; } width: 100%; }
div#feedback_div form ol li textarea#feedback_message { div#feedback_div form ol li textarea#feedback_message {
height: 100px; } height: 100px; }
...@@ -6,8 +6,7 @@ ...@@ -6,8 +6,7 @@
<section class="activation"> <section class="activation">
<h1>Account already active!</h1> <h1>Account already active!</h1>
<!-- <p>Now go <a href="/">log in</a> and try the course!</a></p> --> <!-- <p>Now go <a href="/">log in</a> and try the course!</a></p> -->
<p> This account has already been activated. We will notify you as <p> This account has already been activated. You can log in at
soon as the course starts.</p> the <a href="/">6.002x course page</a>.</p>
<p>For now you can go to the <a href="http://mitx.mit.edu/">MITx homepage</a> or the <a href="/">6.002x course page</a>.</p>
</div> </div>
</section> </section>
...@@ -4,7 +4,6 @@ ...@@ -4,7 +4,6 @@
<div> <div>
<h1>Activation Complete!</h1> <h1>Activation Complete!</h1>
<!-- <p>Now go <a href="/">log in</a> and try the course!</a></p> --> <!-- <p>Now go <a href="/">log in</a> and try the course!</a></p> -->
<p>Thanks for activating your email. We will notify you as soon as the course starts.</p> <p>Thanks for activating your account. You can log in at the <a href="/">6.002x course page</a>.</p>
<p>For now you can go to the <a href="http://mitx.mit.edu/">MITx homepage</a> or the <a href="/">6.002x course page</a>.</p>
</div> </div>
</section> </section>
<h1>E-mail change successful!</h1>
<p> You should see your new name in your profile.
<h1> Could not change e-mail </h1>
An account with the new e-mail address already exists. Sorry.
...@@ -3,7 +3,11 @@ offering of 6.002 using this email address. If it was you, and you'd ...@@ -3,7 +3,11 @@ offering of 6.002 using this email address. If it was you, and you'd
like to activate and use your account, copy and paste this address like to activate and use your account, copy and paste this address
into your web browser's address bar: into your web browser's address bar:
http://${ site }/activate/${ key } % if is_secure:
https://${ site }/activate/${ key }
% else:
http://${ site }/activate/${ key }
% endif
If you didn't request this, you don't need to do anything; you won't 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 receive any more email from us. Please do not reply to this e-mail; if
......
This is to confirm that you changed the e-mail associated with MITx
from ${old_email} to ${new_email}. If you did not make this request,
please contact the course staff immediately. Contact information is
listed at:
% if is_secure:
https://${ site }/t/mitx_help.html
% else:
http://${ site }/t/mitx_help.html
% endif
We keep a log of old e-mails, so if this request was unintentional, we
can investigate.
We received a request to change the e-mail associated with your MITx
account from ${old_email} to ${new_email}. If this is correct, please
confirm your new e-mail address by visiting:
% if is_secure:
https://${ site }/email_confirm/${ key }
% else:
http://${ site }/email_confirm/${ 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 MITx web site.
Request to change MITx account e-mail
(Not currently used)
We are sorry. Our course staff did not approve your request to change
your name from ${old_name} to ${new_name}. If you need further
assistance, please e-mail the course staff at ta@mitx.mit.edu.
MITx's prototype offering, 6.002x, is now open. To log in, visit MITx's prototype offering, 6.002x, is now open. To log in, visit
% if is_secure:
https://6002x.mitx.mit.edu https://6002x.mitx.mit.edu
% else:
http://6002x.mitx.mit.edu
% endif
where you will find a login button at the top right-hand corner of the where you will find a login button at the top right-hand corner of the
window. window.
......
<h1>E-mail change successful!</h1>
<p> You should see your new name in your profile.
<h1>Invalid key</h1>
<p> This e-mail key is not valid. Please check:
<ul>
<li> Was this key already used? Check whether the e-mail change has already happened.
<li> Did your e-mail client break the URL into two lines?
<li> The keys are valid for a limited amount of time. Has the key expired?
</ul>
<%inherit file="main.html" />
<%include file="navigation.html" args="active_page=''" />
<section class="main-content">
<script>
function name_confirm(id) {
postJSON('/accept_name_change',{"id":id},
function(data){
if(data.success){
$("#div"+id).html("Accepted");
} else {
alert('Error');
}
});
}
function name_deny(id) {
postJSON('/reject_name_change',{"id":id},
function(data){
if(data.success){
$("#div"+id).html("Rejected");
} else {
alert('Error');
}
});
}
</script>
<div class="gradebook-wrapper">
<section class="gradebook-content">
<h1>Pending name changes</h1>
<table>
% for s in students:
<tr>
<td><a href=/profile/${s['uid']}/>${s['old_name']}</td>
<td>${s['new_name']|h}</td>
<td>${s['email']|h}</td>
<td>${s['rationale']|h}</td>
<td><span id="div${s['cid']}"><span onclick="name_confirm(${s['cid']});">[Confirm]</span>
<span onclick="name_deny(${s['cid']});">[Reject]</span></span></td></tr>
% endfor
</table>
</section>
</div>
</section>
...@@ -80,6 +80,46 @@ $(function() { ...@@ -80,6 +80,46 @@ $(function() {
log_event("profile", {"type":"password_send"}); log_event("profile", {"type":"password_send"});
}); });
}); });
$("#change_email_form").submit(function(){
var new_email = $('#new_email_field').val();
var new_password = $('#new_email_password').val();
postJSON('/change_email',{"new_email":new_email,
"password":new_password},
function(data){
if(data.success){
$("#change_email").html("<h1>Please verify your new email</h1><p>You'll receive a confirmation in your in-box. Please click the link in the email to confirm the email change.</p>");
} else {
$("#change_email_error").html(data.error);
}
});
log_event("profile", {"type":"email_change_request",
"old_email":"${email}",
"new_email":new_email});
return false;
});
$("#change_name_form").submit(function(){
var new_name = $('#new_name_field').val();
var rationale = $('#name_rationale_field').val();
postJSON('/change_name',{"new_name":new_name,
"rationale":rationale},
function(data){
if(data.success){
$("#apply_name_change").html("<h1>Your request has been submitted.</h1><p>We'll send you an e-mail when approve the change or need further information. Please allow for up to a week for us to process your request.</p>");
} else {
$("#change_name_error").html(data.error);
}
});
log_event("profile", {"type":"name_change_request",
"new_name":new_name,
"rationale":rationale});
return false;
});
}); });
</script> </script>
</%block> </%block>
...@@ -91,17 +131,19 @@ $(function() { ...@@ -91,17 +131,19 @@ $(function() {
<div class="profile-wrapper"> <div class="profile-wrapper">
<section class="course-info"> <section class="course-info">
<h1>Course Progress</h1> <header>
<h1>Course Progress</h1>
</header>
<div id="grade-detail-graph"></div> <div id="grade-detail-graph"></div>
<ol class="chapters"> <ol class="chapters">
%for chapter in courseware_summary: %for chapter in courseware_summary:
%if not chapter['chapter'] == "hidden": %if not chapter['chapter'] == "hidden":
<li> <li>
<h2><a href="${reverse('courseware_chapter', args=format_url_params([chapter['course'], chapter['chapter']])) }"> <h2><a href="${reverse('courseware_chapter', args=format_url_params([chapter['course'], chapter['chapter']])) }">
${ chapter['chapter'] }</a></h2> ${ chapter['chapter'] }</a></h2>
<ol class="sections"> <ol class="sections">
%for section in chapter['sections']: %for section in chapter['sections']:
<li> <li>
...@@ -134,37 +176,135 @@ $(function() { ...@@ -134,37 +176,135 @@ $(function() {
%endif %endif
%endfor %endfor
</ol> <!--End chapters--> </ol> <!--End chapters-->
</section> </section>
<section class="user-info"> <section class="user-info">
<h1>${name}</h1> <header>
<h1>Student Profile</h1>
</header>
<ul> <ul>
<li>Forum name: <strong>${username}</strong></li> <li>
<li>E-mail: <strong>${email}</strong></li> Name: <strong>${name}</strong>
%if True:
<a href="#apply_name_change" rel="leanModal" class="name-edit">Edit</a>
%else:
(Name change pending)
%endif
</li>
<li>
Forum name: <strong>${username}</strong>
</li>
<li>
E-mail: <strong>${email}</strong> <a href="#change_email" rel="leanModal" class="edit-email">Edit</a>
</li>
<li> <li>
Location: <div id="location_sub">${location}</div><div id="description"></div> <a href="#" id="change_location">Edit</a> Location: <div id="location_sub">${location}</div><div id="description"></div> <a href="#" id="change_location">Edit</a>
</li> </li>
<li> <li>
Language: <div id="language_sub">${language}</div> <a href="#" id="change_language">Edit</a> Language: <div id="language_sub">${language}</div> <a href="#" id="change_language">Edit</a>
</li> </li>
<li>
Password reset
<input id="id_email" type="hidden" name="email" maxlength="75" value="${email}" />
<input type="submit" id="pwd_reset_button" value="Reset" />
<p>We'll e-mail a password reset link to ${email}.</p>
</li>
</ul> </ul>
<div id="change_password_pop">
<h2>Password change</h2>
<p>We'll e-mail a password reset link to ${email}.</p>
<input id="id_email" type="hidden" name="email" maxlength="75" value="${email}" />
<input type="submit" id="pwd_reset_button" value="Reset Password" />
</div>
</section> </section>
</div> </div>
</section> </section>
<div id="password_reset_complete" class="leanModal_box"> <div id="password_reset_complete" class="leanModal_box">
<a href="#password_reset_complete" rel="leanModal" id="password_reset_complete_link"></a> <a href="#password_reset_complete" rel="leanModal" id="password_reset_complete_link"></a>
<h1>Password Reset Email Sent</h1> <h1>Password Reset Email Sent</h1>
An email has been sent to ${email}. Follow the link in the email to change your password. <p>
</div> An email has been sent to ${email}. Follow the link in the email to change your password.
</p>
</div>
<div id="apply_name_change" class="leanModal_box">
<h1>Apply to change your name</h1>
<form id="change_name_form">
<div id="change_name_error"> </div>
<fieldset>
<p>To uphold the credibility of MITx certificates, name changes must go through an approval process. A member of the course staff will review your request, and if approved, update your information. Please allow up to a week for your request to be processed. Thank you.</p>
<ul>
<li>
<label>Enter your desired full name, as it will appear on the MITx Certificate: </label>
<input id="new_name_field" value="" type="text" />
</li>
<li>
<label>Reason for name change:</label>
<textarea id="name_rationale_field" value=""></textarea>
</li>
<li>
<input type="submit" id="submit">
</li>
</ul>
</fieldset>
</form>
</div>
<div id="change_email" class="leanModal_box">
<h1>Change e-mail</h1>
<div id="apply_name_change_error"></div>
<form id="change_email_form">
<div id="change_email_error"> </div>
<fieldset>
<ul>
<li>
<label> Please enter your new email address: </label>
<input id="new_email_field" type="email" value="" />
</li>
<li>
<label> Please confirm your password: </label>
<input id="new_email_password" value="" type="password" />
</li>
<li>
<p>We will send a confirmation to both ${email} and your new e-mail as part of the process.</p>
<input type="submit" id="submit_email_change" />
</li>
</ul>
</fieldset>
</form>
</div>
<div id="deactivate-account" class="leanModal_box">
<h1>Deactivate MITx Account</h1>
<p>Once you deactivate you&rsquo;re MIT<em>x</em> account you will no longer recieve updates and new class announcements from MIT<em>x</em>.</p>
<p>If you&rsquo;d like to still get updates and new class announcements you can just <a href="#unenroll" rel="leanModal">unenroll</a> and keep your account active.</p>
<form id="unenroll_form">
<div id="unenroll_error"> </div>
<fieldset>
<ul>
<li>
<input type="submit" id="" value="Yes, I don't want an MITx account or hear about any new classes or updates to MITx" />
</li>
</ul>
</fieldset>
</form>
</div>
<div id="unenroll" class="leanModal_box">
<h1>Unenroll from 6.002x</h1>
<p>Please note: you will still receive updates and new class announcements from MIT<em>x</em>. If you don&rsquo;t wish to receive any more updates or announcements <a href="#deactivate-account" rel="leanModal">deactivate your account</a>.</p>
<form id="unenroll_form">
<div id="unenroll_error"> </div>
<fieldset>
<ul>
<li>
<input type="submit" id="" value="Yes, I want to unenroll from 6.002x but still hear about any new classes or updates to MITx" />
</li>
</ul>
</fieldset>
</form>
</div>
...@@ -8,11 +8,29 @@ div.profile-wrapper { ...@@ -8,11 +8,29 @@ div.profile-wrapper {
border-left: 1px solid #d3d3d3; border-left: 1px solid #d3d3d3;
border-right: 0; border-right: 0;
h1 { header {
padding: lh(.5) lh(); padding: lh(.5) lh();
font-size: 18px;
margin: 0 ; margin: 0 ;
@extend .bottom-border; @extend .bottom-border;
h1 {
font-size: 18px;
margin: 0;
padding-right: 30px;
}
a {
position: absolute;
top: 13px;
right: lh(.5);
text-transform: uppercase;
font-size: 12px;
color: #999;
&:hover {
color: #555;
}
}
} }
ul { ul {
...@@ -57,7 +75,11 @@ div.profile-wrapper { ...@@ -57,7 +75,11 @@ div.profile-wrapper {
font-size: 12px; font-size: 12px;
} }
a#change_language, a#change_location { a#change_language,
a#change_location,
a.edit-email,
a.name-edit,
a.email-edit {
position: absolute; position: absolute;
top: 9px; top: 9px;
right: lh(.5); right: lh(.5);
...@@ -69,20 +91,66 @@ div.profile-wrapper { ...@@ -69,20 +91,66 @@ div.profile-wrapper {
color: #555; color: #555;
} }
} }
p {
font-size: 12px;
margin-bottom: 0;
margin-top: 4px;
color: #999;
}
a.deactivate {
color: #aaa;
font-style: italic;
}
input {
background: none;
border: none;
@include box-shadow(none);
color: #999;
font-size: 12px;
font-weight: normal;
margin: 0;
padding: 0;
position: absolute;
right: lh(.5);
text-transform: uppercase;
top: 9px;
&:hover {
color: #555;
}
}
} }
} }
div#change_password_pop { div#change_password_pop {
padding: 7px lh(); border-bottom: 1px solid #d3d3d3;
@include box-shadow(0 1px 0 #eee);
color: #4D4D4D; color: #4D4D4D;
padding: 7px lh();
h2 {
margin-top: 0;
font-weight: bold;
text-transform: uppercase;
font-size: $body-font-size;
}
} }
} }
section.course-info { section.course-info {
@extend .content; @extend .content;
> h1 { header {
@extend .top-header; @extend h1.top-header;
@extend .clearfix;
h1 {
margin: 0;
float: left;
}
} }
div#grade-detail-graph { div#grade-detail-graph {
...@@ -122,30 +190,30 @@ div.profile-wrapper { ...@@ -122,30 +190,30 @@ div.profile-wrapper {
padding-left: flex-gutter(9); padding-left: flex-gutter(9);
width: flex-grid(7, 9); width: flex-grid(7, 9);
> li { > li {
padding:0 0 lh() 0; padding:0 0 lh() 0;
&:first-child { &:first-child {
padding-top: 0; padding-top: 0;
} }
&:last-child { &:last-child {
border-bottom: 0; border-bottom: 0;
} }
h3 { h3 {
color: #666; color: #666;
} }
ol { ol {
list-style: none; list-style: none;
li { li {
display: inline-block; display: inline-block;
padding-right: 1em; padding-right: 1em;
}
} }
} }
}
} }
} }
} }
......
@mixin border-image($images) { @mixin border-image ($image) {
-webkit-border-image: border-add-prefix($images, webkit); -webkit-border-image: $image;
-moz-border-image: border-add-prefix($images, moz); -moz-border-image: $image;
-o-border-image: border-add-prefix($images, o); -ms-border-image: $image;
border-image: border-add-prefix($images); -o-border-image: $image;
border-image: $image;
} }
@function border-add-prefix($images, $vendor: false) {
$border-image: ();
$images-type: type-of(nth($images, 1));
$first-var: nth(nth($images, 1), 1); // Get type of Gradient (Linear || radial)
// If input is a gradient
@if $images-type == string {
@if ($first-var == "linear") or ($first-var == "radial") {
@for $i from 2 through length($images) {
$gradient-type: nth($images, 1); // Get type of gradient (linear || radial)
$gradient-args: nth($images, $i); // Get actual gradient (red, blue)
$border-image: render-gradients($gradient-args, $gradient-type, $vendor);
}
}
// If input is a URL
@else {
$border-image: $images;
}
}
// If input is gradient or url + additional args
@else if $images-type == list {
@for $i from 1 through length($images) {
$type: type-of(nth($images, $i)); // Get type of variable - List or String
// If variable is a list - Gradient
@if $type == list {
$gradient-type: nth(nth($images, $i), 1); // Get type of gradient (linear || radial)
$gradient-args: nth(nth($images, $i), 2); // Get actual gradient (red, blue)
$border-image: render-gradients($gradient-args, $gradient-type, $vendor);
}
// If variable is a string - Image or number
@else if ($type == string) or ($type == number) {
$border-image: append($border-image, nth($images, $i));
}
}
}
@return $border-image;
}
//Examples:
// @include border-image(url("image.png"));
// @include border-image(url("image.png") 20 stretch);
// @include border-image(linear-gradient(45deg, orange, yellow));
// @include border-image(linear-gradient(45deg, orange, yellow) stretch);
// @include border-image(linear-gradient(45deg, orange, yellow) 20 30 40 50 stretch round);
// @include border-image(radial-gradient(top, cover, orange, yellow, orange));
...@@ -17,6 +17,7 @@ div.leanModal_box { ...@@ -17,6 +17,7 @@ div.leanModal_box {
@include box-sizing(border-box); @include box-sizing(border-box);
display: none; display: none;
padding: lh(2); padding: lh(2);
text-align: left;
a.modal_close { a.modal_close {
color: #aaa; color: #aaa;
...@@ -204,6 +205,35 @@ div#pwd_reset { ...@@ -204,6 +205,35 @@ div#pwd_reset {
} }
} }
div#apply_name_change,
div#change_email,
div#unenroll,
div#deactivate-account {
max-width: 700px;
ul {
list-style: none;
li {
margin-bottom: lh(.5);
textarea, #{$all-text-inputs} {
display: block;
width: 100%;
@include box-sizing(border-box);
}
textarea {
height: 60px;
}
input[type="submit"] {
white-space: normal;
}
}
}
}
div#feedback_div{ div#feedback_div{
form{ form{
ol { ol {
......
...@@ -8,19 +8,25 @@ import django.contrib.auth.views ...@@ -8,19 +8,25 @@ import django.contrib.auth.views
# admin.autodiscover() # admin.autodiscover()
urlpatterns = ('', urlpatterns = ('',
url(r'^$', 'student.views.index'), # Main marketing page, or redirect to courseware
url(r'^change_email$', 'student.views.change_email_request'),
url(r'^email_confirm/(?P<key>[^/]*)$', 'student.views.confirm_email_change'),
url(r'^change_name$', 'student.views.change_name_request'),
url(r'^accept_name_change$', 'student.views.accept_name_change'),
url(r'^reject_name_change$', 'student.views.reject_name_change'),
url(r'^pending_name_changes$', 'student.views.pending_name_changes'),
url(r'^gradebook$', 'courseware.views.gradebook'), url(r'^gradebook$', 'courseware.views.gradebook'),
url(r'^event$', 'track.views.user_track'), url(r'^event$', 'track.views.user_track'),
url(r'^t/(?P<template>[^/]*)$', 'static_template_view.views.index'), url(r'^t/(?P<template>[^/]*)$', 'static_template_view.views.index'),
url(r'^logout$', 'student.views.logout_user'),
url(r'^info$', 'util.views.info'),
url(r'^login$', 'student.views.login_user'), url(r'^login$', 'student.views.login_user'),
url(r'^login/(?P<error>[^/]*)$', 'student.views.login_user'), url(r'^login/(?P<error>[^/]*)$', 'student.views.login_user'),
url(r'^logout$', 'student.views.logout_user'),
url(r'^create_account$', 'student.views.create_account'), url(r'^create_account$', 'student.views.create_account'),
url(r'^activate/(?P<key>[^/]*)$', 'student.views.activate_account'), url(r'^activate/(?P<key>[^/]*)$', 'student.views.activate_account'),
url(r'^$', 'student.views.index'), # url(r'^reactivate/(?P<key>[^/]*)$', 'student.views.reactivation_email'),
# url(r'^password_reset/$', 'django.contrib.auth.views.password_reset',
# dict(from_email='registration@mitx.mit.edu'),name='auth_password_reset'),
url(r'^password_reset/$', 'student.views.password_reset'), url(r'^password_reset/$', 'student.views.password_reset'),
## Obsolete Django views for password resets
## TODO: Replace with Mako-ized views
url(r'^password_change/$',django.contrib.auth.views.password_change,name='auth_password_change'), url(r'^password_change/$',django.contrib.auth.views.password_change,name='auth_password_change'),
url(r'^password_change_done/$',django.contrib.auth.views.password_change_done,name='auth_password_change_done'), url(r'^password_change_done/$',django.contrib.auth.views.password_change_done,name='auth_password_change_done'),
url(r'^password_reset_confirm/(?P<uidb36>[0-9A-Za-z]+)-(?P<token>.+)/$',django.contrib.auth.views.password_reset_confirm, url(r'^password_reset_confirm/(?P<uidb36>[0-9A-Za-z]+)-(?P<token>.+)/$',django.contrib.auth.views.password_reset_confirm,
...@@ -29,6 +35,7 @@ urlpatterns = ('', ...@@ -29,6 +35,7 @@ urlpatterns = ('',
name='auth_password_reset_complete'), name='auth_password_reset_complete'),
url(r'^password_reset_done/$',django.contrib.auth.views.password_reset_done, url(r'^password_reset_done/$',django.contrib.auth.views.password_reset_done,
name='auth_password_reset_done'), name='auth_password_reset_done'),
## Feedback
url(r'^send_feedback$', 'util.views.send_feedback'), url(r'^send_feedback$', 'util.views.send_feedback'),
) )
...@@ -37,6 +44,7 @@ if settings.PERFSTATS: ...@@ -37,6 +44,7 @@ if settings.PERFSTATS:
if settings.COURSEWARE_ENABLED: if settings.COURSEWARE_ENABLED:
urlpatterns=urlpatterns + (url(r'^courseware/$', 'courseware.views.index', name="courseware"), urlpatterns=urlpatterns + (url(r'^courseware/$', 'courseware.views.index', name="courseware"),
url(r'^info$', 'util.views.info'),
url(r'^wiki/', include('simplewiki.urls')), url(r'^wiki/', include('simplewiki.urls')),
url(r'^courseware/(?P<course>[^/]*)/(?P<chapter>[^/]*)/(?P<section>[^/]*)/$', 'courseware.views.index', name="courseware_section"), url(r'^courseware/(?P<course>[^/]*)/(?P<chapter>[^/]*)/(?P<section>[^/]*)/$', 'courseware.views.index', name="courseware_section"),
url(r'^courseware/(?P<course>[^/]*)/(?P<chapter>[^/]*)/$', 'courseware.views.index', name="courseware_chapter"), url(r'^courseware/(?P<course>[^/]*)/(?P<chapter>[^/]*)/$', 'courseware.views.index', name="courseware_chapter"),
......
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