From 3e71a45349e581d05288442f9f59db7e423e9897 Mon Sep 17 00:00:00 2001 From: Diana Huang Date: Mon, 15 May 2017 15:46:31 -0400 Subject: [PATCH] Only show preview bar if student can view it. --- lms/djangoapps/courseware/access_utils.py | 9 ++++++++ lms/djangoapps/courseware/tests/test_views.py | 23 ++++++++++++++++++- lms/djangoapps/courseware/testutils.py | 6 +++-- lms/djangoapps/courseware/views/index.py | 9 ++++---- lms/djangoapps/courseware/views/views.py | 14 +++++++---- 5 files changed, 48 insertions(+), 13 deletions(-) diff --git a/lms/djangoapps/courseware/access_utils.py b/lms/djangoapps/courseware/access_utils.py index fd07a269f3..094a6928b2 100644 --- a/lms/djangoapps/courseware/access_utils.py +++ b/lms/djangoapps/courseware/access_utils.py @@ -80,3 +80,12 @@ def in_preview_mode(): hostname = get_current_request_hostname() preview_lms_base = settings.FEATURES.get('PREVIEW_LMS_BASE', None) return bool(preview_lms_base and hostname and hostname.split(':')[0] == preview_lms_base.split(':')[0]) + + +def is_course_open_for_learner(user, course): + """ + Check if the course is open for learners based on the start date. + """ + now = datetime.now(UTC()) + effective_start = adjust_start_date(user, course.days_early_for_beta, course.start, course.id) + return not(not in_preview_mode() and now < effective_start) diff --git a/lms/djangoapps/courseware/tests/test_views.py b/lms/djangoapps/courseware/tests/test_views.py index 3845184563..4457ddaac9 100644 --- a/lms/djangoapps/courseware/tests/test_views.py +++ b/lms/djangoapps/courseware/tests/test_views.py @@ -40,6 +40,7 @@ from certificates.tests.factories import ( from commerce.models import CommerceConfiguration from course_modes.models import CourseMode from course_modes.tests.factories import CourseModeFactory +from courseware.access_utils import is_course_open_for_learner from courseware.model_data import set_score from courseware.testutils import RenderXBlockTestMixin from courseware.tests.factories import StudentModuleFactory, GlobalStaffFactory @@ -2111,7 +2112,9 @@ class TestRenderXBlockSelfPaced(TestRenderXBlock): SelfPacedConfiguration(enabled=True).save() def course_options(self): - return {'self_paced': True} + options = super(TestRenderXBlockSelfPaced, self).course_options() + options['self_paced'] = True + return options class TestIndexViewCrawlerStudentStateWrites(SharedModuleStoreTestCase): @@ -2217,3 +2220,21 @@ class EnterpriseConsentTestCase(EnterpriseTestConsentRequired, ModuleStoreTestCa reverse("student_progress", kwargs=dict(course_id=course_id, student_id=str(self.user.id))), ): self.verify_consent_required(self.client, url) + + +@ddt.ddt +class AccessUtilsTestCase(ModuleStoreTestCase): + """ + Test access utilities + """ + @ddt.data( + (1, False), + (-1, True) + ) + @ddt.unpack + def test_is_course_open_for_learner(self, start_date_modifier, expected_value): + staff_user = AdminFactory() + start_date = datetime.now(UTC) + timedelta(days=start_date_modifier) + course = CourseFactory.create(start=start_date) + + self.assertEqual(is_course_open_for_learner(staff_user, course), expected_value) diff --git a/lms/djangoapps/courseware/testutils.py b/lms/djangoapps/courseware/testutils.py index c09da8543a..5ae9047ffa 100644 --- a/lms/djangoapps/courseware/testutils.py +++ b/lms/djangoapps/courseware/testutils.py @@ -4,7 +4,7 @@ Common test utilities for courseware functionality # pylint: disable=attribute-defined-outside-init from abc import ABCMeta, abstractmethod -from datetime import datetime +from datetime import datetime, timedelta import ddt from mock import patch from urllib import urlencode @@ -80,7 +80,9 @@ class RenderXBlockTestMixin(object): Options to configure the test course. Intended to be overridden by subclasses. """ - return {} + return { + 'start': datetime.now() - timedelta(days=1) + } def setup_course(self, default_store=None): """ diff --git a/lms/djangoapps/courseware/views/index.py b/lms/djangoapps/courseware/views/index.py index 0a740aaed0..5486cd2397 100644 --- a/lms/djangoapps/courseware/views/index.py +++ b/lms/djangoapps/courseware/views/index.py @@ -42,8 +42,8 @@ from xmodule.modulestore.django import modulestore from xmodule.x_module import STUDENT_VIEW from web_fragments.fragment import Fragment -from ..access import has_access, _adjust_start_date_for_beta_testers -from ..access_utils import in_preview_mode +from ..access import has_access +from ..access_utils import in_preview_mode, is_course_open_for_learner from ..courses import get_current_child, get_studio_url, get_course_with_access from ..entrance_exams import ( course_has_entrance_exam, @@ -359,12 +359,11 @@ class CoursewareIndex(View): self._add_entrance_exam_to_context(courseware_context) # staff masquerading data - now = datetime.now(UTC()) - effective_start = _adjust_start_date_for_beta_testers(self.effective_user, self.course, self.course_key) - if not in_preview_mode() and self.is_staff and now < effective_start: + if not is_course_open_for_learner(self.effective_user, self.course): # Disable student view button if user is staff and # course is not yet visible to students. courseware_context['disable_student_access'] = True + courseware_context['supports_preview_menu'] = False if self.section: # chromeless data diff --git a/lms/djangoapps/courseware/views/views.py b/lms/djangoapps/courseware/views/views.py index 1224c774df..32bbe36e3f 100644 --- a/lms/djangoapps/courseware/views/views.py +++ b/lms/djangoapps/courseware/views/views.py @@ -57,9 +57,9 @@ from openedx.core.djangoapps.plugin_api.views import EdxFragmentView from commerce.utils import EcommerceService from enrollment.api import add_enrollment from course_modes.models import CourseMode -from courseware.access import has_access, has_ccx_coach_role, _adjust_start_date_for_beta_testers +from courseware.access import has_access, has_ccx_coach_role from courseware.access_response import StartDateError -from courseware.access_utils import in_preview_mode +from courseware.access_utils import in_preview_mode, is_course_open_for_learner from courseware.courses import ( get_courses, get_course, @@ -374,12 +374,11 @@ def course_info(request, course_id): if SelfPacedConfiguration.current().enable_course_home_improvements: context['last_accessed_courseware_url'] = get_last_accessed_courseware(course, request, user) - now = datetime.now(UTC()) - effective_start = _adjust_start_date_for_beta_testers(user, course, course_key) - if not in_preview_mode() and staff_access and now < effective_start: + if not is_course_open_for_learner(user, course): # Disable student view button if user is staff and # course is not yet visible to students. context['disable_student_access'] = True + context['supports_preview_menu'] = False if CourseEnrollment.is_enrolled(request.user, course.id): inject_coursetalk_keys_into_context(context, course_key) @@ -513,6 +512,11 @@ class CourseTabView(EdxFragmentView): request.user = masquerade_user else: masquerade = None + + if course and not is_course_open_for_learner(request.user, course): + # Disable student view button if user is staff and + # course is not yet visible to students. + supports_preview_menu = False return { 'course': course, 'tab': tab,