feat: waffle flag for redirecting to courseware MFE

1. This is a partial check-in.  It causes jump_to links in the header user menu to work, but doesn’t address any other dashboard links.
2. I also need to figure out the best way to test this, having not tested a toggle like this before.
This commit is contained in:
David Joy
2020-02-04 13:28:54 -05:00
parent 3f85ba3fe6
commit d96ff272e2
3 changed files with 73 additions and 3 deletions

View File

@@ -0,0 +1,30 @@
"""
Toggles for courseware in-course experience.
"""
from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers
from openedx.core.djangoapps.waffle_utils import CourseWaffleFlag, WaffleFlagNamespace
# Namespace for courseware waffle flags.
WAFFLE_FLAG_NAMESPACE = WaffleFlagNamespace(name='courseware')
# Waffle flag to redirect to another learner profile experience.
# .. toggle_name: courseware.redirect_to_microfrontend
# .. toggle_implementation: CourseWaffleFlag
# .. toggle_default: False
# .. toggle_description: Supports staged rollout of a new micro-frontend-based implementation of the courseware page.
# .. toggle_category: micro-frontend
# .. toggle_use_cases: incremental_release, open_edx
# .. toggle_creation_date: 2020-01-29
# .. toggle_expiration_date: 2020-12-31
# .. toggle_warnings: Also set settings.LEARNING_MICROFRONTEND_URL and ENABLE_COURSEWARE_MICROFRONTEND.
# .. toggle_tickets:
# .. toggle_status: supported
REDIRECT_TO_COURSEWARE_MICROFRONTEND = CourseWaffleFlag(WAFFLE_FLAG_NAMESPACE, 'redirect_to_microfrontend')
def should_redirect_to_courseware_microfrontend(course_key):
return (
configuration_helpers.get_value('ENABLE_COURSEWARE_MICROFRONTEND') and
REDIRECT_TO_COURSEWARE_MICROFRONTEND.is_enabled(course_key)
)

View File

@@ -2,14 +2,14 @@
Module to define url helpers functions
"""
import six
from django.conf import settings
from django.urls import reverse
from six.moves.urllib.parse import urlencode # pylint: disable=import-error
from xmodule.modulestore.django import modulestore
from xmodule.modulestore.search import navigation_index, path_to_location
from lms.djangoapps.courseware.toggles import should_redirect_to_courseware_microfrontend
def get_redirect_url(course_key, usage_key, request=None):
""" Returns the redirect url back to courseware
@@ -25,6 +25,10 @@ def get_redirect_url(course_key, usage_key, request=None):
Redirect url string
"""
if should_redirect_to_courseware_microfrontend(course_key):
path = path_to_location(modulestore(), usage_key, request, full_path=True)
return get_microfrontend_redirect_url(course_key, path)
(
course_key, chapter, section, vertical_unused,
position, final_target_id
@@ -52,3 +56,39 @@ def get_redirect_url(course_key, usage_key, request=None):
)
redirect_url += "?{}".format(urlencode({'activate_block_id': six.text_type(final_target_id)}))
return redirect_url
def get_microfrontend_redirect_url(course_key, path):
"""
The micro-frontend determines the user's position in the vertical via
a separate API call, so all we need here is the course_key, section, and vertical
IDs to format it's URL.
It is also capable of determining our section and vertical if they're not present. Fully specifying it all is preferable, though, as the micro-frontend can save itself some work, resulting in a better user experience.
We're building a URL like this:
http://localhost:2000/course-v1:edX+DemoX+Demo_Course/block-v1:edX+DemoX+Demo_Course+type@sequential+block@19a30717eff543078a5d94ae9d6c18a5/block-v1:edX+DemoX+Demo_Course+type@vertical+block@4a1bba2a403f40bca5ec245e945b0d76
"""
redirect_url = '{base_url}/{prefix}/{course_key}'.format(
base_url=settings.LEARNING_MICROFRONTEND_URL,
prefix='course/',
course_key=course_key
)
# The first four elements of the path list are the ones we care about here:
# - course
# - chapter
# - sequence
# - vertical
# We skip course because we already have it from our argument above, and we skip chapter because the micro-frontend URL doesn't include it.
if len(path) > 2:
redirect_url += '/{sequence_key}'.format(
sequence_key=path[2]
)
if len(path) > 3:
redirect_url += '/{vertical_key}'.format(
vertical_key=path[3]
)
return redirect_url

View File

@@ -295,4 +295,4 @@ EDXNOTES_INTERNAL_API = 'http://edx.devstack.edxnotesapi:18120/api/v1'
EDXNOTES_CLIENT_NAME = 'edx_notes_api-backend-service'
############## Settings for Microfrontends #########################
LEARNING_MICROFRONTEND_URL = 'http://localhost:2000/'
LEARNING_MICROFRONTEND_URL = 'http://localhost:2000'