Enable conditional pre-start-date access to courses

LEARNER-1854
This commit is contained in:
Andy Armstrong
2017-07-12 16:33:50 -04:00
parent 99994b0eb5
commit aeecf34387
15 changed files with 84 additions and 69 deletions

View File

@@ -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.

View File

@@ -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')

View File

@@ -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):

View File

@@ -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

View File

@@ -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,

View File

@@ -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'],