diff --git a/lms/djangoapps/course_home_api/outline/v1/serializers.py b/lms/djangoapps/course_home_api/outline/v1/serializers.py index 9222c98a10015cbdc1e0877ca11216a9eeb156f3..96562b4079fe450fe4875d1df8616fd613758ae7 100644 --- a/lms/djangoapps/course_home_api/outline/v1/serializers.py +++ b/lms/djangoapps/course_home_api/outline/v1/serializers.py @@ -2,8 +2,8 @@ Outline Tab Serializers. """ - from rest_framework import serializers +from rest_framework.reverse import reverse class CourseToolSerializer(serializers.Serializer): @@ -21,8 +21,32 @@ class CourseToolSerializer(serializers.Serializer): return request.build_absolute_uri(url) +class CourseBlockSerializer(serializers.Serializer): + """ + Serializer for Course Block Objects + """ + blocks = serializers.SerializerMethodField() + + def get_blocks(self, blocks): + return { + str(block_key): { + 'id': str(block_key), + 'type': block_key.category, + 'display_name': blocks.get_xblock_field(block_key, 'display_name', block_key.category), + 'lms_web_url': reverse( + 'jump_to', + kwargs={'course_id': str(block_key.course_key), 'location': str(block_key)}, + request=self.context['request'], + ), + 'children': [str(child_key) for child_key in blocks.get_children(block_key)], + } + for block_key in blocks + } + + class OutlineTabSerializer(serializers.Serializer): """ Serializer for the Outline Tab """ course_tools = CourseToolSerializer(many=True) + course_blocks = CourseBlockSerializer() diff --git a/lms/djangoapps/course_home_api/outline/v1/views.py b/lms/djangoapps/course_home_api/outline/v1/views.py index 5d4419403e7a110864e44b65c81056e4de1809a3..4deaf0319a3793e0183909303e1422a5488b5c12 100644 --- a/lms/djangoapps/course_home_api/outline/v1/views.py +++ b/lms/djangoapps/course_home_api/outline/v1/views.py @@ -8,11 +8,17 @@ from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response from edx_django_utils import monitoring as monitoring_utils -from opaque_keys.edx.keys import CourseKey +from opaque_keys.edx.keys import CourseKey, UsageKey +from lms.djangoapps.course_api.blocks.transformers.blocks_api import BlocksAPITransformer from lms.djangoapps.course_home_api.outline.v1.serializers import OutlineTabSerializer +from openedx.core.djangoapps.content.block_structure.transformers import BlockStructureTransformers from openedx.features.course_experience.course_tools import CourseToolsPluginManager +from lms.djangoapps.course_blocks.api import get_course_blocks +import lms.djangoapps.course_blocks.api as course_blocks_api +from xmodule.modulestore.django import modulestore + class OutlineTabView(RetrieveAPIView): """ @@ -29,9 +35,21 @@ class OutlineTabView(RetrieveAPIView): Body consists of the following fields: course_tools: List of serialized Course Tool objects. Each serialization has the following fields: - analytics_id: (str) The unique id given to the tool - title: (str) The display title of the tool - url: (str) The link to access the tool + analytics_id: (str) The unique id given to the tool. + title: (str) The display title of the tool. + url: (str) The link to access the tool. + course_blocks: + blocks: List of serialized Course Block objects. Each serialization has the following fields: + id: (str) The usage ID of the block. + type: (str) The type of block. Possible values the names of any + XBlock type in the system, including custom blocks. Examples are + course, chapter, sequential, vertical, html, problem, video, and + discussion. + display_name: (str) The display name of the block. + lms_web_url: (str) The URL to the navigational container of the + xBlock on the web LMS. + children: (list) If the block has child blocks, a list of IDs of + the child blocks. **Returns** @@ -44,17 +62,29 @@ class OutlineTabView(RetrieveAPIView): permission_classes = (IsAuthenticated,) serializer_class = OutlineTabSerializer - def get(self, request, course_key_string): + def get(self, request, *args, **kwargs): + course_key_string = kwargs.get('course_key_string') + course_key = CourseKey.from_string(course_key_string) + course_usage_key = modulestore().make_course_usage_key(course_key) + # Enable NR tracing for this view based on course monitoring_utils.set_custom_metric('course_id', course_key_string) monitoring_utils.set_custom_metric('user_id', request.user.id) monitoring_utils.set_custom_metric('is_staff', request.user.is_staff) - course_key = CourseKey.from_string(course_key_string) course_tools = CourseToolsPluginManager.get_enabled_course_tools(request, course_key) + transformers = BlockStructureTransformers() + transformers += course_blocks_api.get_course_block_access_transformers(request.user) + transformers += [ + BlocksAPITransformer(None, None, depth=3), + ] + + course_blocks = get_course_blocks(request.user, course_usage_key, transformers, include_completion=True) + data = { 'course_tools': course_tools, + 'course_blocks': course_blocks, } context = self.get_serializer_context() context['course_key'] = course_key