Remove use of the deprecated course_structures module.
This commit is contained in:
@@ -30,7 +30,6 @@ from lms.djangoapps.ccx.models import CcxFieldOverride, CustomCourseForEdX
|
|||||||
from lms.djangoapps.ccx.overrides import override_field_for_ccx
|
from lms.djangoapps.ccx.overrides import override_field_for_ccx
|
||||||
from lms.djangoapps.ccx.tests.utils import CcxTestCase
|
from lms.djangoapps.ccx.tests.utils import CcxTestCase
|
||||||
from lms.djangoapps.ccx.utils import ccx_course as ccx_course_cm
|
from lms.djangoapps.ccx.utils import ccx_course as ccx_course_cm
|
||||||
from lms.djangoapps.ccx.utils import get_course_chapters
|
|
||||||
from lms.djangoapps.instructor.access import allow_access, list_with_level
|
from lms.djangoapps.instructor.access import allow_access, list_with_level
|
||||||
from lms.djangoapps.instructor.enrollment import enroll_email, get_email_params
|
from lms.djangoapps.instructor.enrollment import enroll_email, get_email_params
|
||||||
from student.models import CourseEnrollment
|
from student.models import CourseEnrollment
|
||||||
@@ -78,7 +77,7 @@ class CcxRestApiTest(CcxTestCase, APITestCase):
|
|||||||
self.course.enable_ccx = True
|
self.course.enable_ccx = True
|
||||||
self.mstore.update_item(self.course, self.coach.id)
|
self.mstore.update_item(self.course, self.coach.id)
|
||||||
# making the master course chapters easily available
|
# making the master course chapters easily available
|
||||||
self.master_course_chapters = get_course_chapters(self.master_course_key)
|
self.master_course_chapters = courses.get_course_chapters(self.master_course_key)
|
||||||
|
|
||||||
def get_auth_token(self, app_grant, app_client):
|
def get_auth_token(self, app_grant, app_client):
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -23,7 +23,6 @@ from lms.djangoapps.ccx.overrides import override_field_for_ccx
|
|||||||
from lms.djangoapps.ccx.utils import (
|
from lms.djangoapps.ccx.utils import (
|
||||||
add_master_course_staff_to_ccx,
|
add_master_course_staff_to_ccx,
|
||||||
assign_staff_role_to_ccx,
|
assign_staff_role_to_ccx,
|
||||||
get_course_chapters,
|
|
||||||
is_email
|
is_email
|
||||||
)
|
)
|
||||||
from lms.djangoapps.instructor.enrollment import enroll_email, get_email_params
|
from lms.djangoapps.instructor.enrollment import enroll_email, get_email_params
|
||||||
@@ -187,9 +186,7 @@ def valid_course_modules(course_module_list, master_course_key):
|
|||||||
Returns:
|
Returns:
|
||||||
bool: whether or not all the course module strings belong to the master course
|
bool: whether or not all the course module strings belong to the master course
|
||||||
"""
|
"""
|
||||||
course_chapters = get_course_chapters(master_course_key)
|
course_chapters = courses.get_course_chapters(master_course_key)
|
||||||
if course_chapters is None:
|
|
||||||
return False
|
|
||||||
return set(course_module_list).intersection(set(course_chapters)) == set(course_module_list)
|
return set(course_module_list).intersection(set(course_chapters)) == set(course_module_list)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -55,50 +55,6 @@ class TestGetCCXFromCCXLocator(ModuleStoreTestCase):
|
|||||||
self.assertEqual(result, ccx)
|
self.assertEqual(result, ccx)
|
||||||
|
|
||||||
|
|
||||||
@attr(shard=1)
|
|
||||||
class TestGetCourseChapters(CcxTestCase):
|
|
||||||
"""
|
|
||||||
Tests for the `get_course_chapters` util function
|
|
||||||
"""
|
|
||||||
ENABLED_SIGNALS = ['course_published']
|
|
||||||
|
|
||||||
def setUp(self):
|
|
||||||
"""
|
|
||||||
Set up tests
|
|
||||||
"""
|
|
||||||
super(TestGetCourseChapters, self).setUp()
|
|
||||||
self.course_key = self.course.location.course_key
|
|
||||||
|
|
||||||
def test_get_structure_non_existing_key(self):
|
|
||||||
"""
|
|
||||||
Test to get the course structure
|
|
||||||
"""
|
|
||||||
self.assertEqual(utils.get_course_chapters(None), None)
|
|
||||||
# build a fake key
|
|
||||||
fake_course_key = CourseKey.from_string('course-v1:FakeOrg+CN1+CR-FALLNEVER1')
|
|
||||||
self.assertEqual(utils.get_course_chapters(fake_course_key), None)
|
|
||||||
|
|
||||||
@mock.patch('openedx.core.djangoapps.content.course_structures.models.CourseStructure.structure',
|
|
||||||
new_callable=mock.PropertyMock)
|
|
||||||
def test_wrong_course_structure(self, mocked_attr):
|
|
||||||
"""
|
|
||||||
Test the case where the course has an unexpected structure.
|
|
||||||
"""
|
|
||||||
mocked_attr.return_value = {'foo': 'bar'}
|
|
||||||
self.assertEqual(utils.get_course_chapters(self.course_key), [])
|
|
||||||
|
|
||||||
def test_get_chapters(self):
|
|
||||||
"""
|
|
||||||
Happy path
|
|
||||||
"""
|
|
||||||
course_chapters = utils.get_course_chapters(self.course_key)
|
|
||||||
self.assertEqual(len(course_chapters), 2)
|
|
||||||
self.assertEqual(
|
|
||||||
sorted(course_chapters),
|
|
||||||
sorted([unicode(child) for child in self.course.children])
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class TestStaffOnCCX(CcxTestCase):
|
class TestStaffOnCCX(CcxTestCase):
|
||||||
"""
|
"""
|
||||||
Tests for staff on ccx courses.
|
Tests for staff on ccx courses.
|
||||||
|
|||||||
@@ -321,32 +321,6 @@ def is_email(identifier):
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
def get_course_chapters(course_key):
|
|
||||||
"""
|
|
||||||
Extracts the chapters from a course structure.
|
|
||||||
If the course does not exist returns None.
|
|
||||||
If the structure does not contain 1st level children,
|
|
||||||
it returns an empty list.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
course_key (CourseLocator): the course key
|
|
||||||
Returns:
|
|
||||||
list (string): a list of string representing the chapters modules
|
|
||||||
of the course
|
|
||||||
"""
|
|
||||||
if course_key is None:
|
|
||||||
return
|
|
||||||
try:
|
|
||||||
course_obj = CourseStructure.objects.get(course_id=course_key)
|
|
||||||
except CourseStructure.DoesNotExist:
|
|
||||||
return
|
|
||||||
course_struct = course_obj.structure
|
|
||||||
try:
|
|
||||||
return course_struct['blocks'][course_struct['root']].get('children', [])
|
|
||||||
except KeyError:
|
|
||||||
return []
|
|
||||||
|
|
||||||
|
|
||||||
def add_master_course_staff_to_ccx(master_course, ccx_key, display_name, send_email=True):
|
def add_master_course_staff_to_ccx(master_course, ccx_key, display_name, send_email=True):
|
||||||
"""
|
"""
|
||||||
Add staff and instructor roles on ccx to all the staff and instructors members of master course.
|
Add staff and instructor roles on ccx to all the staff and instructors members of master course.
|
||||||
|
|||||||
@@ -593,3 +593,19 @@ def get_current_child(xmodule, min_depth=None, requested_child=None):
|
|||||||
child = _get_default_child_module(children)
|
child = _get_default_child_module(children)
|
||||||
|
|
||||||
return child
|
return child
|
||||||
|
|
||||||
|
|
||||||
|
def get_course_chapters(course_key):
|
||||||
|
"""
|
||||||
|
Extracts the chapter block keys from a course structure.
|
||||||
|
|
||||||
|
Arguments:
|
||||||
|
course_key (CourseLocator): The course key
|
||||||
|
Returns:
|
||||||
|
list (string): The list of string representations of the chapter block keys in the course.
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
chapters = modulestore().get_items(course_key, qualifiers={'category': 'chapter'})
|
||||||
|
except Exception: # pylint: disable=broad-except
|
||||||
|
return []
|
||||||
|
return [unicode(chapter.location) for chapter in chapters]
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ from django.core.urlresolvers import reverse
|
|||||||
from django.test.client import RequestFactory
|
from django.test.client import RequestFactory
|
||||||
from django.test.utils import override_settings
|
from django.test.utils import override_settings
|
||||||
from nose.plugins.attrib import attr
|
from nose.plugins.attrib import attr
|
||||||
|
from opaque_keys.edx.keys import CourseKey
|
||||||
from six import text_type
|
from six import text_type
|
||||||
|
|
||||||
from courseware.courses import (
|
from courseware.courses import (
|
||||||
@@ -21,11 +22,12 @@ from courseware.courses import (
|
|||||||
get_cms_course_link,
|
get_cms_course_link,
|
||||||
get_course_about_section,
|
get_course_about_section,
|
||||||
get_course_by_id,
|
get_course_by_id,
|
||||||
|
get_course_chapters,
|
||||||
get_course_info_section,
|
get_course_info_section,
|
||||||
get_course_overview_with_access,
|
get_course_overview_with_access,
|
||||||
get_course_with_access,
|
get_course_with_access,
|
||||||
get_courses,
|
get_courses,
|
||||||
get_current_child
|
get_current_child,
|
||||||
)
|
)
|
||||||
from courseware.model_data import FieldDataCache
|
from courseware.model_data import FieldDataCache
|
||||||
from courseware.module_render import get_module_for_descriptor
|
from courseware.module_render import get_module_for_descriptor
|
||||||
@@ -424,3 +426,30 @@ class CourseInstantiationTests(ModuleStoreTestCase):
|
|||||||
for section in chapter.get_children():
|
for section in chapter.get_children():
|
||||||
for item in section.get_children():
|
for item in section.get_children():
|
||||||
self.assertTrue(item.graded)
|
self.assertTrue(item.graded)
|
||||||
|
|
||||||
|
|
||||||
|
@attr(shard=1)
|
||||||
|
class TestGetCourseChapters(ModuleStoreTestCase):
|
||||||
|
"""
|
||||||
|
Tests for the `get_course_chapters` function.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def test_get_non_existant_course(self):
|
||||||
|
"""
|
||||||
|
Test non-existant course returns empty list.
|
||||||
|
"""
|
||||||
|
self.assertEqual(get_course_chapters(None), [])
|
||||||
|
# build a fake key
|
||||||
|
fake_course_key = CourseKey.from_string('course-v1:FakeOrg+CN1+CR-FALLNEVER1')
|
||||||
|
self.assertEqual(get_course_chapters(fake_course_key), [])
|
||||||
|
|
||||||
|
def test_get_chapters(self):
|
||||||
|
"""
|
||||||
|
Test get_course_chapters returns expected result.
|
||||||
|
"""
|
||||||
|
course = CourseFactory()
|
||||||
|
ItemFactory(parent=course, category='chapter')
|
||||||
|
self.assertEqual(
|
||||||
|
get_course_chapters(course.location.course_key),
|
||||||
|
[unicode(child) for child in course.children]
|
||||||
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user