Remove use of the deprecated course_structures module.

This commit is contained in:
Douglas Hall
2018-04-10 17:16:55 -04:00
parent d8d7e33879
commit 4d72d9caae
6 changed files with 48 additions and 77 deletions

View File

@@ -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):
""" """

View File

@@ -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)

View File

@@ -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.

View File

@@ -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.

View File

@@ -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]

View File

@@ -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]
)