From 07099777854a3b69f84ef9f78bc6f9eb86bd625d Mon Sep 17 00:00:00 2001 From: Nicholas D'Alfonso Date: Thu, 28 May 2020 21:32:53 -0400 Subject: [PATCH] AA-117 mfe date tab waffle flag - create master course home waffle flag - create course waffle flag for accessing the mfe dates tab --- .../dates/v1/tests/test_views.py | 7 +++++++ .../course_home_api/dates/v1/views.py | 7 ++++++- lms/djangoapps/course_home_api/toggles.py | 19 +++++++++++++++++++ lms/djangoapps/course_home_api/utils.py | 15 +++++++++++++++ lms/djangoapps/courseware/tabs.py | 12 ++++++++++++ 5 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 lms/djangoapps/course_home_api/toggles.py create mode 100644 lms/djangoapps/course_home_api/utils.py diff --git a/lms/djangoapps/course_home_api/dates/v1/tests/test_views.py b/lms/djangoapps/course_home_api/dates/v1/tests/test_views.py index 604765fe15..34d4905afb 100644 --- a/lms/djangoapps/course_home_api/dates/v1/tests/test_views.py +++ b/lms/djangoapps/course_home_api/dates/v1/tests/test_views.py @@ -9,6 +9,7 @@ from django.urls import reverse from course_modes.models import CourseMode from lms.djangoapps.course_home_api.tests.utils import BaseCourseHomeTests +from lms.djangoapps.course_home_api.toggles import COURSE_HOME_MICROFRONTEND, COURSE_HOME_MICROFRONTEND_DATES_TAB from student.models import CourseEnrollment @@ -22,6 +23,8 @@ class DatesTabTestViews(BaseCourseHomeTests): BaseCourseHomeTests.setUpClass() cls.url = reverse('course-home-dates-tab', args=[cls.course.id]) + @COURSE_HOME_MICROFRONTEND.override(active=True) + @COURSE_HOME_MICROFRONTEND_DATES_TAB.override(active=True) @ddt.data(CourseMode.AUDIT, CourseMode.VERIFIED) def test_get_authenticated_enrolled_user(self, enrollment_mode): CourseEnrollment.enroll(self.user, self.course.id, enrollment_mode) @@ -38,6 +41,8 @@ class DatesTabTestViews(BaseCourseHomeTests): self.assertTrue(response.data.get('learner_is_verified')) self.assertTrue(all(block.get('learner_has_access') for block in date_blocks)) + @COURSE_HOME_MICROFRONTEND.override(active=True) + @COURSE_HOME_MICROFRONTEND_DATES_TAB.override(active=True) def test_get_authenticated_user_not_enrolled(self): response = self.client.get(self.url) self.assertEqual(response.status_code, 200) @@ -48,6 +53,8 @@ class DatesTabTestViews(BaseCourseHomeTests): response = self.client.get(self.url) self.assertEqual(response.status_code, 403) + @COURSE_HOME_MICROFRONTEND.override(active=True) + @COURSE_HOME_MICROFRONTEND_DATES_TAB.override(active=True) def test_get_unknown_course(self): url = reverse('course-home-dates-tab', args=['course-v1:unknown+course+2T2020']) response = self.client.get(url) diff --git a/lms/djangoapps/course_home_api/dates/v1/views.py b/lms/djangoapps/course_home_api/dates/v1/views.py index d16e594ded..0483aa7e1e 100644 --- a/lms/djangoapps/course_home_api/dates/v1/views.py +++ b/lms/djangoapps/course_home_api/dates/v1/views.py @@ -3,6 +3,7 @@ Dates Tab Views """ +from rest_framework import status from rest_framework.generics import RetrieveAPIView from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response @@ -14,6 +15,7 @@ from lms.djangoapps.courseware.context_processor import user_timezone_locale_pre from lms.djangoapps.courseware.courses import get_course_date_blocks, get_course_with_access from lms.djangoapps.courseware.date_summary import TodaysDate, verified_upgrade_deadline_link from lms.djangoapps.course_home_api.dates.v1.serializers import DatesTabSerializer +from lms.djangoapps.course_home_api.toggles import course_home_mfe_dates_tab_is_active from openedx.core.djangoapps.enrollments.api import get_enrollment from openedx.features.course_experience.utils import dates_banner_should_display @@ -58,13 +60,16 @@ class DatesTabView(RetrieveAPIView): def get(self, request, *args, **kwargs): course_key_string = kwargs.get('course_key_string') + course_key = CourseKey.from_string(course_key_string) + + if not course_home_mfe_dates_tab_is_active(course_key): + return Response(status=status.HTTP_404_NOT_FOUND) # 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 = get_course_with_access(request.user, 'load', course_key, check_if_enrolled=False) blocks = get_course_date_blocks(course, request.user, request, include_access=True, include_past_dates=True) display_reset_dates_text, _ = dates_banner_should_display(course_key, request) diff --git a/lms/djangoapps/course_home_api/toggles.py b/lms/djangoapps/course_home_api/toggles.py new file mode 100644 index 0000000000..bc486be81f --- /dev/null +++ b/lms/djangoapps/course_home_api/toggles.py @@ -0,0 +1,19 @@ +""" +Toggles for course home experience. +""" + +from lms.djangoapps.experiments.flags import ExperimentWaffleFlag +from openedx.core.djangoapps.waffle_utils import CourseWaffleFlag, WaffleFlagNamespace + +WAFFLE_FLAG_NAMESPACE = WaffleFlagNamespace(name='course_home') + +COURSE_HOME_MICROFRONTEND = ExperimentWaffleFlag(WAFFLE_FLAG_NAMESPACE, 'course_home_mfe') + +COURSE_HOME_MICROFRONTEND_DATES_TAB = CourseWaffleFlag(WAFFLE_FLAG_NAMESPACE, 'course_home_mfe_dates_tab') + + +def course_home_mfe_dates_tab_is_active(course_key): + return ( + COURSE_HOME_MICROFRONTEND.is_enabled(course_key) and + COURSE_HOME_MICROFRONTEND_DATES_TAB.is_enabled(course_key) + ) diff --git a/lms/djangoapps/course_home_api/utils.py b/lms/djangoapps/course_home_api/utils.py new file mode 100644 index 0000000000..ba39ea56ad --- /dev/null +++ b/lms/djangoapps/course_home_api/utils.py @@ -0,0 +1,15 @@ +"""Utility functions for course home""" + +from django.conf import settings + + +def get_microfrontend_url(course_key, view_name=None): + """ + Takes in a course key and view name, returns the appropriate course home mfe route + """ + mfe_link = '{}/course/{}'.format(settings.LEARNING_MICROFRONTEND_URL, course_key) + + if view_name: + mfe_link += '/{}'.format(view_name) + + return mfe_link diff --git a/lms/djangoapps/courseware/tabs.py b/lms/djangoapps/courseware/tabs.py index 3b952443e1..80bec53a0a 100644 --- a/lms/djangoapps/courseware/tabs.py +++ b/lms/djangoapps/courseware/tabs.py @@ -11,6 +11,8 @@ from django.utils.translation import ugettext_noop from lms.djangoapps.courseware.access import has_access from lms.djangoapps.courseware.entrance_exams import user_can_skip_entrance_exam +from lms.djangoapps.course_home_api.toggles import course_home_mfe_dates_tab_is_active +from lms.djangoapps.course_home_api.utils import get_microfrontend_url from openedx.core.djangoapps.content.course_overviews.models import CourseOverview from openedx.core.lib.course_tabs import CourseTabPluginManager from openedx.features.course_experience import RELATIVE_DATES_FLAG, UNIFIED_COURSE_TAB_FLAG, default_course_url_name @@ -318,6 +320,16 @@ class DatesTab(CourseTab): view_name = "dates" is_dynamic = True + def __init__(self, tab_dict): + def link_func(course, reverse_func): + if course_home_mfe_dates_tab_is_active(course.id): + return get_microfrontend_url(course_key=course.id, view_name=self.view_name) + else: + return reverse_func(self.view_name, args=[six.text_type(course.id)]) + + tab_dict['link_func'] = link_func + super(DatesTab, self).__init__(tab_dict) + @classmethod def is_enabled(cls, course, user=None): """Returns true if this tab is enabled."""