diff --git a/common/lib/xmodule/xmodule/html_module.py b/common/lib/xmodule/xmodule/html_module.py index fc310b70d2..1d70ab4cb4 100644 --- a/common/lib/xmodule/xmodule/html_module.py +++ b/common/lib/xmodule/xmodule/html_module.py @@ -446,18 +446,24 @@ class CourseInfoModule(CourseInfoFields, HtmlModuleMixin): return self.data.replace("%%USER_ID%%", self.system.anonymous_student_id) return self.data else: - course_updates = [item for item in self.items if item.get('status') == self.STATUS_VISIBLE] - course_updates.sort( - key=lambda item: (CourseInfoModule.safe_parse_date(item['date']), item['id']), - reverse=True - ) + course_updates = self.ordered_updates() context = { 'visible_updates': course_updates[:3], 'hidden_updates': course_updates[3:], } - return self.system.render_template("{0}/course_updates.html".format(self.TEMPLATE_DIR), context) + def ordered_updates(self): + """ + Returns any course updates in reverse chronological order. + """ + course_updates = [item for item in self.items if item.get('status') == self.STATUS_VISIBLE] + course_updates.sort( + key=lambda item: (CourseInfoModule.safe_parse_date(item['date']), item['id']), + reverse=True + ) + return course_updates + @staticmethod def safe_parse_date(date): """ diff --git a/lms/djangoapps/courseware/courses.py b/lms/djangoapps/courseware/courses.py index bfbae0f817..c4c1fb29f0 100644 --- a/lms/djangoapps/courseware/courses.py +++ b/lms/djangoapps/courseware/courses.py @@ -235,6 +235,13 @@ def get_course_about_section(request, course, section_key): raise KeyError("Invalid about key " + str(section_key)) +def get_course_info_usage_key(course, section_key): + """ + Returns the usage key for the specified section's course info module. + """ + return course.id.make_usage_key('course_info', section_key) + + def get_course_info_section_module(request, user, course, section_key): """ This returns the course info module for a given section_key. @@ -245,7 +252,7 @@ def get_course_info_section_module(request, user, course, section_key): - updates - guest_updates """ - usage_key = course.id.make_usage_key('course_info', section_key) + usage_key = get_course_info_usage_key(course, section_key) # Use an empty cache field_data_cache = FieldDataCache([], course.id, user) diff --git a/lms/djangoapps/courseware/tabs.py b/lms/djangoapps/courseware/tabs.py index 2e175a15ac..b889653fd4 100644 --- a/lms/djangoapps/courseware/tabs.py +++ b/lms/djangoapps/courseware/tabs.py @@ -10,7 +10,7 @@ from django.utils.translation import ugettext as _, ugettext_noop from courseware.access import has_access from courseware.entrance_exams import user_can_skip_entrance_exam from openedx.core.lib.course_tabs import CourseTabPluginManager -from openedx.features.course_experience import defaut_course_url_name, UNIFIED_COURSE_EXPERIENCE_FLAG +from openedx.features.course_experience import default_course_url_name, UNIFIED_COURSE_EXPERIENCE_FLAG from request_cache.middleware import RequestCache from student.models import CourseEnrollment from xmodule.tabs import CourseTab, CourseTabList, key_checker, link_reverse_func @@ -45,7 +45,7 @@ class CoursewareTab(EnrolledTab): Returns a function that computes the URL for this tab. """ request = RequestCache.get_current_request() - url_name = defaut_course_url_name(request) + url_name = default_course_url_name(request) return link_reverse_func(url_name) diff --git a/lms/djangoapps/courseware/views/views.py b/lms/djangoapps/courseware/views/views.py index 00ae4bdbfe..1224c774df 100644 --- a/lms/djangoapps/courseware/views/views.py +++ b/lms/djangoapps/courseware/views/views.py @@ -428,7 +428,7 @@ class StaticCourseTabView(EdxFragmentView): """ return get_static_tab_fragment(request, course, tab) - def render_to_standalone_html(self, request, fragment, course=None, tab=None, **kwargs): + def render_standalone_response(self, request, fragment, course=None, tab=None, **kwargs): """ Renders this static tab's fragment to HTML for a standalone page. """ @@ -531,14 +531,14 @@ class CourseTabView(EdxFragmentView): tab = page_context['tab'] return tab.render_to_fragment(request, course, **kwargs) - def render_to_standalone_html(self, request, fragment, course=None, tab=None, page_context=None, **kwargs): + def render_standalone_response(self, request, fragment, course=None, tab=None, page_context=None, **kwargs): """ Renders this course tab's fragment to HTML for a standalone page. """ if not page_context: page_context = self.create_page_context(request, course=course, tab=tab, **kwargs) page_context['fragment'] = fragment - return render_to_string('courseware/tab-view.html', page_context) + return render_to_response('courseware/tab-view.html', page_context) @ensure_csrf_cookie diff --git a/lms/static/sass/features/_course-experience.scss b/lms/static/sass/features/_course-experience.scss index 94e632463f..0cd18b1341 100644 --- a/lms/static/sass/features/_course-experience.scss +++ b/lms/static/sass/features/_course-experience.scss @@ -1,3 +1,17 @@ +// Welcome message +.welcome-message { + border: solid 1px $lms-border-color; + @include border-left(solid 4px $black); + margin-bottom: $baseline; + padding: $baseline; + + h1, h2, h3 { + font-size: font-size(large); + font-weight: bold; + color: $black; + } +} + // Course sidebar .course-sidebar { @include margin-left(0); diff --git a/openedx/core/djangoapps/plugin_api/views.py b/openedx/core/djangoapps/plugin_api/views.py index 27532085fb..4b461bb3c4 100644 --- a/openedx/core/djangoapps/plugin_api/views.py +++ b/openedx/core/djangoapps/plugin_api/views.py @@ -2,11 +2,11 @@ Views for building plugins. """ -from abc import abstractmethod import logging from django.conf import settings from django.contrib.staticfiles.storage import staticfiles_storage +from django.http import HttpResponse from django.shortcuts import render_to_response from web_fragments.views import FragmentView @@ -78,10 +78,14 @@ class EdxFragmentView(FragmentView): for js_file in self.js_dependencies(): fragment.add_javascript_url(staticfiles_storage.url(js_file)) - def render_to_standalone_html(self, request, fragment, **kwargs): + def render_standalone_response(self, request, fragment, **kwargs): """ - Renders this fragment to HTML for a standalone page. + Renders a standalone page for the specified fragment. + + Note: if fragment is None, a 204 response will be returned (no content). """ + if fragment is None: + return HttpResponse(status=204) context = { 'uses-pattern-library': self.USES_PATTERN_LIBRARY, 'settings': settings, diff --git a/openedx/features/course_bookmarks/views/course_bookmarks.py b/openedx/features/course_bookmarks/views/course_bookmarks.py index 0846923a14..04f2cdb0bc 100644 --- a/openedx/features/course_bookmarks/views/course_bookmarks.py +++ b/openedx/features/course_bookmarks/views/course_bookmarks.py @@ -15,7 +15,7 @@ from django.views.generic import View from courseware.courses import get_course_with_access from opaque_keys.edx.keys import CourseKey from openedx.core.djangoapps.plugin_api.views import EdxFragmentView -from openedx.features.course_experience import defaut_course_url_name +from openedx.features.course_experience import default_course_url_name from util.views import ensure_valid_course_key from web_fragments.fragment import Fragment @@ -38,7 +38,7 @@ class CourseBookmarksView(View): """ course_key = CourseKey.from_string(course_id) course = get_course_with_access(request.user, 'load', course_key, check_if_enrolled=True) - course_url_name = defaut_course_url_name(request) + course_url_name = default_course_url_name(request) course_url = reverse(course_url_name, kwargs={'course_id': unicode(course.id)}) # Render the bookmarks list as a fragment diff --git a/openedx/features/course_experience/__init__.py b/openedx/features/course_experience/__init__.py index 48ac65f039..eb20680596 100644 --- a/openedx/features/course_experience/__init__.py +++ b/openedx/features/course_experience/__init__.py @@ -14,7 +14,7 @@ UNIFIED_COURSE_EXPERIENCE_FLAG = 'unified_course_experience' UNIFIED_COURSE_VIEW_FLAG = 'unified_course_view' -def defaut_course_url_name(request=None): +def default_course_url_name(request=None): """ Returns the default course URL name for the current user. """ diff --git a/openedx/features/course_experience/templates/course_experience/course-home-fragment.html b/openedx/features/course_experience/templates/course_experience/course-home-fragment.html index b76f3ee383..f2fa73142c 100644 --- a/openedx/features/course_experience/templates/course_experience/course-home-fragment.html +++ b/openedx/features/course_experience/templates/course_experience/course-home-fragment.html @@ -58,6 +58,12 @@ from openedx.features.course_experience import UNIFIED_COURSE_EXPERIENCE_FLAG