diff --git a/lms/envs/common.py b/lms/envs/common.py
index c4e50c175d..0ad032416a 100644
--- a/lms/envs/common.py
+++ b/lms/envs/common.py
@@ -545,6 +545,7 @@ MAKO_TEMPLATE_DIRS_BASE = [
OPENEDX_ROOT / 'core' / 'djangoapps' / 'cors_csrf' / 'templates',
OPENEDX_ROOT / 'core' / 'djangoapps' / 'dark_lang' / 'templates',
OPENEDX_ROOT / 'core' / 'lib' / 'license' / 'templates',
+ OPENEDX_ROOT / 'features' / 'course_experience' / 'templates',
]
@@ -1674,6 +1675,18 @@ PIPELINE_CSS = {
],
'output_filename': 'css/lms-learner-dashboard-rtl.css',
},
+ 'style-mobile': {
+ 'source_filenames': [
+ 'css/lms-mobile.css',
+ ],
+ 'output_filename': 'css/lms-mobile.css',
+ },
+ 'style-mobile-rtl': {
+ 'source_filenames': [
+ 'css/lms-mobile-rtl.css',
+ ],
+ 'output_filename': 'css/lms-mobile-rtl.css',
+ },
}
diff --git a/lms/static/sass/_build-mobile.scss b/lms/static/sass/_build-mobile.scss
new file mode 100644
index 0000000000..004a4159ad
--- /dev/null
+++ b/lms/static/sass/_build-mobile.scss
@@ -0,0 +1,6 @@
+// ------------------------------
+// Mobile: Shared Build Compile
+
+// Base build
+@import 'base/build';
+@import 'mobile/main';
diff --git a/lms/static/sass/lms-mobile-rtl.scss b/lms/static/sass/lms-mobile-rtl.scss
new file mode 100644
index 0000000000..26af472e93
--- /dev/null
+++ b/lms/static/sass/lms-mobile-rtl.scss
@@ -0,0 +1,5 @@
+// ------------------------------
+// Mobile styling
+@import 'bourbon/bourbon';
+@import 'vendor/bi-app/bi-app-rtl'; // set the layout for right to left languages
+@import 'build-mobile';
diff --git a/lms/static/sass/lms-mobile.scss b/lms/static/sass/lms-mobile.scss
new file mode 100644
index 0000000000..0d5626de56
--- /dev/null
+++ b/lms/static/sass/lms-mobile.scss
@@ -0,0 +1,5 @@
+// ------------------------------
+// Mobile styling
+@import 'bourbon/bourbon';
+@import 'vendor/bi-app/bi-app-ltr'; // set the layout for left to right languages
+@import 'build-mobile';
diff --git a/lms/static/sass/mobile/_main.scss b/lms/static/sass/mobile/_main.scss
new file mode 100644
index 0000000000..ba6cd22bde
--- /dev/null
+++ b/lms/static/sass/mobile/_main.scss
@@ -0,0 +1,6 @@
+body {
+ @include padding-left($baseline);
+ @include padding-right($baseline);
+
+ background: theme-color("inverse");
+}
diff --git a/openedx/features/course_experience/templates/course_experience/course-dates-fragment.html b/openedx/features/course_experience/templates/course_experience/course-dates-fragment.html
index a1295fff0e..1339148c24 100644
--- a/openedx/features/course_experience/templates/course_experience/course-dates-fragment.html
+++ b/openedx/features/course_experience/templates/course_experience/course-dates-fragment.html
@@ -11,28 +11,7 @@ from django.utils.translation import ugettext as _
## Should be organized by date, last date appearing at the bottom
% for course_date in course_date_blocks:
-
-
- % if course_date.title:
- % if course_date.title == 'current_datetime':
-
- % else:
-
${course_date.title}
- % endif
- % endif
- % if course_date.date and course_date.title != 'current_datetime':
-
- % endif
- % if course_date.description:
-
${course_date.description}
- % endif
- % if course_date.link and course_date.link_text:
-
- ${course_date.link_text}
-
- % endif
-
-
+ <%include file="dates-summary.html" args="course_date=course_date" />
% endfor
<%static:require_module_async module_name="js/dateutil_factory" class_name="DateUtilFactory">
diff --git a/openedx/features/course_experience/templates/course_experience/dates-summary.html b/openedx/features/course_experience/templates/course_experience/dates-summary.html
new file mode 100644
index 0000000000..b13035bad0
--- /dev/null
+++ b/openedx/features/course_experience/templates/course_experience/dates-summary.html
@@ -0,0 +1,26 @@
+<%!
+from django.utils.translation import ugettext as _
+%>
+<%page args="course_date" expression_filter="h"/>
+
+
+ % if course_date.title:
+ % if course_date.title == 'current_datetime':
+
+ % else:
+
${course_date.title}
+ % endif
+ % endif
+ % if course_date.date and course_date.title != 'current_datetime':
+
+ % endif
+ % if course_date.description:
+
${course_date.description}
+ % endif
+ % if course_date.link and course_date.link_text:
+
+ ${course_date.link_text}
+
+ % endif
+
+
diff --git a/openedx/features/course_experience/templates/course_experience/mobile/course-dates-fragment.html b/openedx/features/course_experience/templates/course_experience/mobile/course-dates-fragment.html
new file mode 100644
index 0000000000..5fb3e10f3d
--- /dev/null
+++ b/openedx/features/course_experience/templates/course_experience/mobile/course-dates-fragment.html
@@ -0,0 +1,13 @@
+## mako
+
+<%page expression_filter="h"/>
+
+<%namespace name="static" file="../../static_content.html"/>
+
+% for course_date in course_date_blocks:
+ <%include file="../dates-summary.html" args="course_date=course_date"/>
+% endfor
+
+<%static:require_module_async module_name="js/dateutil_factory" class_name="DateUtilFactory">
+ DateUtilFactory.transform(".localized-datetime");
+%static:require_module_async>
diff --git a/openedx/features/course_experience/tests/views/test_course_dates.py b/openedx/features/course_experience/tests/views/test_course_dates.py
index c3670a857d..ab2fb35672 100644
--- a/openedx/features/course_experience/tests/views/test_course_dates.py
+++ b/openedx/features/course_experience/tests/views/test_course_dates.py
@@ -38,7 +38,6 @@ class TestCourseDatesFragmentView(ModuleStoreTestCase):
def test_course_dates_fragment(self):
response = self.client.get(self.dates_fragment_url)
- self.assertContains(response, 'Important Course Dates')
self.assertContains(response, 'Today is')
self.assertContains(response, 'Course End')
diff --git a/openedx/features/course_experience/views/course_dates.py b/openedx/features/course_experience/views/course_dates.py
index a124830089..941f4fb2e0 100644
--- a/openedx/features/course_experience/views/course_dates.py
+++ b/openedx/features/course_experience/views/course_dates.py
@@ -3,6 +3,7 @@ Fragment for rendering the course dates sidebar.
"""
from django.http import Http404
from django.template.loader import render_to_string
+from django.utils.translation import get_language_bidi
from opaque_keys.edx.keys import CourseKey
from web_fragments.fragment import Fragment
@@ -14,6 +15,8 @@ class CourseDatesFragmentView(EdxFragmentView):
"""
A fragment to important dates within a course.
"""
+ template_name = 'course_experience/course-dates-fragment.html'
+
def render_to_fragment(self, request, course_id=None, **kwargs):
"""
Render the course dates fragment.
@@ -25,8 +28,11 @@ class CourseDatesFragmentView(EdxFragmentView):
context = {
'course_date_blocks': course_date_blocks
}
- html = render_to_string('course_experience/course-dates-fragment.html', context)
- return Fragment(html)
+ html = render_to_string(self.template_name, context)
+ dates_fragment = Fragment(html)
+ self.add_fragment_resource_urls(dates_fragment)
+
+ return dates_fragment
class CourseDatesFragmentMobileView(CourseDatesFragmentView):
@@ -39,8 +45,23 @@ class CourseDatesFragmentMobileView(CourseDatesFragmentView):
mechanism to automatically create/recreate session with the server for all
authenticated requests if the server returns 404.
"""
+ template_name = 'course_experience/mobile/course-dates-fragment.html'
+
def get(self, request, *args, **kwargs):
if not request.user.is_authenticated():
raise Http404
return super(CourseDatesFragmentMobileView, self).get(request, *args, **kwargs)
+
+ def css_dependencies(self):
+ """
+ Returns list of CSS files that this view depends on.
+
+ The helper function that it uses to obtain the list of CSS files
+ works in conjunction with the Django pipeline to ensure that in development mode
+ the files are loaded individually, but in production just the single bundle is loaded.
+ """
+ if get_language_bidi():
+ return self.get_css_dependencies('style-mobile-rtl')
+ else:
+ return self.get_css_dependencies('style-mobile')