Commit 3e71a453 by Diana Huang

Only show preview bar if student can view it.

parent 31e00d58
...@@ -80,3 +80,12 @@ def in_preview_mode(): ...@@ -80,3 +80,12 @@ def in_preview_mode():
hostname = get_current_request_hostname() hostname = get_current_request_hostname()
preview_lms_base = settings.FEATURES.get('PREVIEW_LMS_BASE', None) 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]) 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)
...@@ -40,6 +40,7 @@ from certificates.tests.factories import ( ...@@ -40,6 +40,7 @@ from certificates.tests.factories import (
from commerce.models import CommerceConfiguration from commerce.models import CommerceConfiguration
from course_modes.models import CourseMode from course_modes.models import CourseMode
from course_modes.tests.factories import CourseModeFactory 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.model_data import set_score
from courseware.testutils import RenderXBlockTestMixin from courseware.testutils import RenderXBlockTestMixin
from courseware.tests.factories import StudentModuleFactory, GlobalStaffFactory from courseware.tests.factories import StudentModuleFactory, GlobalStaffFactory
...@@ -2111,7 +2112,9 @@ class TestRenderXBlockSelfPaced(TestRenderXBlock): ...@@ -2111,7 +2112,9 @@ class TestRenderXBlockSelfPaced(TestRenderXBlock):
SelfPacedConfiguration(enabled=True).save() SelfPacedConfiguration(enabled=True).save()
def course_options(self): def course_options(self):
return {'self_paced': True} options = super(TestRenderXBlockSelfPaced, self).course_options()
options['self_paced'] = True
return options
class TestIndexViewCrawlerStudentStateWrites(SharedModuleStoreTestCase): class TestIndexViewCrawlerStudentStateWrites(SharedModuleStoreTestCase):
...@@ -2217,3 +2220,21 @@ class EnterpriseConsentTestCase(EnterpriseTestConsentRequired, ModuleStoreTestCa ...@@ -2217,3 +2220,21 @@ class EnterpriseConsentTestCase(EnterpriseTestConsentRequired, ModuleStoreTestCa
reverse("student_progress", kwargs=dict(course_id=course_id, student_id=str(self.user.id))), reverse("student_progress", kwargs=dict(course_id=course_id, student_id=str(self.user.id))),
): ):
self.verify_consent_required(self.client, url) 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)
...@@ -4,7 +4,7 @@ Common test utilities for courseware functionality ...@@ -4,7 +4,7 @@ Common test utilities for courseware functionality
# pylint: disable=attribute-defined-outside-init # pylint: disable=attribute-defined-outside-init
from abc import ABCMeta, abstractmethod from abc import ABCMeta, abstractmethod
from datetime import datetime from datetime import datetime, timedelta
import ddt import ddt
from mock import patch from mock import patch
from urllib import urlencode from urllib import urlencode
...@@ -80,7 +80,9 @@ class RenderXBlockTestMixin(object): ...@@ -80,7 +80,9 @@ class RenderXBlockTestMixin(object):
Options to configure the test course. Intended to be overridden by Options to configure the test course. Intended to be overridden by
subclasses. subclasses.
""" """
return {} return {
'start': datetime.now() - timedelta(days=1)
}
def setup_course(self, default_store=None): def setup_course(self, default_store=None):
""" """
......
...@@ -42,8 +42,8 @@ from xmodule.modulestore.django import modulestore ...@@ -42,8 +42,8 @@ from xmodule.modulestore.django import modulestore
from xmodule.x_module import STUDENT_VIEW from xmodule.x_module import STUDENT_VIEW
from web_fragments.fragment import Fragment from web_fragments.fragment import Fragment
from ..access import has_access, _adjust_start_date_for_beta_testers from ..access import has_access
from ..access_utils import in_preview_mode 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 ..courses import get_current_child, get_studio_url, get_course_with_access
from ..entrance_exams import ( from ..entrance_exams import (
course_has_entrance_exam, course_has_entrance_exam,
...@@ -359,12 +359,11 @@ class CoursewareIndex(View): ...@@ -359,12 +359,11 @@ class CoursewareIndex(View):
self._add_entrance_exam_to_context(courseware_context) self._add_entrance_exam_to_context(courseware_context)
# staff masquerading data # staff masquerading data
now = datetime.now(UTC()) if not is_course_open_for_learner(self.effective_user, self.course):
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:
# Disable student view button if user is staff and # Disable student view button if user is staff and
# course is not yet visible to students. # course is not yet visible to students.
courseware_context['disable_student_access'] = True courseware_context['disable_student_access'] = True
courseware_context['supports_preview_menu'] = False
if self.section: if self.section:
# chromeless data # chromeless data
......
...@@ -57,9 +57,9 @@ from openedx.core.djangoapps.plugin_api.views import EdxFragmentView ...@@ -57,9 +57,9 @@ from openedx.core.djangoapps.plugin_api.views import EdxFragmentView
from commerce.utils import EcommerceService from commerce.utils import EcommerceService
from enrollment.api import add_enrollment from enrollment.api import add_enrollment
from course_modes.models import CourseMode 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_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 ( from courseware.courses import (
get_courses, get_courses,
get_course, get_course,
...@@ -374,12 +374,11 @@ def course_info(request, course_id): ...@@ -374,12 +374,11 @@ def course_info(request, course_id):
if SelfPacedConfiguration.current().enable_course_home_improvements: if SelfPacedConfiguration.current().enable_course_home_improvements:
context['last_accessed_courseware_url'] = get_last_accessed_courseware(course, request, user) context['last_accessed_courseware_url'] = get_last_accessed_courseware(course, request, user)
now = datetime.now(UTC()) if not is_course_open_for_learner(user, course):
effective_start = _adjust_start_date_for_beta_testers(user, course, course_key)
if not in_preview_mode() and staff_access and now < effective_start:
# Disable student view button if user is staff and # Disable student view button if user is staff and
# course is not yet visible to students. # course is not yet visible to students.
context['disable_student_access'] = True context['disable_student_access'] = True
context['supports_preview_menu'] = False
if CourseEnrollment.is_enrolled(request.user, course.id): if CourseEnrollment.is_enrolled(request.user, course.id):
inject_coursetalk_keys_into_context(context, course_key) inject_coursetalk_keys_into_context(context, course_key)
...@@ -513,6 +512,11 @@ class CourseTabView(EdxFragmentView): ...@@ -513,6 +512,11 @@ class CourseTabView(EdxFragmentView):
request.user = masquerade_user request.user = masquerade_user
else: else:
masquerade = None 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 { return {
'course': course, 'course': course,
'tab': tab, 'tab': tab,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment