Commit 9d6ed66e by Don Mitchell

Add loc mapper fn from locn to CourseLocator

parent 32e00212
......@@ -168,7 +168,7 @@ class CourseRole(GroupBasedRole):
else:
groupnames.append('{0}_{1}'.format(role, course_context))
try:
locator = loc_mapper().translate_location(course_context, self.location, True, True)
locator = loc_mapper().translate_location_to_course_locator(course_context, self.location)
groupnames.append('{0}_{1}'.format(role, locator.package_id))
except (InvalidLocationError, ItemNotFoundError):
# if it's never been mapped, the auth won't be via the Locator syntax
......
......@@ -7,7 +7,7 @@ import pymongo
import bson.son
from xmodule.modulestore.exceptions import InvalidLocationError, ItemNotFoundError
from xmodule.modulestore.locator import BlockUsageLocator
from xmodule.modulestore.locator import BlockUsageLocator, CourseLocator
from xmodule.modulestore import Location
import urllib
......@@ -249,6 +249,37 @@ class LocMapperStore(object):
return result
return None
def translate_location_to_course_locator(self, old_style_course_id, location, published=True):
"""
Used when you only need the CourseLocator and not a full BlockUsageLocator. Probably only
useful for get_items which wildcards name or category.
:param course_id: old style course id
"""
# doesn't use caching as cache requires full location w/o wildcards
location_id = self._interpret_location_course_id(old_style_course_id, location)
if old_style_course_id is None:
old_style_course_id = self._generate_location_course_id(location_id)
maps = self.location_map.find(location_id)
maps = list(maps)
if len(maps) == 0:
raise ItemNotFoundError()
elif len(maps) == 1:
entry = maps[0]
else:
# find entry w/o name, if any; otherwise, pick arbitrary
entry = maps[0]
for item in maps:
if 'name' not in item['_id']:
entry = item
break
if published:
branch = entry['prod_branch']
else:
branch = entry['draft_branch']
return CourseLocator(package_id=entry['course_id'], branch=branch)
def _add_to_block_map(self, location, location_id, block_map):
'''add the given location to the block_map and persist it'''
if self._block_id_is_guid(location.name):
......
......@@ -89,6 +89,14 @@ class TestLocationMapper(unittest.TestCase):
self.assertEqual(prob_locator.block_id, block_id)
self.assertEqual(prob_locator.branch, branch)
course_locator = loc_mapper().translate_location_to_course_locator(
old_style_course_id,
location,
published=(branch == 'published'),
)
self.assertEqual(course_locator.package_id, new_style_package_id)
self.assertEqual(course_locator.branch, branch)
def test_translate_location_read_only(self):
"""
Test the variants of translate_location which don't create entries, just decode
......
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