Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

DRAFT: feat: [FC-0070] [BE] Remove backend redirects (use SPA functionality) #35622

Draft
wants to merge 1 commit into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
from .course_index import CourseIndexSerializer
from .course_rerun import CourseRerunSerializer
from .course_team import CourseTeamSerializer
from .course_waffle_flags import CourseWaffleFlagsSerializer
from .grading import CourseGradingModelSerializer, CourseGradingSerializer
from .group_configurations import CourseGroupConfigurationsSerializer
from .home import CourseHomeSerializer, CourseHomeTabSerializer, LibraryTabSerializer
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,146 @@
"""
API Serializers for course waffle flags
"""

from rest_framework import serializers

from cms.djangoapps.contentstore import toggles


class CourseWaffleFlagsSerializer(serializers.Serializer):
"""
Serializer for course waffle flags
"""
use_new_home_page = serializers.SerializerMethodField()
use_new_custom_pages = serializers.SerializerMethodField()
use_new_schedule_details_page = serializers.SerializerMethodField()
use_new_advanced_settings_page = serializers.SerializerMethodField()
use_new_grading_page = serializers.SerializerMethodField()
use_new_updates_page = serializers.SerializerMethodField()
use_new_import_page = serializers.SerializerMethodField()
use_new_export_page = serializers.SerializerMethodField()
use_new_files_uploads_page = serializers.SerializerMethodField()
use_new_video_uploads_page = serializers.SerializerMethodField()
use_new_course_outline_page = serializers.SerializerMethodField()
use_new_unit_page = serializers.SerializerMethodField()
use_new_course_team_page = serializers.SerializerMethodField()
use_new_certificates_page = serializers.SerializerMethodField()
use_new_textbooks_page = serializers.SerializerMethodField()
use_new_group_configurations_page = serializers.SerializerMethodField()

def get_course_key(self):
"""
Retrieve the course_key from the context
"""
return self.context.get("course_key")

def get_use_new_home_page(self, obj):
"""
Method to get the use_new_home_page switch
"""
return toggles.use_new_home_page()

def get_use_new_custom_pages(self, obj):
"""
Method to get the use_new_custom_pages switch
"""
course_key = self.get_course_key()
return toggles.use_new_custom_pages(course_key)

def get_use_new_schedule_details_page(self, obj):
"""
Method to get the use_new_schedule_details_page switch
"""
course_key = self.get_course_key()
return toggles.use_new_schedule_details_page(course_key)

def get_use_new_advanced_settings_page(self, obj):
"""
Method to get the use_new_advanced_settings_page switch
"""
course_key = self.get_course_key()
return toggles.use_new_advanced_settings_page(course_key)

def get_use_new_grading_page(self, obj):
"""
Method to get the use_new_grading_page switch
"""
course_key = self.get_course_key()
return toggles.use_new_grading_page(course_key)

def get_use_new_updates_page(self, obj):
"""
Method to get the use_new_updates_page switch
"""
course_key = self.get_course_key()
return toggles.use_new_updates_page(course_key)

def get_use_new_import_page(self, obj):
"""
Method to get the use_new_import_page switch
"""
course_key = self.get_course_key()
return toggles.use_new_import_page(course_key)

def get_use_new_export_page(self, obj):
"""
Method to get the use_new_export_page switch
"""
course_key = self.get_course_key()
return toggles.use_new_export_page(course_key)

def get_use_new_files_uploads_page(self, obj):
"""
Method to get the use_new_files_uploads_page switch
"""
course_key = self.get_course_key()
return toggles.use_new_files_uploads_page(course_key)

def get_use_new_video_uploads_page(self, obj):
"""
Method to get the use_new_video_uploads_page switch
"""
course_key = self.get_course_key()
return toggles.use_new_video_uploads_page(course_key)

def get_use_new_course_outline_page(self, obj):
"""
Method to get the use_new_course_outline_page switch
"""
course_key = self.get_course_key()
return toggles.use_new_course_outline_page(course_key)

def get_use_new_unit_page(self, obj):
"""
Method to get the use_new_unit_page switch
"""
course_key = self.get_course_key()
return toggles.use_new_unit_page(course_key)

def get_use_new_course_team_page(self, obj):
"""
Method to get the use_new_course_team_page switch
"""
course_key = self.get_course_key()
return toggles.use_new_course_team_page(course_key)

def get_use_new_certificates_page(self, obj):
"""
Method to get the use_new_certificates_page switch
"""
course_key = self.get_course_key()
return toggles.use_new_certificates_page(course_key)

def get_use_new_textbooks_page(self, obj):
"""
Method to get the use_new_textbooks_page switch
"""
course_key = self.get_course_key()
return toggles.use_new_textbooks_page(course_key)

def get_use_new_group_configurations_page(self, obj):
"""
Method to get the use_new_group_configurations_page switch
"""
course_key = self.get_course_key()
return toggles.use_new_group_configurations_page(course_key)
6 changes: 6 additions & 0 deletions cms/djangoapps/contentstore/rest_api/v1/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
CourseRerunView,
CourseSettingsView,
CourseVideosView,
CourseWaffleFlagsView,
HomePageView,
HomePageCoursesView,
HomePageLibrariesView,
Expand Down Expand Up @@ -131,6 +132,11 @@
VerticalContainerView.as_view(),
name="container_vertical"
),
re_path(
fr'^course_waffle_flags(?:/{COURSE_ID_PATTERN})?/$',
CourseWaffleFlagsView.as_view(),
name="course_waffle_flags"
),

# Authoring API
# Do not use under v1 yet (Nov. 23). The Authoring API is still experimental and the v0 versions should be used
Expand Down
1 change: 1 addition & 0 deletions cms/djangoapps/contentstore/rest_api/v1/views/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
from .course_details import CourseDetailsView
from .course_index import CourseIndexView
from .course_rerun import CourseRerunView
from .course_waffle_flags import CourseWaffleFlagsView
from .course_team import CourseTeamView
from .grading import CourseGradingView
from .group_configurations import CourseGroupConfigurationsView
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
from opaque_keys.edx.keys import CourseKey
from rest_framework.decorators import APIView
from rest_framework.response import Response

from openedx.core.lib.api.view_utils import view_auth_classes

from ..serializers import CourseWaffleFlagsSerializer


@view_auth_classes(is_authenticated=True)
class CourseWaffleFlagsView(APIView):
"""
API view to retrieve course waffle flag settings for a specific course.

This view provides a GET endpoint that returns the status of various waffle
flags for a given course. It requires the user to be authenticated.
"""

def get(self, request, course_id=None):
"""
Retrieve the waffle flag settings for the specified course.

Args:
request (HttpRequest): The HTTP request object.
course_id (str, optional): The ID of the course for which to retrieve
the waffle flag settings. If not provided,
defaults to None.

Returns:
Response: A JSON response containing the status of various waffle flags
for the specified course.

**Example Request**

GET /api/contentstore/v1/course_waffle_flags
GET /api/contentstore/v1/course_waffle_flags/course-v1:test+test+test

**Response Values**

A JSON response containing the status of various waffle flags
for the specified course.

**Example Response**

```json
{
"use_new_home_page": true,
"use_new_custom_pages": true,
"use_new_schedule_details_page": true,
"use_new_advanced_settings_page": true,
"use_new_grading_page": true,
"use_new_updates_page": true,
"use_new_import_page": true,
"use_new_export_page": true,
"use_new_files_uploads_page": true,
"use_new_video_uploads_page": false,
"use_new_course_outline_page": true,
"use_new_unit_page": false,
"use_new_course_team_page": true,
"use_new_certificates_page": true,
"use_new_textbooks_page": true,
"use_new_group_configurations_page": true
}
```
"""
course_key = CourseKey.from_string(course_id) if course_id else None
serializer = CourseWaffleFlagsSerializer(
context={"course_key": course_key}, data={}
)
serializer.is_valid(raise_exception=True)
return Response(serializer.data)
Loading