From d2de618b20b875d69b3cd4c46240af7fe8732bfa Mon Sep 17 00:00:00 2001 From: Calen Pennington <cale@edx.org> Date: Mon, 10 Jun 2019 13:52:11 -0400 Subject: [PATCH] Add strike-out price to LMS Course Home sidebar --- .../features/_course-upgrade-message.scss | 9 ++++++- .../course-home-fragment.html | 13 ++++++--- .../tests/views/test_course_home.py | 27 +++++++++++++++++++ .../course_experience/views/course_home.py | 12 +++++++-- 4 files changed, 54 insertions(+), 7 deletions(-) diff --git a/lms/static/sass/features/_course-upgrade-message.scss b/lms/static/sass/features/_course-upgrade-message.scss index bcc0e45ee0c..7ad6abdc68f 100644 --- a/lms/static/sass/features/_course-upgrade-message.scss +++ b/lms/static/sass/features/_course-upgrade-message.scss @@ -30,9 +30,12 @@ Search for the courseware_verified_certificate_upsell promotion ID. } .section-upgrade .upgrade-container { + margin-top: 15px; +} + +.section-upgrade.no-discount .upgrade-container { float: right; text-align: center; - margin-top: 15px; } @media only screen and (max-width: 991px) and (min-width: 768px) { @@ -45,6 +48,10 @@ Search for the courseware_verified_certificate_upsell promotion ID. margin: 0.5em 0; } +.section.section-upgrade.discount p { + display: inline-block; +} + .section-upgrade .btn-brand.btn-upgrade { color: white !important; } 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 c90825a9dd6..89b488e7ed8 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 @@ -124,7 +124,7 @@ from openedx.features.course_experience import UNIFIED_COURSE_TAB_FLAG, SHOW_REV </div> % endif % if upgrade_url and upgrade_price: - <div class="section section-upgrade course-home-sidebar-upgrade"> + <div class="section section-upgrade course-home-sidebar-upgrade ${'discount' if upgrade_price_before_discount else 'no-discount'}"> <h3 class="hd hd-6">${_("Pursue a verified certificate")}</h3> <img src="https://courses.edx.org/static/images/edx-verified-mini-cert.png" alt=""> <div class="upgrade-container"> @@ -132,11 +132,16 @@ from openedx.features.course_experience import UNIFIED_COURSE_TAB_FLAG, SHOW_REV <a class="btn-brand btn-upgrade" href="${upgrade_url}" data-creative="sidebarupsell" - data-position="sidebar-message"> - ${_("Upgrade ({price})").format(price=upgrade_price)} + data-position="sidebar-message" + > + % if upgrade_price_before_discount: + ${_("Upgrade")} (${upgrade_price} <del>${upgrade_price_before_discount}</del>) + % else: + ${_("Upgrade ({price})").format(price=upgrade_price)} + % endif </a> </p> - <p><button class="btn-link btn-small promo-learn-more">${_('Learn More')}</button></p> + <p><button class="btn-link btn-small promo-learn-more">${_('Learn More')}</button></p> </div> </div> % endif diff --git a/openedx/features/course_experience/tests/views/test_course_home.py b/openedx/features/course_experience/tests/views/test_course_home.py index 3e0a0a92a40..d81c058dee7 100644 --- a/openedx/features/course_experience/tests/views/test_course_home.py +++ b/openedx/features/course_experience/tests/views/test_course_home.py @@ -53,6 +53,7 @@ from openedx.features.course_experience import ( SHOW_UPGRADE_MSG_ON_COURSE_HOME, UNIFIED_COURSE_TAB_FLAG ) +from openedx.features.discounts.applicability import DISCOUNT_APPLICABILITY_FLAG from student.models import CourseEnrollment from student.tests.factories import UserFactory from util.date_utils import strftime_localized @@ -927,6 +928,7 @@ class TestCourseHomePageAccess(CourseHomePageTestCase): self.assertNotContains(response, TEST_COURSE_GOAL_UPDATE_FIELD_HIDDEN) +@ddt.ddt class CourseHomeFragmentViewTests(ModuleStoreTestCase): """ Test Messages Displayed on the Course Home @@ -1001,3 +1003,28 @@ class CourseHomeFragmentViewTests(ModuleStoreTestCase): def test_display_upgrade_message_if_audit_and_deadline_not_passed(self): CourseEnrollment.enroll(self.user, self.course.id, CourseMode.AUDIT) self.assert_upgrade_message_displayed() + + @ddt.data(True, False) + def test_upgrade_message_discount(self, has_discount): + CourseEnrollment.enroll(self.user, self.course.id, CourseMode.AUDIT) + + self.verified_mode.min_price = 100 + self.verified_mode.save() + + with FIRST_PURCHASE_OFFER_BANNER_DISPLAY.override(has_discount): + with DISCOUNT_APPLICABILITY_FLAG.override(has_discount): + response = self.client.get(self.url) + + self.assertIn('section-upgrade', response.content) + url = EcommerceService().get_checkout_page_url(self.verified_mode.sku) + self.assertIn('<a class="btn-brand btn-upgrade"', response.content) + self.assertIn(url, response.content) + content = response.content.decode(response.charset) + print(content) + if has_discount: + assert '$85' in content + assert '<del>$100</del>' in content + else: + assert u'$85' not in content + assert u'<del>' not in content + assert u'Upgrade ($100)' in content diff --git a/openedx/features/course_experience/views/course_home.py b/openedx/features/course_experience/views/course_home.py index 8b4796ed90d..37d5ca27f02 100644 --- a/openedx/features/course_experience/views/course_home.py +++ b/openedx/features/course_experience/views/course_home.py @@ -14,7 +14,7 @@ from django.views.decorators.csrf import ensure_csrf_cookie from opaque_keys.edx.keys import CourseKey from web_fragments.fragment import Fragment -from course_modes.models import get_cosmetic_verified_display_price +from course_modes.models import get_cosmetic_verified_display_price, get_course_prices, format_course_price from courseware.access import has_access from courseware.courses import can_self_enroll_in_course, get_course_info_section, get_course_with_access from lms.djangoapps.commerce.utils import EcommerceService @@ -32,6 +32,7 @@ from openedx.core.djangoapps.util.maintenance_banner import add_maintenance_bann from openedx.features.course_duration_limits.access import generate_course_expired_fragment from openedx.features.course_experience.course_tools import CourseToolsPluginManager from openedx.features.course_experience.utils import get_first_purchase_offer_banner_fragment +from openedx.features.discounts.applicability import discount_percentage from student.models import CourseEnrollment from util.views import ensure_valid_course_key from xmodule.course_module import COURSE_VISIBILITY_PUBLIC, COURSE_VISIBILITY_PUBLIC_OUTLINE @@ -204,11 +205,17 @@ class CourseHomeFragmentView(EdxFragmentView): # Get info for upgrade messaging upgrade_price = None upgrade_url = None + upgrade_price_before_discount = None # TODO Add switch to control deployment if SHOW_UPGRADE_MSG_ON_COURSE_HOME.is_enabled(course_key) and enrollment and enrollment.upgrade_deadline: upgrade_url = EcommerceService().upgrade_url(request.user, course_key) - upgrade_price = get_cosmetic_verified_display_price(course) + if offer_banner_fragment: + upgrade_price_before_discount_num = get_course_prices(course, verified_only=True)[0] + upgrade_price_before_discount = format_course_price(upgrade_price_before_discount_num) + upgrade_price = format_course_price("{:0.2f}".format(upgrade_price_before_discount_num * ((100.0 - discount_percentage()) / 100))) + else: + upgrade_price = get_cosmetic_verified_display_price(course) # Render the course home fragment context = { @@ -236,6 +243,7 @@ class CourseHomeFragmentView(EdxFragmentView): 'uses_pattern_library': True, 'upgrade_price': upgrade_price, 'upgrade_url': upgrade_url, + 'upgrade_price_before_discount': upgrade_price_before_discount, } html = render_to_string('course_experience/course-home-fragment.html', context) return Fragment(html) -- GitLab