Commit 6bebb1b7 by Diana Huang

Merge branch 'master' into feature/diana/rubric-input

parents e88fbd26 941d55ce
...@@ -629,7 +629,7 @@ class MultipleChoiceResponse(LoncapaResponse): ...@@ -629,7 +629,7 @@ class MultipleChoiceResponse(LoncapaResponse):
# define correct choices (after calling secondary setup) # define correct choices (after calling secondary setup)
xml = self.xml xml = self.xml
cxml = xml.xpath('//*[@id=$id]//choice[@correct="true"]', id=xml.get('id')) cxml = xml.xpath('//*[@id=$id]//choice[@correct="true"]', id=xml.get('id'))
self.correct_choices = [choice.get('name') for choice in cxml] self.correct_choices = [contextualize_text(choice.get('name'), self.context) for choice in cxml]
def mc_setup_response(self): def mc_setup_response(self):
''' '''
...@@ -723,7 +723,7 @@ class OptionResponse(LoncapaResponse): ...@@ -723,7 +723,7 @@ class OptionResponse(LoncapaResponse):
return cmap return cmap
def get_answers(self): def get_answers(self):
amap = dict([(af.get('id'), af.get('correct')) for af in self.answer_fields]) amap = dict([(af.get('id'), contextualize_text(af.get('correct'), self.context)) for af in self.answer_fields])
# log.debug('%s: expected answers=%s' % (unicode(self),amap)) # log.debug('%s: expected answers=%s' % (unicode(self),amap))
return amap return amap
......
...@@ -345,9 +345,9 @@ class ModuleStore(object): ...@@ -345,9 +345,9 @@ class ModuleStore(object):
''' '''
raise NotImplementedError raise NotImplementedError
def get_parent_locations(self, location): def get_parent_locations(self, location, course_id):
'''Find all locations that are the parents of this location. Needed '''Find all locations that are the parents of this location in this
for path_to_location(). course. Needed for path_to_location().
returns an iterable of things that can be passed to Location. returns an iterable of things that can be passed to Location.
''' '''
......
...@@ -309,9 +309,9 @@ class MongoModuleStore(ModuleStoreBase): ...@@ -309,9 +309,9 @@ class MongoModuleStore(ModuleStoreBase):
self._update_single_item(location, {'metadata': metadata}) self._update_single_item(location, {'metadata': metadata})
def get_parent_locations(self, location): def get_parent_locations(self, location, course_id):
'''Find all locations that are the parents of this location. Needed '''Find all locations that are the parents of this location in this
for path_to_location(). course. Needed for path_to_location().
If there is no data at location in this modulestore, raise If there is no data at location in this modulestore, raise
ItemNotFoundError. ItemNotFoundError.
......
...@@ -64,7 +64,7 @@ def path_to_location(modulestore, course_id, location): ...@@ -64,7 +64,7 @@ def path_to_location(modulestore, course_id, location):
# isn't found so we don't have to do it explicitly. Call this # isn't found so we don't have to do it explicitly. Call this
# first to make sure the location is there (even if it's a course, and # first to make sure the location is there (even if it's a course, and
# we would otherwise immediately exit). # we would otherwise immediately exit).
parents = modulestore.get_parent_locations(loc) parents = modulestore.get_parent_locations(loc, course_id)
# print 'Processing loc={0}, path={1}'.format(loc, path) # print 'Processing loc={0}, path={1}'.format(loc, path)
if loc.category == "course": if loc.category == "course":
......
...@@ -23,12 +23,3 @@ def check_path_to_location(modulestore): ...@@ -23,12 +23,3 @@ def check_path_to_location(modulestore):
for location in not_found: for location in not_found:
assert_raises(ItemNotFoundError, path_to_location, modulestore, course_id, location) assert_raises(ItemNotFoundError, path_to_location, modulestore, course_id, location)
# Since our test files are valid, there shouldn't be any
# elements with no path to them. But we can look for them in
# another course.
no_path = (
"i4x://edX/simple/video/Lost_Video",
)
for location in no_path:
assert_raises(NoPathToItem, path_to_location, modulestore, course_id, location)
...@@ -275,14 +275,16 @@ class XMLModuleStore(ModuleStoreBase): ...@@ -275,14 +275,16 @@ class XMLModuleStore(ModuleStoreBase):
class_ = getattr(import_module(module_path), class_name) class_ = getattr(import_module(module_path), class_name)
self.default_class = class_ self.default_class = class_
self.parent_tracker = ParentTracker() self.parent_trackers = defaultdict(ParentTracker)
# If we are specifically asked for missing courses, that should # If we are specifically asked for missing courses, that should
# be an error. If we are asked for "all" courses, find the ones # be an error. If we are asked for "all" courses, find the ones
# that have a course.xml # that have a course.xml. We sort the dirs in alpha order so we always
# read things in the same order (OS differences in load order have
# bitten us in the past.)
if course_dirs is None: if course_dirs is None:
course_dirs = [d for d in os.listdir(self.data_dir) if course_dirs = sorted([d for d in os.listdir(self.data_dir) if
os.path.exists(self.data_dir / d / "course.xml")] os.path.exists(self.data_dir / d / "course.xml")])
for course_dir in course_dirs: for course_dir in course_dirs:
self.try_load_course(course_dir) self.try_load_course(course_dir)
...@@ -307,7 +309,7 @@ class XMLModuleStore(ModuleStoreBase): ...@@ -307,7 +309,7 @@ class XMLModuleStore(ModuleStoreBase):
if course_descriptor is not None: if course_descriptor is not None:
self.courses[course_dir] = course_descriptor self.courses[course_dir] = course_descriptor
self._location_errors[course_descriptor.location] = errorlog self._location_errors[course_descriptor.location] = errorlog
self.parent_tracker.make_known(course_descriptor.location) self.parent_trackers[course_descriptor.id].make_known(course_descriptor.location)
else: else:
# Didn't load course. Instead, save the errors elsewhere. # Didn't load course. Instead, save the errors elsewhere.
self.errored_courses[course_dir] = errorlog self.errored_courses[course_dir] = errorlog
...@@ -432,7 +434,7 @@ class XMLModuleStore(ModuleStoreBase): ...@@ -432,7 +434,7 @@ class XMLModuleStore(ModuleStoreBase):
course_dir, course_dir,
policy, policy,
tracker, tracker,
self.parent_tracker, self.parent_trackers[course_id],
self.load_error_modules, self.load_error_modules,
) )
...@@ -541,9 +543,9 @@ class XMLModuleStore(ModuleStoreBase): ...@@ -541,9 +543,9 @@ class XMLModuleStore(ModuleStoreBase):
""" """
raise NotImplementedError("XMLModuleStores are read-only") raise NotImplementedError("XMLModuleStores are read-only")
def get_parent_locations(self, location): def get_parent_locations(self, location, course_id):
'''Find all locations that are the parents of this location. Needed '''Find all locations that are the parents of this location in this
for path_to_location(). course. Needed for path_to_location().
If there is no data at location in this modulestore, raise If there is no data at location in this modulestore, raise
ItemNotFoundError. ItemNotFoundError.
...@@ -552,7 +554,7 @@ class XMLModuleStore(ModuleStoreBase): ...@@ -552,7 +554,7 @@ class XMLModuleStore(ModuleStoreBase):
be empty if there are no parents. be empty if there are no parents.
''' '''
location = Location.ensure_fully_specified(location) location = Location.ensure_fully_specified(location)
if not self.parent_tracker.is_known(location): if not self.parent_trackers[course_id].is_known(location):
raise ItemNotFoundError(location) raise ItemNotFoundError("{0} not in {1}".format(location, course_id))
return self.parent_tracker.parents(location) return self.parent_trackers[course_id].parents(location)
...@@ -19,6 +19,11 @@ Use the MacPorts package `mongodb` or the Homebrew formula `mongodb` ...@@ -19,6 +19,11 @@ Use the MacPorts package `mongodb` or the Homebrew formula `mongodb`
## Initializing Mongodb ## Initializing Mongodb
First start up the mongo daemon. E.g. to start it up in the background
using a config file:
mongod --config /usr/local/etc/mongod.conf &
Check out the course data directories that you want to work with into the Check out the course data directories that you want to work with into the
`GITHUB_REPO_ROOT` (by default, `../data`). Then run the following command: `GITHUB_REPO_ROOT` (by default, `../data`). Then run the following command:
...@@ -37,8 +42,12 @@ This runs all the tests (long, uses collectstatic): ...@@ -37,8 +42,12 @@ This runs all the tests (long, uses collectstatic):
If if you aren't changing static files, can run `rake test` once, then run If if you aren't changing static files, can run `rake test` once, then run
rake fasttest_{lms,cms} rake fasttest_lms
or
rake fasttest_cms
xmodule can be tested independently, with this: xmodule can be tested independently, with this:
rake test_common/lib/xmodule rake test_common/lib/xmodule
......
...@@ -422,7 +422,8 @@ class formula(object): ...@@ -422,7 +422,8 @@ class formula(object):
def GetContentMathML(self, asciimath, mathml): def GetContentMathML(self, asciimath, mathml):
# URL = 'http://192.168.1.2:8080/snuggletex-webapp-1.2.2/ASCIIMathMLUpConversionDemo' # URL = 'http://192.168.1.2:8080/snuggletex-webapp-1.2.2/ASCIIMathMLUpConversionDemo'
URL = 'http://127.0.0.1:8080/snuggletex-webapp-1.2.2/ASCIIMathMLUpConversionDemo' # URL = 'http://127.0.0.1:8080/snuggletex-webapp-1.2.2/ASCIIMathMLUpConversionDemo'
URL = 'https://math-xserver.mitx.mit.edu/snuggletex-webapp-1.2.2/ASCIIMathMLUpConversionDemo'
if 1: if 1:
payload = {'asciiMathInput': asciimath, payload = {'asciiMathInput': asciimath,
...@@ -430,7 +431,7 @@ class formula(object): ...@@ -430,7 +431,7 @@ class formula(object):
#'asciiMathML':unicode(mathml).encode('utf-8'), #'asciiMathML':unicode(mathml).encode('utf-8'),
} }
headers = {'User-Agent': "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13"} headers = {'User-Agent': "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13"}
r = requests.post(URL, data=payload, headers=headers) r = requests.post(URL, data=payload, headers=headers, verify=False)
r.encoding = 'utf-8' r.encoding = 'utf-8'
ret = r.text ret = r.text
#print "encoding: ",r.encoding #print "encoding: ",r.encoding
......
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
<article class="response"> <article class="response">
<h3>What is edX?</h3> <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 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> <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>
</article> </article>
<article class="response"> <article class="response">
......
...@@ -38,7 +38,7 @@ ...@@ -38,7 +38,7 @@
<div class="inner-wrapper"> <div class="inner-wrapper">
<h3>EdX is looking to add new talent to our team! </h3> <h3>EdX is looking to add new talent to our team! </h3>
<p align="center"><em>Our mission is to give a world-class education to everyone, everywhere, regardless of gender, income or social status</em></p> <p align="center"><em>Our mission is to give a world-class education to everyone, everywhere, regardless of gender, income or social status</em></p>
<p>Today, EdX.org, a not-for-profit provides hundreds of thousands of people from around the globe with access free education.&nbsp; We offer amazing quality classes by the best professors from the best schools. We enable our members to uncover a new passion that will transform their lives and their communities.</p> <p>Today, EdX.org, a not-for-profit provides hundreds of thousands of people from around the globe with access to free education.&nbsp; We offer amazing quality classes by the best professors from the best schools. We enable our members to uncover a new passion that will transform their lives and their communities.</p>
<p>Around the world-from coast to coast, in over 192 countries, people are making the decision to take one or several of our courses. As we continue to grow our operations, we are looking for talented, passionate people with great ideas to join the edX team. We aim to create an environment that is supportive, diverse, and as fun as our brand. If you're results-oriented, dedicated, and ready to contribute to an unparalleled member experience for our community, we really want you to apply.</p> <p>Around the world-from coast to coast, in over 192 countries, people are making the decision to take one or several of our courses. As we continue to grow our operations, we are looking for talented, passionate people with great ideas to join the edX team. We aim to create an environment that is supportive, diverse, and as fun as our brand. If you're results-oriented, dedicated, and ready to contribute to an unparalleled member experience for our community, we really want you to apply.</p>
<p>As part of the edX team, you&rsquo;ll receive:</p> <p>As part of the edX team, you&rsquo;ll receive:</p>
<ul> <ul>
......
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