Commit e85fd7a9 by Matthew Piatetsky

Do not tell sailthru about multi-product baskets

LEARNER-2011
parent 237b99f6
...@@ -149,6 +149,7 @@ class BasketCreateView(EdxOrderPlacementMixin, generics.CreateAPIView): ...@@ -149,6 +149,7 @@ class BasketCreateView(EdxOrderPlacementMixin, generics.CreateAPIView):
requested_products = request.data.get('products') requested_products = request.data.get('products')
if requested_products: if requested_products:
is_multi_product_basket = True if len(requested_products) > 1 else False
for requested_product in requested_products: for requested_product in requested_products:
# Ensure the requested products exist # Ensure the requested products exist
sku = requested_product.get('sku') sku = requested_product.get('sku')
...@@ -182,8 +183,8 @@ class BasketCreateView(EdxOrderPlacementMixin, generics.CreateAPIView): ...@@ -182,8 +183,8 @@ class BasketCreateView(EdxOrderPlacementMixin, generics.CreateAPIView):
# Call signal handler to notify listeners that something has been added to the basket # Call signal handler to notify listeners that something has been added to the basket
basket_addition = get_class('basket.signals', 'basket_addition') basket_addition = get_class('basket.signals', 'basket_addition')
basket_addition.send(sender=basket_addition, product=product, user=request.user, basket_addition.send(sender=basket_addition, product=product, user=request.user, request=request,
request=request, basket=basket) basket=basket, is_multi_product_basket=is_multi_product_basket)
else: else:
# If no products were included in the request, we cannot checkout. # If no products were included in the request, we cannot checkout.
return self._report_bad_request( return self._report_bad_request(
......
...@@ -85,13 +85,14 @@ def prepare_basket(request, products, voucher=None): ...@@ -85,13 +85,14 @@ def prepare_basket(request, products, voucher=None):
) )
return basket return basket
is_multi_product_basket = True if len(products) > 1 else False
for product in products: for product in products:
if product.is_enrollment_code_product or \ if product.is_enrollment_code_product or \
not UserAlreadyPlacedOrder.user_already_placed_order(request.user, product): not UserAlreadyPlacedOrder.user_already_placed_order(request.user, product):
basket.add_product(product, 1) basket.add_product(product, 1)
# Call signal handler to notify listeners that something has been added to the basket # Call signal handler to notify listeners that something has been added to the basket
basket_addition.send(sender=basket_addition, product=product, user=request.user, request=request, basket_addition.send(sender=basket_addition, product=product, user=request.user, request=request,
basket=basket) basket=basket, is_multi_product_basket=is_multi_product_basket)
else: else:
already_purchased_products.append(product) already_purchased_products.append(product)
logger.warning( logger.warning(
......
...@@ -51,8 +51,12 @@ def process_checkout_complete(sender, order=None, user=None, request=None, # py ...@@ -51,8 +51,12 @@ def process_checkout_complete(sender, order=None, user=None, request=None, # py
# If multi product orders become common it may be worthwhile to pass an array of # If multi product orders become common it may be worthwhile to pass an array of
# orders to the worker in one call to save overhead, however, that would be difficult # orders to the worker in one call to save overhead, however, that would be difficult
# because of the fact that there are different templates for free enroll versus paid enroll # because of the fact that there are different templates for free enroll versus paid enroll
for line in order.lines.all(): lines = order.lines.all()
# We are not sending multi product orders to sailthru for now, because
# the abandoned cart email does not yet support baskets with multiple products
if len(lines) > 1:
return
for line in lines:
# get product # get product
product = line.product product = line.product
sku = line.partner_sku sku = line.partner_sku
...@@ -72,7 +76,7 @@ def process_checkout_complete(sender, order=None, user=None, request=None, # py ...@@ -72,7 +76,7 @@ def process_checkout_complete(sender, order=None, user=None, request=None, # py
@receiver(basket_addition) @receiver(basket_addition)
@silence_exceptions("Failed to call Sailthru upon basket addition.") @silence_exceptions("Failed to call Sailthru upon basket addition.")
def process_basket_addition(sender, product=None, user=None, request=None, basket=None, def process_basket_addition(sender, product=None, user=None, request=None, basket=None, is_multi_product_basket=None,
**kwargs): # pylint: disable=unused-argument **kwargs): # pylint: disable=unused-argument
"""Tell Sailthru when payment started. """Tell Sailthru when payment started.
...@@ -108,7 +112,7 @@ def process_basket_addition(sender, product=None, user=None, request=None, baske ...@@ -108,7 +112,7 @@ def process_basket_addition(sender, product=None, user=None, request=None, baske
# an item has been added to the shopping cart so that an abandoned cart message can be sent # an item has been added to the shopping cart so that an abandoned cart message can be sent
# later if the purchase is not completed. Abandoned cart support is only for purchases, not # later if the purchase is not completed. Abandoned cart support is only for purchases, not
# for free enrolls # for free enrolls
if price: if price and not is_multi_product_basket:
update_course_enrollment.delay(user.email, _build_course_url(course_id), True, mode_for_seat(product), update_course_enrollment.delay(user.email, _build_course_url(course_id), True, mode_for_seat(product),
unit_cost=price, course_id=course_id, currency=currency, unit_cost=price, course_id=course_id, currency=currency,
site_code=site_configuration.partner.short_code, message_id=message_id) site_code=site_configuration.partner.short_code, message_id=message_id)
......
...@@ -82,6 +82,29 @@ class SailthruSignalTests(CouponMixin, DiscoveryTestMixin, TestCase): ...@@ -82,6 +82,29 @@ class SailthruSignalTests(CouponMixin, DiscoveryTestMixin, TestCase):
self.assertFalse(mock_log_error.called) self.assertFalse(mock_log_error.called)
@patch('ecommerce_worker.sailthru.v1.tasks.update_course_enrollment.delay') @patch('ecommerce_worker.sailthru.v1.tasks.update_course_enrollment.delay')
@patch('ecommerce.sailthru.signals.logger.error')
def test_stop_sailthru_update_on_multi_product_baskets(self, mock_log_error, mock_update_course_enrollment):
""" Verify Sailthru is not contacted for multi-product baskets. """
# Create multi-product basket
seat = self.course.create_or_update_seat('verified', False, 100, self.partner, None)
other_course = CourseFactory(site=self.site)
other_seat = other_course.create_or_update_seat('verified', False, 100, self.partner, None)
basket = BasketFactory(owner=self.user, site=self.site)
basket.add_product(seat)
basket.add_product(other_seat)
multi_product_order = create_order(number=2, basket=basket, user=self.user, site=self.site)
# This method takes an argument to determine whether that product is part of a multi-product basket
process_basket_addition(None, request=self.request, user=self.user, product=seat, is_multi_product_basket=True)
self.assertFalse(mock_update_course_enrollment.called)
self.assertFalse(mock_log_error.called)
# This method looks at the number of lines in the order to determine if the basket has multiple products
process_checkout_complete(None, order=multi_product_order, request=None)
self.assertFalse(mock_update_course_enrollment.called)
self.assertFalse(mock_log_error.called)
@patch('ecommerce_worker.sailthru.v1.tasks.update_course_enrollment.delay')
def test_process_checkout_complete(self, mock_update_course_enrollment): def test_process_checkout_complete(self, mock_update_course_enrollment):
""" Verify the post_checkout receiver is called, and contacts Sailthru. """ """ Verify the post_checkout receiver is called, and contacts Sailthru. """
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment