diff --git a/lms/djangoapps/course_home_api/dates/v1/views.py b/lms/djangoapps/course_home_api/dates/v1/views.py index d16e594ded..9726f7ad02 100644 --- a/lms/djangoapps/course_home_api/dates/v1/views.py +++ b/lms/djangoapps/course_home_api/dates/v1/views.py @@ -67,7 +67,7 @@ class DatesTabView(RetrieveAPIView): 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) + display_reset_dates_text = dates_banner_should_display(course_key, request) learner_is_verified = False enrollment = get_enrollment(request.user.username, course_key_string) diff --git a/lms/djangoapps/courseware/views/views.py b/lms/djangoapps/courseware/views/views.py index 321f1b2790..48d73f7be9 100644 --- a/lms/djangoapps/courseware/views/views.py +++ b/lms/djangoapps/courseware/views/views.py @@ -1063,7 +1063,7 @@ def dates(request, course_id): user_timezone = user_timezone_locale['user_timezone'] user_language = user_timezone_locale['user_language'] - missed_deadlines, enrollment_mode = dates_banner_should_display(course_key, request) + missed_deadlines = dates_banner_should_display(course_key, request) context = { 'course': course, @@ -1081,7 +1081,6 @@ def dates(request, course_id): course_key=course_key, ), 'missed_deadlines': missed_deadlines, - 'enrollment_mode': enrollment_mode, 'reset_deadlines_url': reverse(RESET_COURSE_DEADLINES_NAME), 'reset_deadlines_redirect_url_base': COURSE_DATES_NAME, 'reset_deadlines_redirect_url_id_dict': {'course_id': str(course.id)} @@ -1667,7 +1666,7 @@ def render_xblock(request, usage_key_string, check_if_enrolled=True): 'mark-completed-on-view-after-delay': completion_service.get_complete_on_view_delay_ms() } - missed_deadlines, enrollment_mode = dates_banner_should_display(course_key, request) + missed_deadlines = dates_banner_should_display(course_key, request) context = { 'fragment': block.render('student_view', context=student_view_context), @@ -1682,7 +1681,6 @@ def render_xblock(request, usage_key_string, check_if_enrolled=True): 'staff_access': bool(request.user.has_perm(VIEW_XQA_INTERFACE, course)), 'xqa_server': settings.FEATURES.get('XQA_SERVER', 'http://your_xqa_server.com'), 'missed_deadlines': missed_deadlines, - 'enrollment_mode': enrollment_mode, 'web_app_course_url': reverse(COURSE_HOME_VIEW_NAME, args=[course.id]), 'on_courseware_page': True, 'content_type_gating_enabled': ContentTypeGatingConfig.enabled_for_enrollment( diff --git a/lms/templates/dates_banner.html b/lms/templates/dates_banner.html index 40a1455cd7..4b99e371e5 100644 --- a/lms/templates/dates_banner.html +++ b/lms/templates/dates_banner.html @@ -17,9 +17,6 @@ from course_modes.models import CourseMode % endif <% -has_locked_assignments = any(hasattr(block, 'contains_gated_content') and block.contains_gated_content for block in course_date_blocks if isinstance(block, CourseAssignmentDate)) if (course_date_blocks and on_dates_tab) else False -is_verified = enrollment_mode == CourseMode.VERIFIED -is_audit = enrollment_mode == CourseMode.AUDIT additional_styling_class = 'on-mobile' if is_mobile_app else 'has-button' %> @@ -98,13 +95,13 @@ additional_styling_class = 'on-mobile' if is_mobile_app else 'has-button' % endif -% if on_dates_tab and is_audit and has_locked_assignments and not missed_deadlines: +% if on_dates_tab and content_type_gating_enabled and not missed_deadlines: ${upgrade_to_complete_graded_banner()} % elif missed_deadlines: - % if is_verified: - ${reset_dates_banner()} - % elif is_audit: + % if content_type_gating_enabled: ${upgrade_to_reset_banner()} + % else: + ${reset_dates_banner()} % endif % endif diff --git a/openedx/features/course_experience/tests/views/test_course_outline.py b/openedx/features/course_experience/tests/views/test_course_outline.py index 709bd8ef56..de86b37cbb 100644 --- a/openedx/features/course_experience/tests/views/test_course_outline.py +++ b/openedx/features/course_experience/tests/views/test_course_outline.py @@ -25,6 +25,7 @@ from waffle.models import Switch from waffle.testutils import override_switch from course_modes.models import CourseMode +from course_modes.tests.factories import CourseModeFactory from lms.djangoapps.courseware.tests.factories import StaffFactory from lms.urls import RESET_COURSE_DEADLINES_NAME from gating import api as lms_gating_api @@ -33,6 +34,7 @@ from openedx.core.djangoapps.schedules.models import Schedule from openedx.core.djangoapps.schedules.tests.factories import ScheduleFactory from openedx.core.lib.gating import api as gating_api from openedx.features.course_experience import RELATIVE_DATES_FLAG +from openedx.features.content_type_gating.models import ContentTypeGatingConfig from openedx.features.course_experience.views.course_outline import ( DEFAULT_COMPLETION_TRACKING_START, CourseOutlineFragmentView @@ -170,20 +172,29 @@ class TestCourseOutlinePage(SharedModuleStoreTestCase): @RELATIVE_DATES_FLAG.override(active=True) @ddt.data( - (CourseMode.AUDIT, False, True), - (CourseMode.VERIFIED, False, True), - (CourseMode.MASTERS, False, False), - (CourseMode.VERIFIED, True, False), + ([CourseMode.AUDIT, CourseMode.VERIFIED], CourseMode.AUDIT, False, True), + ([CourseMode.AUDIT, CourseMode.VERIFIED], CourseMode.VERIFIED, False, True), + ([CourseMode.AUDIT, CourseMode.VERIFIED, CourseMode.MASTERS], CourseMode.MASTERS, False, True), + ([CourseMode.PROFESSIONAL], CourseMode.PROFESSIONAL, False, True), + ([CourseMode.AUDIT, CourseMode.VERIFIED], CourseMode.VERIFIED, True, False), ) @ddt.unpack def test_reset_course_deadlines_banner_shows_for_self_paced_course( self, + course_modes, enrollment_mode, is_course_staff, should_display ): + ContentTypeGatingConfig.objects.create( + enabled=True, + enabled_as_of=datetime.datetime(2018, 1, 1), + ) course = self.courses[0] - enrollment = CourseEnrollment.objects.get(course_id=course.id) + for mode in course_modes: + CourseModeFactory.create(course_id=course.id, mode_slug=mode) + + enrollment = CourseEnrollment.objects.get(course_id=course.id, user=self.user) enrollment.mode = enrollment_mode enrollment.save() self.user.is_staff = is_course_staff diff --git a/openedx/features/course_experience/views/course_outline.py b/openedx/features/course_experience/views/course_outline.py index 93769183fc..750b40e832 100644 --- a/openedx/features/course_experience/views/course_outline.py +++ b/openedx/features/course_experience/views/course_outline.py @@ -97,15 +97,9 @@ class CourseOutlineFragmentView(EdxFragmentView): reset_deadlines_url = reverse(RESET_COURSE_DEADLINES_NAME) reset_deadlines_redirect_url_base = COURSE_HOME_VIEW_NAME - course_enrollment = None - if not request.user.is_anonymous: - course_enrollment = CourseEnrollment.objects.filter(course=course_overview, user=request.user).filter( - Q(mode=CourseMode.AUDIT) | Q(mode=CourseMode.VERIFIED)).first() - context['reset_deadlines_url'] = reset_deadlines_url context['reset_deadlines_redirect_url_base'] = reset_deadlines_redirect_url_base context['reset_deadlines_redirect_url_id_dict'] = {'course_id': str(course.id)} - context['enrollment_mode'] = getattr(course_enrollment, 'mode', None) context['verified_upgrade_link'] = verified_upgrade_deadline_link(request.user, course=course) context['on_course_outline_page'] = True context['content_type_gating_enabled'] = ContentTypeGatingConfig.enabled_for_enrollment(