Use content_type_gating to determine whether a learner has access to content on the dates page

This commit is contained in:
Calen Pennington
2020-05-28 15:31:44 -04:00
parent ee61c9dc75
commit b37be506fe
6 changed files with 24 additions and 23 deletions

View File

@@ -21,10 +21,10 @@ class DateSummarySerializer(serializers.Serializer):
title = serializers.CharField()
def get_learner_has_access(self, block):
learner_is_verified = self.context.get('learner_is_verified', False)
learner_is_full_access = self.context.get('learner_is_full_access', False)
block_is_verified = (getattr(block, 'contains_gated_content', False) or
isinstance(block, VerificationDeadlineDate))
return (not block_is_verified) or learner_is_verified
return (not block_is_verified) or learner_is_full_access
def get_link(self, block):
if block.link:
@@ -39,6 +39,6 @@ class DatesTabSerializer(serializers.Serializer):
"""
course_date_blocks = DateSummarySerializer(many=True)
display_reset_dates_text = serializers.BooleanField()
learner_is_verified = serializers.BooleanField()
learner_is_full_access = serializers.BooleanField()
user_timezone = serializers.CharField()
verified_upgrade_link = serializers.URLField()

View File

@@ -2,7 +2,7 @@
Tests for Dates Tab API in the Course Home API
"""
from datetime import datetime
import ddt
from django.urls import reverse
@@ -10,6 +10,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 openedx.features.content_type_gating.models import ContentTypeGatingConfig
from student.models import CourseEnrollment
@@ -22,6 +23,7 @@ class DatesTabTestViews(BaseCourseHomeTests):
def setUpClass(cls):
BaseCourseHomeTests.setUpClass()
cls.url = reverse('course-home-dates-tab', args=[cls.course.id])
ContentTypeGatingConfig.objects.create(enabled=True, enabled_as_of=datetime(2017, 1, 1))
@COURSE_HOME_MICROFRONTEND.override(active=True)
@COURSE_HOME_MICROFRONTEND_DATES_TAB.override(active=True)
@@ -33,7 +35,7 @@ class DatesTabTestViews(BaseCourseHomeTests):
# Pulling out the date blocks to check learner has access.
date_blocks = response.data.get('course_date_blocks')
self.assertEqual(response.data.get('learner_is_verified'), enrollment_mode == CourseMode.VERIFIED)
self.assertEqual(response.data.get('learner_is_full_access'), enrollment_mode == CourseMode.VERIFIED)
self.assertTrue(all(block.get('learner_has_access') for block in date_blocks))
@COURSE_HOME_MICROFRONTEND.override(active=True)
@@ -41,7 +43,7 @@ class DatesTabTestViews(BaseCourseHomeTests):
def test_get_authenticated_user_not_enrolled(self):
response = self.client.get(self.url)
self.assertEqual(response.status_code, 200)
self.assertFalse(response.data.get('learner_is_verified'))
self.assertFalse(response.data.get('learner_is_full_access'))
def test_get_unauthenticated_user(self):
self.client.logout()

View File

@@ -18,6 +18,7 @@ from lms.djangoapps.course_home_api.dates.v1.serializers import DatesTabSerializ
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
from openedx.features.content_type_gating.models import ContentTypeGatingConfig
class DatesTabView(RetrieveAPIView):
@@ -44,7 +45,7 @@ class DatesTabView(RetrieveAPIView):
title: (str) The title of the date event
display_reset_dates_text: (bool) Indicates whether the reset dates banner should be shown
for the given user
learner_is_verified: (bool) Indicates if the user is verified in the course
learner_is_full_access: (bool) Indicates if the user is verified in the course
user_timezone: (str) The user's preferred timezone
verified_upgrade_link: (str) The link for upgrading to the Verified track in a course
@@ -74,10 +75,10 @@ class DatesTabView(RetrieveAPIView):
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)
learner_is_verified = False
enrollment = get_enrollment(request.user.username, course_key_string)
if enrollment:
learner_is_verified = enrollment.get('mode') == 'verified'
learner_is_full_access = not ContentTypeGatingConfig.enabled_for_enrollment(
user=request.user,
course_key=course_key,
)
# User locale settings
user_timezone_locale = user_timezone_locale_prefs(request)
@@ -86,12 +87,12 @@ class DatesTabView(RetrieveAPIView):
data = {
'course_date_blocks': [block for block in blocks if not isinstance(block, TodaysDate)],
'display_reset_dates_text': display_reset_dates_text,
'learner_is_verified': learner_is_verified,
'learner_is_full_access': learner_is_full_access,
'user_timezone': user_timezone,
'verified_upgrade_link': verified_upgrade_deadline_link(request.user, course=course),
}
context = self.get_serializer_context()
context['learner_is_verified'] = learner_is_verified
context['learner_is_full_access'] = learner_is_full_access
serializer = self.get_serializer_class()(data, context=context)
return Response(serializer.data)

View File

@@ -3097,6 +3097,7 @@ class DatesTabTestCase(ModuleStoreTestCase):
self.user = UserFactory()
self.client.login(username=self.user.username, password=TEST_PASSWORD)
ContentTypeGatingConfig.objects.create(enabled=True, enabled_as_of=datetime(2017, 1, 1))
def _get_response(self, course):
""" Returns the HTML for the progress page """

View File

@@ -1053,10 +1053,7 @@ def dates(request, course_id):
course_date_blocks = get_course_date_blocks(course, request.user, request,
include_access=True, include_past_dates=True)
learner_is_verified = False
enrollment = get_enrollment(request.user.username, course_id)
if enrollment:
learner_is_verified = enrollment.get('mode') == 'verified'
learner_is_full_access = not ContentTypeGatingConfig.enabled_for_enrollment(request.user, course_key)
# User locale settings
user_timezone_locale = user_timezone_locale_prefs(request)
@@ -1069,7 +1066,7 @@ def dates(request, course_id):
'course': course,
'course_date_blocks': course_date_blocks,
'verified_upgrade_link': verified_upgrade_deadline_link(request.user, course=course),
'learner_is_verified': learner_is_verified,
'learner_is_full_access': learner_is_full_access,
'user_timezone': user_timezone,
'user_language': user_language,
'supports_preview_menu': True,

View File

@@ -30,15 +30,15 @@ from openedx.core.djangolib.markup import HTML, Text
<% due_next_set = False %>
% for block in course_date_blocks:
<% block_is_verified = (hasattr(block, 'contains_gated_content') and block.contains_gated_content) or isinstance(block, VerificationDeadlineDate) %>
<% learner_has_access = not block_is_verified or learner_is_verified %>
<% learner_has_access = not block_is_verified or learner_is_full_access %>
<% access_class = '' if learner_has_access else 'no-access' %>
<% is_assignment = isinstance(block, CourseAssignmentDate) %>
<% todays_date = 'todays-date' if isinstance(block, TodaysDate) else '' %>
<% past_date = 'past-date' if block.date and block.date < block.current_time else '' %>
<% past_due = 'past-due' if learner_is_verified and is_assignment and block.past_due else '' %>
<% due_in_future = True if learner_is_verified and is_assignment and block.date and block.date >= block.current_time else False %>
<% not_released = 'not-released' if learner_is_verified and is_assignment and not block.title_html else '' %>
% if not (learner_is_verified and isinstance(block, VerifiedUpgradeDeadlineDate)):
<% past_due = 'past-due' if learner_is_full_access and is_assignment and block.past_due else '' %>
<% due_in_future = True if learner_is_full_access and is_assignment and block.date and block.date >= block.current_time else False %>
<% not_released = 'not-released' if learner_is_full_access and is_assignment and not block.title_html else '' %>
% if not (learner_is_full_access and isinstance(block, VerifiedUpgradeDeadlineDate)):
<div class="timeline-item">
<div class="date-circle ${todays_date} ${past_date} ${past_due}"></div>
<div class="date-content ${todays_date}">