Merge pull request #1434 from edx/dhm/bug_has_access

Use known translation if exists to get groupname
This commit is contained in:
Don Mitchell
2013-10-22 07:18:32 -07:00
6 changed files with 62 additions and 77 deletions

View File

@@ -10,6 +10,7 @@ from django.conf import settings
from xmodule.modulestore import Location
from xmodule.modulestore.locator import CourseLocator, Locator
from xmodule.modulestore.django import loc_mapper
# define a couple of simple roles, we just need ADMIN and EDITOR now for our purposes
@@ -35,7 +36,9 @@ def get_course_groupname_for_role(location, role):
if isinstance(location, Location):
groupnames.append('{0}_{1}'.format(role, location.course))
elif isinstance(location, CourseLocator):
groupnames.append('{0}_{1}'.format(role, location.as_old_location_course_id))
old_location = loc_mapper().translate_locator_to_location(location)
if old_location:
groupnames.append('{0}_{1}'.format(role, old_location.course_id))
for groupname in groupnames:
if Group.objects.filter(name=groupname).exists():

View File

@@ -1,29 +1,48 @@
"""
Unit tests for getting the list of courses and the course outline.
"""
from django.core.urlresolvers import reverse
import json
import lxml
from django.core.urlresolvers import reverse
from contentstore.tests.utils import CourseTestCase
from xmodule.modulestore.django import loc_mapper
from django.core.exceptions import PermissionDenied
from xmodule.modulestore.tests.factories import CourseFactory
from xmodule.modulestore import parsers
class TestCourseIndex(CourseTestCase):
"""
Unit tests for getting the list of courses and the course outline.
"""
def test_index(self):
def setUp(self):
"""
Add a course with odd characters in the fields
"""
super(TestCourseIndex, self).setUp()
# had a problem where index showed course but has_access failed to retrieve it for non-staff
self.odd_course = CourseFactory.create(
org='test.org_1-2',
number='test-2.3_course',
display_name='dotted.course.name-2',
)
def check_index_and_outline(self, authed_client):
"""
Test getting the list of courses and then pulling up their outlines
"""
index_url = reverse('contentstore.views.index')
index_response = self.client.get(index_url, {}, HTTP_ACCEPT='text/html')
index_response = authed_client.get(index_url, {}, HTTP_ACCEPT='text/html')
parsed_html = lxml.html.fromstring(index_response.content)
course_link_eles = parsed_html.find_class('course-link')
self.assertGreaterEqual(len(course_link_eles), 2)
for link in course_link_eles:
self.assertRegexpMatches(link.get("href"), r'course/\w+\.\w+\.\w+.*/branch/\w+/block/.*')
self.assertRegexpMatches(
link.get("href"),
r'course/{0}+/branch/{0}+/block/{0}+'.format(parsers.ALLOWED_ID_CHARS)
)
# now test that url
outline_response = self.client.get(link.get("href"), {}, HTTP_ACCEPT='text/html')
outline_response = authed_client.get(link.get("href"), {}, HTTP_ACCEPT='text/html')
# ensure it has the expected 2 self referential links
outline_parsed = lxml.html.fromstring(outline_response.content)
outline_link = outline_parsed.find_class('course-link')[0]
@@ -31,6 +50,12 @@ class TestCourseIndex(CourseTestCase):
course_menu_link = outline_parsed.find_class('nav-course-courseware-outline')[0]
self.assertEqual(course_menu_link.find("a").get("href"), link.get("href"))
def test_is_staff_access(self):
"""
Test that people with is_staff see the courses and can navigate into them
"""
self.check_index_and_outline(self.client)
def test_negative_conditions(self):
"""
Test the error conditions for the access
@@ -38,6 +63,28 @@ class TestCourseIndex(CourseTestCase):
locator = loc_mapper().translate_location(self.course.location.course_id, self.course.location, False, True)
outline_url = reverse('contentstore.views.course_handler', kwargs={'course_url': unicode(locator)})
# register a non-staff member and try to delete the course branch
non_staff_client = self.createNonStaffAuthedUserClient()
non_staff_client, _ = self.createNonStaffAuthedUserClient()
response = non_staff_client.delete(outline_url, {}, HTTP_ACCEPT='application/json')
self.assertEqual(response.status_code, 403)
def test_course_staff_access(self):
"""
Make and register an course_staff and ensure they can access the courses
"""
course_staff_client, course_staff = self.createNonStaffAuthedUserClient()
for course in [self.course, self.odd_course]:
permission_url = reverse("course_team_user", kwargs={
"org": course.location.org,
"course": course.location.course,
"name": course.location.name,
"email": course_staff.email,
})
self.client.post(
permission_url,
data=json.dumps({"role": "staff"}),
content_type="application/json",
HTTP_ACCEPT="application/json",
)
# test access
self.check_index_and_outline(course_staff_client)

View File

@@ -78,4 +78,4 @@ class CourseTestCase(ModuleStoreTestCase):
client = Client()
client.login(username=uname, password=password)
return client
return client, nonstaff

View File

@@ -131,9 +131,9 @@ def course_index(request, course_url):
lms_link = get_lms_link_for_item(old_location)
upload_asset_callback_url = reverse('upload_asset', kwargs={
'org': location.as_old_location_org,
'course': location.as_old_location_course,
'coursename': location.as_old_location_run
'org': old_location.org,
'course': old_location.course,
'coursename': old_location.name
})
course = modulestore().get_item(old_location, depth=3)