Only show preview bar if student can view it.
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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):
|
||||
"""
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user