Commit 8f6203f1 by Diana Huang Committed by GitHub

Merge pull request #15119 from edx/diana/masquerade-issues

Only show preview bar if student can view it.
parents 31e00d58 3e71a453
......@@ -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,
......
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