From a5a61292c844831f7cb3ff5f9301e18e0dce1977 Mon Sep 17 00:00:00 2001 From: Ahmed Khalid Date: Thu, 18 Dec 2025 17:45:38 +0500 Subject: [PATCH] feat: add topic filter dropdown in course schedule and detail page --- .../contentstore/rest_api/v1/serializers/settings.py | 1 + .../contentstore/rest_api/v1/views/course_details.py | 7 ++++++- cms/djangoapps/contentstore/rest_api/v1/views/settings.py | 3 +++ openedx/core/djangoapps/models/course_details.py | 3 +++ 4 files changed, 13 insertions(+), 1 deletion(-) diff --git a/cms/djangoapps/contentstore/rest_api/v1/serializers/settings.py b/cms/djangoapps/contentstore/rest_api/v1/serializers/settings.py index b1a02fff1f39..e71e81ba64f7 100644 --- a/cms/djangoapps/contentstore/rest_api/v1/serializers/settings.py +++ b/cms/djangoapps/contentstore/rest_api/v1/serializers/settings.py @@ -21,6 +21,7 @@ class CourseSettingsSerializer(serializers.Serializer): is_entrance_exams_enabled = serializers.BooleanField() is_prerequisite_courses_enabled = serializers.BooleanField() language_options = serializers.ListField(child=serializers.ListField(child=serializers.CharField())) + topic_options = serializers.ListField(child=serializers.CharField()) lms_link_for_about_page = serializers.URLField() licensing_enabled = serializers.BooleanField() marketing_enabled = serializers.BooleanField() diff --git a/cms/djangoapps/contentstore/rest_api/v1/views/course_details.py b/cms/djangoapps/contentstore/rest_api/v1/views/course_details.py index d5ccf3c6165e..7216f331d7cb 100644 --- a/cms/djangoapps/contentstore/rest_api/v1/views/course_details.py +++ b/cms/djangoapps/contentstore/rest_api/v1/views/course_details.py @@ -103,7 +103,12 @@ def get(self, request: Request, course_id: str): course_details = CourseDetails.fetch(course_key) serializer = CourseDetailsSerializer(course_details) - return Response(serializer.data) + + course_block = modulestore().get_course(course_key) + # Create a mutable copy and add the field + data = dict(serializer.data) + data['topic'] = course_block.other_course_settings.get('topic') + return Response(data) @apidocs.schema( body=CourseDetailsSerializer, diff --git a/cms/djangoapps/contentstore/rest_api/v1/views/settings.py b/cms/djangoapps/contentstore/rest_api/v1/views/settings.py index fbb05cba4de2..ffd1fae18a80 100644 --- a/cms/djangoapps/contentstore/rest_api/v1/views/settings.py +++ b/cms/djangoapps/contentstore/rest_api/v1/views/settings.py @@ -98,6 +98,8 @@ def get(self, request: Request, course_id: str): } ``` """ + # Lazy import to avoid circular import + from openedx_wikilearn_features.wikimedia_general.utils import get_topics #pylint: disable=import-outside-toplevel course_key = CourseKey.from_string(course_id) if not has_studio_read_access(request.user, course_key): self.permission_denied(request) @@ -111,6 +113,7 @@ def get(self, request: Request, course_id: str): 'course_display_name_with_default': course_block.display_name_with_default, 'platform_name': settings.PLATFORM_NAME, 'licensing_enabled': settings.FEATURES.get("LICENSING", False), + 'topic_options': get_topics(), }) serializer = CourseSettingsSerializer(settings_context) diff --git a/openedx/core/djangoapps/models/course_details.py b/openedx/core/djangoapps/models/course_details.py index c00d7d0b8816..8606e2e1d179 100644 --- a/openedx/core/djangoapps/models/course_details.py +++ b/openedx/core/djangoapps/models/course_details.py @@ -315,6 +315,9 @@ def update_from_json(cls, course_key, jsondict, user): # pylint: disable=too-ma cls.update_about_video(block, jsondict['intro_video'], user.id) + # Lazy import to avoid circular import + from openedx_wikilearn_features.wikimedia_general.utils import update_other_course_settings #pylint: disable=import-outside-toplevel + update_other_course_settings({'topic': jsondict['topic']}, block, user) # Could just return jsondict w/o doing any db reads, but I put # the reads in as a means to confirm it persisted correctly return CourseDetails.fetch(course_key)