Merge pull request #23674 from edx/hasnain-naveed/ENT-2735

ENT-2735 | Added the discounted payment message on track selection fo…
This commit is contained in:
Hasnain Naveed
2020-04-13 19:02:31 +05:00
committed by GitHub
3 changed files with 62 additions and 2 deletions

View File

@@ -4,8 +4,12 @@
import six
from django.utils.translation import ugettext_lazy as _
from requests.exceptions import ConnectionError, Timeout # pylint: disable=redefined-builtin
from slumber.exceptions import SlumberBaseException
from course_modes.models import CourseMode
from student.helpers import VERIFY_STATUS_APPROVED, VERIFY_STATUS_NEED_TO_VERIFY, VERIFY_STATUS_SUBMITTED
from openedx.core.djangoapps.commerce.utils import ecommerce_api_client
DISPLAY_VERIFIED = "verified"
DISPLAY_HONOR = "honor"
@@ -83,3 +87,18 @@ def _enrollment_mode_display(enrollment_mode, verification_status, course_id):
display_mode = enrollment_mode
return display_mode
def get_course_final_price(user, sku, course_price):
"""
Return the course's discounted price for a user if user is eligible for any otherwise return course original price.
"""
price_details = {}
try:
price_details = ecommerce_api_client(user).baskets.calculate.get(
sku=[sku],
username=user.username,
)
except (SlumberBaseException, ConnectionError, Timeout) as exc: # pylint: disable=unused-variable
pass
return price_details.get('total_incl_tax', course_price)

View File

@@ -198,6 +198,39 @@ class CourseModeViewTest(CatalogIntegrationMixin, UrlResetMixin, ModuleStoreTest
else:
self.assertNotContains(response, "Credit")
@httpretty.activate
@patch('course_modes.views.enterprise_customer_for_request')
@patch('course_modes.views.get_course_final_price')
@ddt.data(
(1.0, True),
(50.0, False),
(0.0, True),
(None, False),
)
@ddt.unpack
def test_display_after_discounted_price(
self,
discounted_price,
is_enterprise_enabled,
mock_get_course_final_price,
mock_enterprise_customer_for_request
):
verified_mode = CourseModeFactory.create(mode_slug='verified', course_id=self.course.id, sku='dummy')
CourseEnrollmentFactory(
is_active=True,
course_id=self.course.id,
user=self.user
)
mock_enterprise_customer_for_request.return_value = is_enterprise_enabled
mock_get_course_final_price.return_value = discounted_price
url = reverse('course_modes_choose', args=[self.course.id])
response = self.client.get(url)
if is_enterprise_enabled:
self.assertContains(response, discounted_price)
self.assertContains(response, verified_mode.min_price)
@httpretty.activate
@ddt.data(True, False)
def test_congrats_on_enrollment_message(self, create_enrollment):

View File

@@ -26,6 +26,7 @@ from opaque_keys.edx.keys import CourseKey
from six import text_type
from course_modes.models import CourseMode
from common.djangoapps.course_modes.helpers import get_course_final_price
from edxmako.shortcuts import render_to_response
from lms.djangoapps.commerce.utils import EcommerceService
from lms.djangoapps.experiments.utils import get_experiment_user_metadata_context
@@ -34,7 +35,7 @@ from openedx.core.djangoapps.embargo import api as embargo_api
from openedx.core.djangoapps.enrollments.permissions import ENROLL_IN_COURSE
from openedx.features.content_type_gating.models import ContentTypeGatingConfig
from openedx.features.course_duration_limits.models import CourseDurationLimitConfig
from openedx.features.discounts.applicability import discount_percentage
from openedx.features.enterprise_support.api import enterprise_customer_for_request
from student.models import CourseEnrollment
from util.db import outer_atomic
from xmodule.modulestore.django import modulestore
@@ -203,12 +204,19 @@ class ChooseModeView(View):
if x.strip()
]
price_before_discount = verified_mode.min_price
course_price = price_before_discount
enterprise_customer = enterprise_customer_for_request(request)
if enterprise_customer and verified_mode.sku:
course_price = get_course_final_price(request.user, verified_mode.sku, price_before_discount)
context["currency"] = verified_mode.currency.upper()
context["currency_symbol"] = get_currency_symbol(verified_mode.currency.upper())
context["min_price"] = price_before_discount
context["min_price"] = course_price
context["verified_name"] = verified_mode.name
context["verified_description"] = verified_mode.description
# if course_price is equal to price_before_discount then user doesn't entitle to any discount.
if course_price != price_before_discount:
context["price_before_discount"] = price_before_discount
if verified_mode.sku:
context["use_ecommerce_payment_flow"] = ecommerce_service.is_enabled(request.user)