Enable conditional pre-start-date access to courses
LEARNER-1854
This commit is contained in:
@@ -247,6 +247,13 @@ class WaffleFlag(object):
|
||||
self.flag_name = flag_name
|
||||
self.flag_undefined_default = flag_undefined_default
|
||||
|
||||
@property
|
||||
def namespaced_flag_name(self):
|
||||
"""
|
||||
Returns the fully namespaced flag name.
|
||||
"""
|
||||
return self.waffle_namespace._namespaced_name(self.flag_name)
|
||||
|
||||
def is_enabled(self):
|
||||
"""
|
||||
Returns whether or not the flag is enabled.
|
||||
|
||||
@@ -18,6 +18,9 @@ UNIFIED_COURSE_TAB_FLAG = CourseWaffleFlag(WAFFLE_FLAG_NAMESPACE, 'unified_cours
|
||||
# Waffle flag to enable the sock on the footer of the home and courseware pages
|
||||
DISPLAY_COURSE_SOCK_FLAG = CourseWaffleFlag(WAFFLE_FLAG_NAMESPACE, 'display_course_sock')
|
||||
|
||||
# Waffle flag to let learners access a course before its start date
|
||||
COURSE_PRE_START_ACCESS_FLAG = CourseWaffleFlag(WAFFLE_FLAG_NAMESPACE, 'pre_start_access')
|
||||
|
||||
# Waffle flag to enable a review page link from the unified home page
|
||||
SHOW_REVIEWS_TOOL_FLAG = CourseWaffleFlag(WAFFLE_FLAG_NAMESPACE, 'show_reviews_tool')
|
||||
|
||||
|
||||
@@ -2,8 +2,12 @@
|
||||
"""
|
||||
Tests for the course home page.
|
||||
"""
|
||||
import datetime
|
||||
import ddt
|
||||
import mock
|
||||
import pytz
|
||||
from waffle.testutils import override_flag
|
||||
|
||||
from courseware.tests.factories import StaffFactory
|
||||
from django.conf import settings
|
||||
from django.core.urlresolvers import reverse
|
||||
@@ -18,6 +22,7 @@ from xmodule.modulestore import ModuleStoreEnum
|
||||
from xmodule.modulestore.tests.django_utils import CourseUserType, SharedModuleStoreTestCase
|
||||
from xmodule.modulestore.tests.factories import CourseFactory, ItemFactory, check_mongo_calls
|
||||
|
||||
from ... import COURSE_PRE_START_ACCESS_FLAG
|
||||
from .helpers import add_course_mode
|
||||
from .test_course_updates import create_course_update
|
||||
|
||||
@@ -142,6 +147,26 @@ class TestCourseHomePage(CourseHomePageTestCase):
|
||||
url = course_home_url(self.course)
|
||||
self.client.get(url)
|
||||
|
||||
@mock.patch.dict('django.conf.settings.FEATURES', {'DISABLE_START_DATES': False})
|
||||
def test_start_date_handling(self):
|
||||
"""
|
||||
Verify that the course home page handles start dates correctly.
|
||||
"""
|
||||
now = datetime.datetime.now(pytz.UTC)
|
||||
tomorrow = now + datetime.timedelta(days=1)
|
||||
self.course.start = tomorrow
|
||||
|
||||
# The course home page should 404 for a course starting in the future
|
||||
url = course_home_url(self.course)
|
||||
response = self.client.get(url)
|
||||
self.assertRedirects(response, '/dashboard?notlive=Jan+01%2C+2030')
|
||||
|
||||
# With the Waffle flag enabled, the course should be visible
|
||||
with override_flag(COURSE_PRE_START_ACCESS_FLAG.namespaced_flag_name, True):
|
||||
url = course_home_url(self.course)
|
||||
response = self.client.get(url)
|
||||
self.assertEqual(response.status_code, 200)
|
||||
|
||||
|
||||
@ddt.ddt
|
||||
class TestCourseHomePageAccess(CourseHomePageTestCase):
|
||||
|
||||
@@ -71,9 +71,9 @@ def get_course_outline_block_tree(request, course_id):
|
||||
block_types_filter=['course', 'chapter', 'sequential']
|
||||
)
|
||||
|
||||
course_outline_root_block = all_blocks['blocks'][all_blocks['root']]
|
||||
populate_children(course_outline_root_block, all_blocks['blocks'])
|
||||
set_last_accessed_default(course_outline_root_block)
|
||||
mark_last_accessed(request.user, course_key, course_outline_root_block)
|
||||
|
||||
course_outline_root_block = all_blocks['blocks'].get(all_blocks['root'], None)
|
||||
if course_outline_root_block:
|
||||
populate_children(course_outline_root_block, all_blocks['blocks'])
|
||||
set_last_accessed_default(course_outline_root_block)
|
||||
mark_last_accessed(request.user, course_key, course_outline_root_block)
|
||||
return course_outline_root_block
|
||||
|
||||
@@ -83,14 +83,14 @@ class CourseHomeFragmentView(EdxFragmentView):
|
||||
return block
|
||||
|
||||
course_outline_root_block = get_course_outline_block_tree(request, course_id)
|
||||
last_accessed_block = get_last_accessed_block(course_outline_root_block)
|
||||
last_accessed_block = get_last_accessed_block(course_outline_root_block) if course_outline_root_block else None
|
||||
has_visited_course = bool(last_accessed_block)
|
||||
if last_accessed_block:
|
||||
resume_course_url = last_accessed_block['lms_web_url']
|
||||
else:
|
||||
resume_course_url = course_outline_root_block['lms_web_url']
|
||||
resume_course_url = course_outline_root_block['lms_web_url'] if course_outline_root_block else None
|
||||
|
||||
return (has_visited_course, resume_course_url)
|
||||
return has_visited_course, resume_course_url
|
||||
|
||||
def _get_course_handouts(self, request, course):
|
||||
"""
|
||||
@@ -141,9 +141,6 @@ class CourseHomeFragmentView(EdxFragmentView):
|
||||
# Get the course tools enabled for this user and course
|
||||
course_tools = CourseToolsPluginManager.get_enabled_course_tools(request, course_key)
|
||||
|
||||
# Get the course tools enabled for this user and course
|
||||
course_tools = CourseToolsPluginManager.get_enabled_course_tools(request, course_key)
|
||||
|
||||
# Render the course home fragment
|
||||
context = {
|
||||
'request': request,
|
||||
|
||||
@@ -25,6 +25,8 @@ class CourseOutlineFragmentView(EdxFragmentView):
|
||||
course_overview = get_course_overview_with_access(request.user, 'load', course_key, check_if_enrolled=True)
|
||||
|
||||
course_block_tree = get_course_outline_block_tree(request, course_id)
|
||||
if not course_block_tree:
|
||||
return None
|
||||
|
||||
context = {
|
||||
'csrf': csrf(request)['csrf_token'],
|
||||
|
||||
Reference in New Issue
Block a user