Commit bfb5f5e5 by Brian Wilson

Merge remote-tracking branch 'origin/master' into feature/brian/pearson-reg

parents cc1b50ee 9519087d
......@@ -7,8 +7,11 @@ TIME_FORMAT = "%Y-%m-%dT%H:%M"
def parse_time(time_str):
"""
Takes a time string in TIME_FORMAT, returns
it as a time_struct. Raises ValueError if the string is not in the right format.
Takes a time string in TIME_FORMAT
Returns it as a time_struct.
Raises ValueError if the string is not in the right format.
"""
return time.strptime(time_str, TIME_FORMAT)
......
......@@ -414,7 +414,11 @@ class XModuleDescriptor(Plugin, HTMLSnippet, ResourceTemplates):
'xqa_key',
# TODO: This is used by the XMLModuleStore to provide for locations for
# static files, and will need to be removed when that code is removed
'data_dir'
'data_dir',
# How many days early to show a course element to beta testers (float)
# intended to be set per-course, but can be overridden in for specific
# elements. Can be a float.
'days_early_for_beta'
)
# cdodge: this is a list of metadata names which are 'system' metadata
......@@ -497,13 +501,27 @@ class XModuleDescriptor(Plugin, HTMLSnippet, ResourceTemplates):
@property
def start(self):
"""
If self.metadata contains start, return it. Else return None.
If self.metadata contains a valid start time, return it as a time struct.
Else return None.
"""
if 'start' not in self.metadata:
return None
return self._try_parse_time('start')
@property
def days_early_for_beta(self):
"""
If self.metadata contains start, return the number, as a float. Else return None.
"""
if 'days_early_for_beta' not in self.metadata:
return None
try:
return float(self.metadata['days_early_for_beta'])
except ValueError:
return None
@property
def own_metadata(self):
"""
Return the metadata that is not inherited, but was defined on this module.
......@@ -715,7 +733,8 @@ class XModuleDescriptor(Plugin, HTMLSnippet, ResourceTemplates):
"""
Parse an optional metadata key containing a time: if present, complain
if it doesn't parse.
Return None if not present or invalid.
Returns a time_struct, or None if metadata key is not present or is invalid.
"""
if key in self.metadata:
try:
......
......@@ -257,6 +257,7 @@ Supported fields at the course level:
* "tabs" -- have custom tabs in the courseware. See below for details on config.
* "discussion_blackouts" -- An array of time intervals during which you want to disable a student's ability to create or edit posts in the forum. Moderators, Community TAs, and Admins are unaffected. You might use this during exam periods, but please be aware that the forum is often a very good place to catch mistakes and clarify points to students. The better long term solution would be to have better flagging/moderation mechanisms, but this is the hammer we have today. Format by example: [["2012-10-29T04:00", "2012-11-03T04:00"], ["2012-12-30T04:00", "2013-01-02T04:00"]]
* "show_calculator" (value "Yes" if desired)
* "days_early_for_beta" -- number of days (floating point ok) early that students in the beta-testers group get to see course content. Can also be specified for any other course element, and overrides values set at higher levels.
* TODO: there are others
### Grading policy file contents
......
......@@ -4,13 +4,13 @@ like DISABLE_START_DATES"""
import logging
import time
from datetime import datetime, timedelta
from django.conf import settings
from xmodule.course_module import CourseDescriptor
from xmodule.error_module import ErrorDescriptor
from xmodule.modulestore import Location
from xmodule.timeparse import parse_time
from xmodule.x_module import XModule, XModuleDescriptor
from student.models import CourseEnrollmentAllowed
......@@ -73,7 +73,7 @@ def has_access(user, obj, action):
raise TypeError("Unknown object type in has_access(): '{0}'"
.format(type(obj)))
def get_access_group_name(obj,action):
def get_access_group_name(obj, action):
'''
Returns group name for user group which has "action" access to the given object.
......@@ -226,9 +226,10 @@ def _has_access_descriptor(user, descriptor, action):
# Check start date
if descriptor.start is not None:
now = time.gmtime()
if now > descriptor.start:
effective_start = _adjust_start_date_for_beta_testers(user, descriptor)
if now > effective_start:
# after start date, everyone can see it
debug("Allow: now > start date")
debug("Allow: now > effective start date")
return True
# otherwise, need staff access
return _has_staff_access_to_descriptor(user, descriptor)
......@@ -328,6 +329,15 @@ def _course_staff_group_name(location):
"""
return 'staff_%s' % Location(location).course
def course_beta_test_group_name(location):
"""
Get the name of the beta tester group for a location. Right now, that's
beta_testers_COURSE.
location: something that can passed to Location.
"""
return 'beta_testers_{0}'.format(Location(location).course)
def _course_instructor_group_name(location):
"""
......@@ -348,6 +358,51 @@ def _has_global_staff_access(user):
return False
def _adjust_start_date_for_beta_testers(user, descriptor):
"""
If user is in a beta test group, adjust the start date by the appropriate number of
days.
Arguments:
user: A django user. May be anonymous.
descriptor: the XModuleDescriptor the user is trying to get access to, with a
non-None start date.
Returns:
A time, in the same format as returned by time.gmtime(). Either the same as
start, or earlier for beta testers.
NOTE: number of days to adjust should be cached to avoid looking it up thousands of
times per query.
NOTE: For now, this function assumes that the descriptor's location is in the course
the user is looking at. Once we have proper usages and definitions per the XBlock
design, this should use the course the usage is in.
NOTE: If testing manually, make sure MITX_FEATURES['DISABLE_START_DATES'] = False
in envs/dev.py!
"""
if descriptor.days_early_for_beta is None:
# bail early if no beta testing is set up
return descriptor.start
user_groups = [g.name for g in user.groups.all()]
beta_group = course_beta_test_group_name(descriptor.location)
if beta_group in user_groups:
debug("Adjust start time: user in group %s", beta_group)
# time_structs don't support subtraction, so convert to datetimes,
# subtract, convert back.
# (fun fact: datetime(*a_time_struct[:6]) is the beautiful syntax for
# converting time_structs into datetimes)
start_as_datetime = datetime(*descriptor.start[:6])
delta = timedelta(descriptor.days_early_for_beta)
effective = start_as_datetime - delta
# ...and back to time_struct
return effective.timetuple()
return descriptor.start
def _has_instructor_access_to_location(user, location):
return _has_access_to_location(user, location, 'instructor')
......
......@@ -17,7 +17,8 @@ import xmodule.modulestore.django
# Need access to internal func to put users in the right group
from courseware import grades
from courseware.access import _course_staff_group_name
from courseware.access import (has_access, _course_staff_group_name,
course_beta_test_group_name)
from courseware.models import StudentModuleCache
from student.models import Registration
......@@ -453,6 +454,9 @@ class TestViewAuth(PageLoader):
"""Check that enrollment periods work"""
self.run_wrapped(self._do_test_enrollment_period)
def test_beta_period(self):
"""Check that beta-test access works"""
self.run_wrapped(self._do_test_beta_period)
def _do_test_dark_launch(self):
"""Actually do the test, relying on settings to be right."""
......@@ -618,6 +622,38 @@ class TestViewAuth(PageLoader):
self.unenroll(self.toy)
self.assertTrue(self.try_enroll(self.toy))
def _do_test_beta_period(self):
"""Actually test beta periods, relying on settings to be right."""
# trust, but verify :)
self.assertFalse(settings.MITX_FEATURES['DISABLE_START_DATES'])
# Make courses start in the future
tomorrow = time.time() + 24 * 3600
nextday = tomorrow + 24 * 3600
yesterday = time.time() - 24 * 3600
# toy course's hasn't started
self.toy.metadata['start'] = stringify_time(time.gmtime(tomorrow))
self.assertFalse(self.toy.has_started())
# but should be accessible for beta testers
self.toy.metadata['days_early_for_beta'] = '2'
# student user shouldn't see it
student_user = user(self.student)
self.assertFalse(has_access(student_user, self.toy, 'load'))
# now add the student to the beta test group
group_name = course_beta_test_group_name(self.toy.location)
g = Group.objects.create(name=group_name)
g.user_set.add(student_user)
# now the student should see it
self.assertTrue(has_access(student_user, self.toy, 'load'))
@override_settings(MODULESTORE=TEST_DATA_XML_MODULESTORE)
class TestCourseGrader(PageLoader):
"""Check that a course gets graded properly"""
......
......@@ -179,7 +179,7 @@ class TestInstructorDashboardForumAdmin(ct.PageLoader):
self.assertTrue(response.content.find('Removed "{0}" from "{1}" forum role = "{2}"'.format(username, course.id, rolename))>=0)
self.assertFalse(has_forum_access(username, course.id, rolename))
def test_add_and_readd_forum_admin_users(self):
def test_add_and_read_forum_admin_users(self):
course = self.toy
self.initialize_roles(course.id)
url = reverse('instructor_dashboard', kwargs={'course_id': course.id})
......
......@@ -2,6 +2,7 @@
from collections import defaultdict
import csv
import itertools
import json
import logging
import os
......@@ -19,9 +20,13 @@ from mitxmako.shortcuts import render_to_response
from django.core.urlresolvers import reverse
from courseware import grades
from courseware.access import has_access, get_access_group_name
from courseware.access import (has_access, get_access_group_name,
course_beta_test_group_name)
from courseware.courses import get_course_with_access
from django_comment_client.models import Role, FORUM_ROLE_ADMINISTRATOR, FORUM_ROLE_MODERATOR, FORUM_ROLE_COMMUNITY_TA
from django_comment_client.models import (Role,
FORUM_ROLE_ADMINISTRATOR,
FORUM_ROLE_MODERATOR,
FORUM_ROLE_COMMUNITY_TA)
from django_comment_client.utils import has_forum_access
from psychometrics import psychoanalyze
from student.models import CourseEnrollment, CourseEnrollmentAllowed
......@@ -44,7 +49,6 @@ FORUM_ROLE_REMOVE = 'remove'
@ensure_csrf_cookie
@cache_control(no_cache=True, no_store=True, must_revalidate=True)
def instructor_dashboard(request, course_id):
"""Display the instructor dashboard for a course."""
course = get_course_with_access(request.user, course_id, 'staff')
......@@ -105,6 +109,16 @@ def instructor_dashboard(request, course_id):
except Group.DoesNotExist:
group = Group(name=grpname) # create the group
group.save()
def get_beta_group(course):
"""
Get the group for beta testers of course.
"""
# Not using get_group because there is no access control action called
# 'beta', so adding it to get_access_group_name doesn't really make
# sense.
name = course_beta_test_group_name(course.location)
(group, created) = Group.objects.get_or_create(name=name)
return group
# process actions from form POST
......@@ -237,11 +251,7 @@ def instructor_dashboard(request, course_id):
elif 'List course staff' in action:
group = get_staff_group(course)
msg += 'Staff group = {0}'.format(group.name)
log.debug('staffgrp={0}'.format(group.name))
uset = group.user_set.all()
datatable = {'header': ['Username', 'Full name']}
datatable['data'] = [[x.username, x.profile.name] for x in uset]
datatable['title'] = 'List of Staff in course {0}'.format(course_id)
datatable = _group_members_table(group, "List of Staff", course_id)
track.views.server_track(request, 'list-staff', {}, page='idashboard')
elif 'List course instructors' in action and request.user.is_staff:
......@@ -256,17 +266,8 @@ def instructor_dashboard(request, course_id):
elif action == 'Add course staff':
uname = request.POST['staffuser']
try:
user = User.objects.get(username=uname)
except User.DoesNotExist:
msg += '<font color="red">Error: unknown username "{0}"</font>'.format(uname)
user = None
if user is not None:
group = get_staff_group(course)
msg += '<font color="green">Added {0} to staff group = {1}</font>'.format(user, group.name)
log.debug('staffgrp={0}'.format(group.name))
user.groups.add(group)
track.views.server_track(request, 'add-staff {0}'.format(user), {}, page='idashboard')
msg += add_user_to_group(request, uname, group, 'staff', 'staff')
elif action == 'Add instructor' and request.user.is_staff:
uname = request.POST['instructor']
......@@ -284,17 +285,8 @@ def instructor_dashboard(request, course_id):
elif action == 'Remove course staff':
uname = request.POST['staffuser']
try:
user = User.objects.get(username=uname)
except User.DoesNotExist:
msg += '<font color="red">Error: unknown username "{0}"</font>'.format(uname)
user = None
if user is not None:
group = get_staff_group(course)
msg += '<font color="green">Removed {0} from staff group = {1}</font>'.format(user, group.name)
log.debug('staffgrp={0}'.format(group.name))
user.groups.remove(group)
track.views.server_track(request, 'remove-staff {0}'.format(user), {}, page='idashboard')
msg += remove_user_from_group(request, uname, group, 'staff', 'staff')
elif action == 'Remove instructor' and request.user.is_staff:
uname = request.POST['instructor']
......@@ -311,6 +303,30 @@ def instructor_dashboard(request, course_id):
track.views.server_track(request, 'remove-instructor {0}'.format(user), {}, page='idashboard')
#----------------------------------------
# Group management
elif 'List beta testers' in action:
group = get_beta_group(course)
msg += 'Beta test group = {0}'.format(group.name)
datatable = _group_members_table(group, "List of beta_testers", course_id)
track.views.server_track(request, 'list-beta-testers', {}, page='idashboard')
elif action == 'Add beta testers':
users = request.POST['betausers']
log.debug("users: {0!r}".format(users))
group = get_beta_group(course)
for username_or_email in _split_by_comma_and_whitespace(users):
msg += "<p>{0}</p>".format(
add_user_to_group(request, username_or_email, group, 'beta testers', 'beta-tester'))
elif action == 'Remove beta testers':
users = request.POST['betausers']
group = get_beta_group(course)
for username_or_email in _split_by_comma_and_whitespace(users):
msg += "<p>{0}</p>".format(
remove_user_from_group(request, username_or_email, group, 'beta testers', 'beta-tester'))
#----------------------------------------
# forum administration
elif action == 'List course forum admins':
......@@ -522,7 +538,7 @@ def _do_remote_gradebook(user, course, action, args=None, files=None):
return msg, datatable
def _list_course_forum_members(course_id, rolename, datatable):
'''
"""
Fills in datatable with forum membership information, for a given role,
so that it will be displayed on instructor dashboard.
......@@ -530,7 +546,7 @@ def _list_course_forum_members(course_id, rolename, datatable):
rolename = one of "Administrator", "Moderator", "Community TA"
Returns message status string to append to displayed message, if role is unknown.
'''
"""
# make sure datatable is set up properly for display first, before checking for errors
datatable['header'] = ['Username', 'Full name', 'Roles']
datatable['title'] = 'List of Forum {0}s in course {1}'.format(rolename, course_id)
......@@ -590,6 +606,90 @@ def _update_forum_role_membership(uname, course, rolename, add_or_remove):
return msg
def _group_members_table(group, title, course_id):
"""
Return a data table of usernames and names of users in group_name.
Arguments:
group -- a django group.
title -- a descriptive title to show the user
Returns:
a dictionary with keys
'header': ['Username', 'Full name'],
'data': [[username, name] for all users]
'title': "{title} in course {course}"
"""
uset = group.user_set.all()
datatable = {'header': ['Username', 'Full name']}
datatable['data'] = [[x.username, x.profile.name] for x in uset]
datatable['title'] = '{0} in course {1}'.format(title, course_id)
return datatable
def _add_or_remove_user_group(request, username_or_email, group, group_title, event_name, do_add):
"""
Implementation for both add and remove functions, to get rid of shared code. do_add is bool that determines which
to do.
"""
user = None
try:
if '@' in username_or_email:
user = User.objects.get(email=username_or_email)
else:
user = User.objects.get(username=username_or_email)
except User.DoesNotExist:
msg = '<font color="red">Error: unknown username or email "{0}"</font>'.format(username_or_email)
user = None
if user is not None:
action = "Added" if do_add else "Removed"
prep = "to" if do_add else "from"
msg = '<font color="green">{action} {0} {prep} {1} group = {2}</font>'.format(user, group_title, group.name,
action=action, prep=prep)
if do_add:
user.groups.add(group)
else:
user.groups.remove(group)
event = "add" if do_add else "remove"
track.views.server_track(request, '{event}-{0} {1}'.format(event_name, user, event=event),
{}, page='idashboard')
return msg
def add_user_to_group(request, username_or_email, group, group_title, event_name):
"""
Look up the given user by username (if no '@') or email (otherwise), and add them to group.
Arguments:
request: django request--used for tracking log
username_or_email: who to add. Decide if it's an email by presense of an '@'
group: django group object
group_title: what to call this group in messages to user--e.g. "beta-testers".
event_name: what to call this event when logging to tracking logs.
Returns:
html to insert in the message field
"""
return _add_or_remove_user_group(request, username_or_email, group, group_title, event_name, True)
def remove_user_from_group(request, username_or_email, group, group_title, event_name):
"""
Look up the given user by username (if no '@') or email (otherwise), and remove them from group.
Arguments:
request: django request--used for tracking log
username_or_email: who to remove. Decide if it's an email by presense of an '@'
group: django group object
group_title: what to call this group in messages to user--e.g. "beta-testers".
event_name: what to call this event when logging to tracking logs.
Returns:
html to insert in the message field
"""
return _add_or_remove_user_group(request, username_or_email, group, group_title, event_name, False)
def get_student_grade_summary_data(request, course, course_id, get_grades=True, get_raw_scores=False, use_offline=False):
'''
......@@ -694,12 +794,20 @@ def grade_summary(request, course_id):
# enrollment
def _split_by_comma_and_whitespace(s):
"""
Split a string both by on commas and whitespice.
"""
# Note: split() with no args removes empty strings from output
lists = [x.split() for x in s.split(',')]
# return all of them
return itertools.chain(*lists)
def _do_enroll_students(course, course_id, students, overload=False):
"""Do the actual work of enrolling multiple students, presented as a string
of emails separated by commas or returns"""
ns = [x.split('\n') for x in students.split(',')]
new_students = [item for sublist in ns for item in sublist]
new_students = _split_by_comma_and_whitespace(students)
new_students = [str(s.strip()) for s in new_students]
new_students_lc = [x.lower() for x in new_students]
......
$(document).ready(function() {
var open_question = "";
var question_id;
$('.response').click(function(){
$(this).toggleClass('opened');
answer = $(this).find(".answer");
answer.slideToggle('fast');
});
});
......@@ -194,9 +194,30 @@
margin-bottom: 40px;
h3 {
background: url('/static/images/bullet-closed.png') no-repeat left 0.25em;
font-family: $sans-serif;
font-weight: 700;
margin-bottom: 15px;
margin-bottom: 10px;
padding-left: 20px;
cursor: pointer;
}
.answer {
display: none;
color: #3c3c3c;
padding-left: 16px;
font-family: $serif;
li {
line-height: 1.6em;
}
}
// opened states
&.opened {
h3 {
background: url('/static/images/bullet-open.png') no-repeat left 0.25em;
}
}
}
}
......
......@@ -36,6 +36,9 @@ table.stat_table td {
a.selectedmode { background-color: yellow; }
textarea {
height: 200px;
}
</style>
<script language="JavaScript" type="text/javascript">
......@@ -58,8 +61,8 @@ function goto( mode)
%endif
<a href="#" onclick="goto('Admin');" class="${modeflag.get('Admin')}">Admin</a> |
<a href="#" onclick="goto('Forum Admin');" class="${modeflag.get('Forum Admin')}">Forum Admin</a> |
<a href="#" onclick="goto('Enrollment');" class="${modeflag.get('Enrollment')}">Enrollment</a>
]
<a href="#" onclick="goto('Enrollment');" class="${modeflag.get('Enrollment')}">Enrollment</a> |
<a href="#" onclick="goto('Manage Groups');" class="${modeflag.get('Manage Groups')}">Manage Groups</a> ]
</h2>
<div style="text-align:right"><span id="djangopid">${djangopid}</span>
......@@ -168,7 +171,8 @@ function goto( mode)
<p>
<input type="submit" name="action" value="List course staff members">
<p>
<input type="text" name="staffuser"> <input type="submit" name="action" value="Remove course staff">
<input type="text" name="staffuser">
<input type="submit" name="action" value="Remove course staff">
<input type="submit" name="action" value="Add course staff">
<hr width="40%" style="align:left">
%endif
......@@ -250,7 +254,7 @@ function goto( mode)
%endif
<p>Add students: enter emails, separated by returns or commas;</p>
<p>Add students: enter emails, separated by new lines or commas;</p>
<textarea rows="6" cols="70" name="enroll_multiple"></textarea>
<input type="submit" name="action" value="Enroll multiple students">
......@@ -258,6 +262,24 @@ function goto( mode)
##-----------------------------------------------------------------------------
%if modeflag.get('Manage Groups'):
%if instructor_access:
<hr width="40%" style="align:left">
<p>
<input type="submit" name="action" value="List beta testers">
<p>
Enter usernames or emails for students who should be beta-testers, one per line, or separated by commas. They will get to
see course materials early, as configured via the <tt>days_early_for_beta</tt> option in the course policy.
</p>
<p>
<textarea cols="50" row="30" name="betausers"></textarea>
<input type="submit" name="action" value="Remove beta testers">
<input type="submit" name="action" value="Add beta testers">
</p>
<hr width="40%" style="align:left">
%endif
%endif
</form>
##-----------------------------------------------------------------------------
......
......@@ -5,6 +5,10 @@
<%block name="title"><title>FAQ</title></%block>
<%block name="js_extra">
<script src="${static.url('js/faq.js')}"></script>
</%block>
<section class="container about">
<nav>
<a href="${reverse('about_edx')}">Vision</a>
......@@ -13,80 +17,298 @@
<a href="${reverse('contact')}">Contact</a>
</nav>
<section class="faq">
<section class="responses">
<section id="the-organization" class="category">
<h2>Organization</h2>
<section id="edx_basics_faq" class="category">
<h2>edX Basics</h2>
<article class="response">
<h3 class="question">How do I sign up to take a class?</h3>
<div class ="answer" id="edx_basics_faq_answer_0">
<p>Simply create an edX account (it's free) and then register for the course of your choice (also free). Follow the prompts on the edX website.</p>
</div>
</article>
<article class="response">
<h3 class="question">What does it cost to take a class? Is this really free?</h3>
<div class ="answer" id="edx_basics_faq_answer_1">
<p>EdX courses are free for everyone. All you need is an Internet connection.</p>
</div>
</article>
<article class="response">
<h3 class="question">What happens after I sign up for a course?</h3>
<div class ="answer" id="edx_basics_faq_answer_2">
<p>You will receive an activation email. Follow the prompts in that email to activate your account. You will need to log in each time you access your course(s). Once the course begins, it’s time to hit the virtual books. You can access the lectures, homework, tutorials, etc., for each week, one week at a time.</p>
</div>
</article>
<article class="response">
<h3 class="question">Who can take an edX course?</h3>
<div class ="answer" id="edx_basics_faq_answer_3">
<p>You, your mom, your little brother, your grandfather -- anyone with Internet access can take an edX course. Free.</p>
</div>
</article>
<article class="response">
<h3 class="question">Are the courses only offered in English?</h3>
<div class ="answer" id="edx_basics_faq_answer_4">
<p>Some edX courses include a translation of the lecture in the text bar to the right of the video. Some have the specific option of requesting a course in other languages. Please check your course to determine foreign language options.</p>
</div>
</article>
<article class="response">
<h3 class="question">When will there be more courses on other subjects?</h3>
<div class ="answer" id="edx_basics_faq_answer_5">
<p>We are continually reviewing and creating courses to add to the edX platform. Please check the website for future course announcements. You can also "friend" edX on Facebook – you’ll receive updates and announcements.</p>
</div>
</article>
<article class="response">
<h3 class="question">How can I help edX?</h3>
<div class ="answer" id="edx_basics_faq_answer_6">
<p>You may not realize it, but just by taking a course you are helping edX. That’s because the edX platform has been specifically designed to not only teach, but also gather data about learning. EdX will utilize this data to find out how to improve education online and on-campus.</p>
</div>
</article>
<article class="response">
<h3>What is edX?</h3>
<p>edX is a not-for-profit enterprise of its founding partners, the Massachusetts Institute of Technology (MIT) and Harvard University that offers online learning to on-campus students and to millions of people around the world. To do so, edX is building an open-source online learning platform and hosts an online web portal at <a href="http://www.edx.org">www.edx.org</a> for online education.</p>
<p>EdX currently offers HarvardX, <em>MITx</em> and BerkeleyX classes online for free. Beginning in fall 2013, edX will offer WellesleyX and GeorgetownX classes online for free. The University of Texas System includes nine universities and six health institutions. The edX institutions aim to extend their collective reach to build a global community of online students. Along with offering online courses, the three universities undertake research on how students learn and how technology can transform learning both on-campus and online throughout the world.</p>
<h3 class="question">When does my course start and/or finish?</h3>
<div class ="answer" id="edx_basics_faq_answer_7">
<p>You can find the start and stop dates for each course on each course description page.</p>
</div>
</article>
<article class="response">
<h3 class="question">Is there a walk-through of a sample course session?</h3>
<div class ="answer" id="edx_basics_faq_answer_8">
<p> There are video introductions for every course that will give you a good sense of how the course works and what to expect.</p>
</div>
</article>
<article class="response">
<h3 class="question">I don't have the prerequisites for a course that I am interested in. Can I still take the course?</h3>
<div class ="answer" id="edx_basics_faq_answer_9">
<p>We do not check students for prerequisites, so you are allowed to attempt the course. However, if you do not know prerequisite subjects before taking a class, you will have to learn the prerequisite material on your own over the semester, which can be an extremely difficult task.</p>
</div>
</article>
<article class="response">
<h3 class="question">What happens if I have to quit a course, are there any penalties, will I be able to take another course in the future?</h3>
<div class ="answer" id="edx_basics_faq_answer_10">
<p>You may unregister from an edX course at anytime, there are absolutely no penalties associated with incomplete edX studies, and you may register for the same course (provided we are still offering it) at a later time.</p>
</div>
</article>
</section>
<section id="classes_faq" class="category">
<h2>The Classes</h2>
<article class="response">
<h3 class="question">How much work will I have to do to pass my course?</h3>
<div class ="answer" id="classes_faq_answer_0">
<p>The projected hours of study required for each course are described on the specific course description page.</p>
</div>
</article>
<article class="response">
<h3 class="question">What should I do before I take a course (prerequisites)?</h3>
<div class ="answer" id="classes_faq_answer_1">
<p>Each course is different – some have prerequisites, and some don’t. Take a look at your specific course’s recommended prerequisites. If you do not have a particular prerequisite, you may still take the course.</p>
</div>
</article>
<article class="response">
<h3 class="question">What books should I read? (I am interested in reading materials before the class starts).</h3>
<div class ="answer" id="classes_faq_answer_2">
<p>Take a look at the specific course prerequisites. All required academic materials will be provided during the course, within the browser. Some of the course descriptions may list additional resources. For supplemental reading material before or during the course, you can post a question on the course’s Discussion Forum to ask your online coursemates for suggestions.</p>
</div>
</article>
<article class="response">
<h3 class="question"> Can I download the book for my course?</h3>
<div class ="answer" id="classes_faq_answer_3">
<p>EdX book content may only be viewed within the browser, and downloading it violates copyright laws. If you need or want a hard copy of the book, we recommend that you purchase a copy.</p>
</div>
</article>
<article class="response">
<h3 class="question">Can I take more than one course at a time?</h3>
<div class ="answer" id="classes_faq_answer_4">
<p>You may take multiple edX courses, however we recommend checking the requirements on each course description page to determine your available study hours and the demands of the intended courses.</p>
</div>
</article>
<article class="response">
<h3>Will edX be adding additional X Universities?</h3>
<p>More than 200 institutions from around the world have expressed interest in collaborating with edX since Harvard and MIT announced its creation in May. EdX is focused above all on quality and developing the best not-for-profit model for online education. In addition to providing online courses on the edX platform, the "X University" Consortium will be a forum in which members can share experiences around online learning. Harvard, MIT, UC Berkeley, the University of Texas system and the other consortium members will work collaboratively to establish the "X University" Consortium, whose membership will expand to include additional "X Universities". Each member of the consortium will offer courses on the edX platform as an "X University." The gathering of many universities' educational content together on one site will enable learners worldwide to access the offered course content of any participating university from a single website, and to use a set of online educational tools shared by all participating universities.</p>
<p>edX will actively explore the addition of other institutions from around the world to the edX platform, and looks forward to adding more "X Universities."</p>
<h3 class="question">How do I log in to take an edX class?</h3>
<div class ="answer" id="classes_faq_answer_5">
<p>Once you sign up for a course and activate your account, click on the "Log In" button on the edx.org home page. You will need to type in your email address and edX password each time you log in.</p>
</div>
</article>
<article class="response">
<h3 class="question">What time is the class?</h3>
<div class ="answer" id="classes_faq_answer_6">
<p>EdX classes take place at your convenience. Prefer to sleep in and study late? No worries. Videos and problem sets are available 24 hours a day, which means you can watch video and complete work whenever you have spare time. You simply log in to your course via the Internet and work through the course material, one week at a time.</p>
</div>
</article>
<article class="response">
<h3 class="question">If I miss a week, how does this affect my grade?</h3>
<div class ="answer" id="classes_faq_answer_7">
<p>It is certainly possible to pass an edX course if you miss a week; however, coursework is progressive, so you should review and study what you may have missed. You can check your progress dashboard in the course to see your course average along the way if you have any concerns.</p>
</div>
</article>
<article class="response">
<h3 class="question">How can I meet/find other students?</h3>
<div class ="answer" id="classes_faq_answer_8">
<p>All edX courses have Discussion Forums where you can chat with and help each other within the framework of the Honor Code.</p>
</div>
</article>
<article class="response">
<h3 class="question">How can I talk to professors, fellows and teaching assistants?</h3>
<div class ="answer" id="classes_faq_answer_9">
<p>The Discussion Forums are the best place to reach out to the edX teaching team for your class, and you don’t have to wait in line or rearrange your schedule to fit your professor’s – just post your questions. The response isn’t always immediate, but it’s usually pretty darned quick.</p>
</div>
</article>
</section>
<section id="students" class="category">
<h2>Students</h2>
<section id="getting_help_faq" class="category">
<h2>Getting Help</h2>
<article class="response">
<h3>Who can take edX courses? Will there be an admissions process?</h3>
<p>EdX will be available to anyone in the world with an internet connection, and in general, there will not be an admissions process.</p>
<h3 class="question">Can I re-take a course?</h3>
<div class ="answer" id="getting_help_faq_answer_0">
<p>Good news: there are unlimited "mulligans" in edX. You may re-take edX courses as often as you wish. Your performance in any particular offering of a course will not effect your standing in future offerings of any edX course, including future offerings of the same course.</p>
</div>
</article>
<article class="response">
<h3>Will certificates be awarded?</h3>
<p>Yes. Online learners who demonstrate mastery of subjects can earn a certificate of completion. Certificates will be issued by edX under the name of the underlying "X University" from where the course originated, i.e. HarvardX, <em>MITx</em> or BerkeleyX. For the courses in Fall 2012, those certificates will be free. There is a plan to charge a modest fee for certificates in the future.</p>
<h3 class="question">Enrollment for a course that I am interested in is open, but the course has already started. Can I still enroll?</h3>
<div class ="answer" id="getting_help_faq_answer_1">
<p>Yes, but you will not be able to turn in any assignments or exams that have already been due. If it is early in the course, you might still be able to earn enough points for a certificate, but you will have to check with the course in question in order to find out more.</p>
</div>
</article>
<article class="response">
<h3>What will the scope of the online courses be? How many? Which faculty?</h3>
<p>Our goal is to offer a wide variety of courses across disciplines. There are currently <a href="/courses">nine courses</a> offered for Fall 2012.</p>
<h3 class="question">Is there an exam at the end?</h3>
<div class ="answer" id="getting_help_faq_answer_2">
<p>Different courses have slightly different structures. Please check the course material description to see if there is a final exam or final project.</p>
</div>
</article>
<article class="response">
<h3>Who is the learner? Domestic or international? Age range?</h3>
<p>Improving teaching and learning for students on our campuses is one of our primary goals. Beyond that, we don't have a target group of potential learners, as the goal is to make these courses available to anyone in the world - from any demographic - who has interest in advancing their own knowledge. The only requirement is to have a computer with an internet connection. More than 150,000 students from over 160 countries registered for MITx's first course, 6.002x: Circuits and Electronics. The age range of students certified in this course was from 14 to 74 years-old.</p>
<h3 class="question">Will the same courses be offered again in the future?</h3>
<div class ="answer" id="getting_help_faq_answer_3">
<p>Existing edX courses will be re-offered, and more courses added.</p>
</div>
</article>
<article class="response">
<h3>Will participating universities' standards apply to all courses offered on the edX platform?</h3>
<p>Yes: the reach changes exponentially, but the rigor remains the same.</p>
<h3 class="question">Will I get a certificate for taking an edX course?</h3>
<div class ="answer" id="getting_help_faq_answer_4">
<p>Online learners who receive a passing grade for a course will receive a certificate of mastery from edX and the underlying X University that offered the course. For example, a certificate of mastery for MITx’s 6.002x Circuits & Electronics will come from edX and MITx.</p>
</div>
</article>
<article class="response">
<h3>How do you intend to test whether this approach is improving learning?</h3>
<p>Edx institutions have assembled faculty members who will collect and analyze data to assess results and the impact edX is having on learning.</p>
<h3 class="question">How are edX certificates delivered?</h3>
<div class ="answer" id="getting_help_faq_answer_5">
<p>EdX certificates are delivered online through edx.org. So be sure to check your email in the weeks following the final grading – you will be able to download and print your certificate.</p>
</div>
</article>
<article class="response">
<h3>How may I apply to study with edX?</h3>
<p>Simply complete the online <a href="#signup-modal" rel="leanModal">signup form</a>. Enrolling will create your unique student record in the edX database, allow you to register for classes, and to receive a certificate on successful completion.</p>
<h3 class="question">What is the difference between a proctored certificate and an honor code certificate?</h3>
<div class ="answer" id="getting_help_faq_answer_6">
<p>A proctored certificate is given to students who take and pass an exam under proctored conditions. An honor-code certificate is given to students who have completed all of the necessary online coursework associated with a course and have signed <link> the edX honor code </link>.</p>
</div>
</article>
<article class="response">
<h3>How may another university participate in edX? </h3>
<p>If you are from a university interested in discussing edX, please email <a href="mailto:university@edx.org">university@edx.org</a></p>
<h3 class="question">Yes. The requirements for both certificates can be independently satisfied.</h3>
<div class ="answer" id="getting_help_faq_answer_7">
<p>It is certainly possible to pass an edX course if you miss a week; however, coursework is progressive, so you should review and study what you may have missed. You can check your progress dashboard in the course to see your course average along the way if you have any concerns.</p>
</div>
</article>
<article class="response">
<h3 class="question">Will my grade be shown on my certificate?</h3>
<div class ="answer" id="getting_help_faq_answer_8">
<p>No. Grades are not displayed on either honor code or proctored certificates.</p>
</div>
</article>
<article class="response">
<h3 class="question">How can I talk to professors, fellows and teaching assistants?</h3>
<div class ="answer" id="getting_help_faq_answer_9">
<p>The Discussion Forums are the best place to reach out to the edX teaching team for your class, and you don’t have to wait in line or rearrange your schedule to fit your professor’s – just post your questions. The response isn’t always immediate, but it’s usually pretty darned quick.</p>
</div>
</article>
<article class="response">
<h3 class="question">The only certificates distributed with grades by edX were for the initial prototype course.</h3>
<div class ="answer" id="getting_help_faq_answer_10">
<p>You may unregister from an edX course at anytime, there are absolutely no penalties associated with incomplete edX studies, and you may register for the same course (provided we are still offering it) at a later time.</p>
</div>
</article>
<article class="response">
<h3 class="question">Will my university accept my edX coursework for credit?</h3>
<div class ="answer" id="getting_help_faq_answer_11">
<p>Each educational institution makes its own decision regarding whether to accept edX coursework for credit. Check with your university for its policy.</p>
</div>
</article>
<article class="response">
<h3 class="question">I lost my edX certificate – can you resend it to me?</h3>
<div class ="answer" id="getting_help_faq_answer_12">
<p>Please log back in to your account to find certificates from the same profile page where they were originally posted. You will be able to re-print your certificate from there.</p>
</div>
</article>
</section>
<section id="open_source_faq" class="category">
<h2>edX & Open Source</h2>
<article class="response">
<h3 class="question">What’s open source?</h3>
<div class ="answer" id="open_source_faq_answer_0">
<p>Open source is a philosophy that generally refers to making software freely available for use or modification as users see fit. In exchange for use of the software, users generally add their contributions to the software, making it a public collaboration. The edX platform will be made available as open source code in order to allow world talent to improve and share it on an ongoing basis.</p>
</div>
</article>
<article class="response">
<h3 class="question">When/how can I get the open-source platform technology?</h3>
<div class ="answer" id="open_source_faq_answer_1">
<p>We are still building the edX technology platform and will be making announcements in the future about its availability.</p>
</div>
</article>
</section>
<section id="technology-platform" class="category">
<h2>Technology Platform</h2>
<section id="other_help_faq" class="category">
<h2>Other Help Questions - Account Questions</h2>
<article class="response">
<h3 class="question">My username is taken.</h3>
<div class ="answer" id="other_help_faq_answer_0">
<p>Now’s your chance to be creative: please try a different, more unique username – for example, try adding a random number to the end.</p>
</div>
</article>
<article class="response">
<h3 class="question">Why does my password show on my course login page?</h3>
<div class ="answer" id="other_help_faq_answer_1">
<p>Oops! This may be because of the way you created your account. For example, you may have mistakenly typed your password into the login box.</p>
</div>
</article>
<article class="response">
<h3 class="question">I am having login problems (password/email unrecognized).</h3>
<div class ="answer" id="other_help_faq_answer_2">
<p>Please check your browser’s settings to make sure that you have the current version of Firefox or Chrome, and then try logging in again. If you find access impossible, you may simply create a new account using an alternate email address – the old, unused account will disappear later.</p>
</div>
</article>
<article class="response">
<h3 class="question">I did not receive an activation email.</h3>
<div class ="answer" id="other_help_faq_answer_3">
<p>If you did not receive an activation email it may be because:</p>
<ul>
<li>There was a typo in your email address.</li>
<li>Your spam filter may have caught the activation email. Please check your spam folder. </li>
<li>You may be using an older browser. We recommend downloading the current version of Firefox or Chrome. </li>
<li>JavaScript is disabled in your browser. Please check your browser settings and confirm that JavaScript is enabled. </li>
</ul>
<p>If you continue to have problems activating your account, we recommend that you try creating a new account. There is no need to do anything about the old account. If it is not activated through the link in the email, it will disappear later.</p>
</div>
</article>
<article class="response">
<h3>What technology will edX use?</h3>
<p>The edX open-source online learning platform will feature interactive learning designed specifically for the web. Features will include: self-paced learning, online discussion groups, wiki-based collaborative learning, assessment of learning as a student progresses through a course, and online laboratories and other interactive learning tools. The platform will also serve as a laboratory from which data will be gathered to better understand how students learn. Because it is open source, the platform will be continuously improved by a worldwide community of collaborators, with new features added as needs arise.</p>
<p>The first version of the technology was used in the first <em>MITx</em> course, 6.002x Circuits and Electronics, which launched in Spring, 2012.</p>
<h3 class="question">Can I delete my account?</h3>
<div class ="answer" id="other_help_faq_answer_4">
<p>There’s no need to delete you account. An old, unused edX account with no course completions associated with it will disappear.</p>
</div>
</article>
<article class="response">
<h3>How is this different from what other universities are doing online?</h3>
<p>EdX is a not-for-profit enterprise built upon the shared educational missions of its founding partners, Harvard University and MIT. The edX platform will be available as open source. Also, a primary goal of edX is to improve teaching and learning on campus by experimenting with blended models of learning and by supporting faculty in conducting significant research on how students learn.</p>
<h3 class="question">I am experiencing problems with the display. E.g., There are tools missing from the course display, or I am unable to view video.</h3>
<div class ="answer" id="other_help_faq_answer_5">
<p>Please check your browser and settings. We recommend downloading the current version of Firefox or Chrome. Alternatively, you may re-register with a different email account. There is no need to delete the old account, as it will disappear if unused.</p>
</div>
</article>
</section>
</section>
<nav class="categories">
<a href="#organization">Organization</a>
<a href="#students">Students</a>
<a href="#technology-platform">Technology Platform</a>
<a href="#edx_basics_faq">edX Basics</a>
<a href="#classes_faq">The Classes</a>
<a href="#getting_help_faq">Getting Help</a>
<a href="#open_source_faq">edX & Open source</a>
<a href="#other_help_faq">Other Help Questions - Account Questions</a>
</nav>
</section>
</section>
......
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