diff --git a/lms/envs/common.py b/lms/envs/common.py index 3a6aa5246ea0acf3ebf077c9fcf04a474be8fdf8..442798e3942019015b9ed963f93fd18f67cd31db 100644 --- a/lms/envs/common.py +++ b/lms/envs/common.py @@ -547,6 +547,7 @@ MAIN_MAKO_TEMPLATES_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', ] @@ -1657,6 +1658,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 0000000000000000000000000000000000000000..004a4159addf470d0348a42961fe65d2384311b9 --- /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 0000000000000000000000000000000000000000..26af472e935ebb026018b61a842be6f7d5675dbd --- /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 0000000000000000000000000000000000000000..0d5626de564401e9ad46f94f27546b2c366cbf64 --- /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 0000000000000000000000000000000000000000..ba6cd22bde3ba25816dd0f9d3853791cc6d63a2a --- /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 a1295fff0e3563988647f84fe60cd3be0307e2f7..1339148c24b0d59aff7abd3353413142b3dab33b 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: - <div class="date-summary-container"> - <div class="date-summary date-summary-${course_date.css_class}"> - % if course_date.title: - % if course_date.title == 'current_datetime': - <span class="hd hd-6 heading localized-datetime" data-datetime="${course_date.date}" data-string="${_(u'Today is {date}')}" data-timezone="${user_timezone}" data-language="${user_language}"></span> - % else: - <span class="hd hd-6 heading">${course_date.title}</span> - % endif - % endif - % if course_date.date and course_date.title != 'current_datetime': - <p class="hd hd-6 date localized-datetime" data-format="shortDate" data-datetime="${course_date.date}" data-timezone="${user_timezone}" data-language="${user_language}" data-string="${_(course_date.relative_datestring)}"></p> - % endif - % if course_date.description: - <p class="description">${course_date.description}</p> - % endif - % if course_date.link and course_date.link_text: - <span class="date-summary-link"> - <a href="${course_date.link}">${course_date.link_text}</a> - </span> - % endif - </div> - </div> + <%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 0000000000000000000000000000000000000000..b13035bad0bc436496bc519d87e45e5c6396b1d3 --- /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"/> +<div class="date-summary-container"> + <div class="date-summary date-summary-${course_date.css_class}"> + % if course_date.title: + % if course_date.title == 'current_datetime': + <span class="hd hd-6 heading localized-datetime" data-datetime="${course_date.date}" data-string="${_(u'Today is {date}')}" data-timezone="${user_timezone}" data-language="${user_language}"></span> + % else: + <span class="hd hd-6 heading">${course_date.title}</span> + % endif + % endif + % if course_date.date and course_date.title != 'current_datetime': + <p class="hd hd-6 date localized-datetime" data-format="shortDate" data-datetime="${course_date.date}" data-timezone="${user_timezone}" data-language="${user_language}" data-string="${_(course_date.relative_datestring)}"></p> + % endif + % if course_date.description: + <p class="description">${course_date.description}</p> + % endif + % if course_date.link and course_date.link_text: + <span class="date-summary-link"> + <a href="${course_date.link}">${course_date.link_text}</a> + </span> + % endif + </div> +</div> 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 0000000000000000000000000000000000000000..5fb3e10f3d81e2a636387d7371b7db1237a2e148 --- /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 c3670a857da0bc1832bb4ed2098e5abe627cc7f3..ab2fb356722c1d5aa9166916be9b2f96f0a7ea7b 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 a124830089784d17c6b3861fc62c285313725131..941f4fb2e0c78386601e01dd8524e3be715fb49e 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')