Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
E
ecommerce
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
edx
ecommerce
Commits
e85fd7a9
Commit
e85fd7a9
authored
Aug 22, 2017
by
Matthew Piatetsky
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Do not tell sailthru about multi-product baskets
LEARNER-2011
parent
237b99f6
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
36 additions
and
7 deletions
+36
-7
ecommerce/extensions/api/v2/views/baskets.py
+3
-2
ecommerce/extensions/basket/utils.py
+2
-1
ecommerce/sailthru/signals.py
+8
-4
ecommerce/sailthru/tests/test_signals.py
+23
-0
No files found.
ecommerce/extensions/api/v2/views/baskets.py
View file @
e85fd7a9
...
...
@@ -149,6 +149,7 @@ class BasketCreateView(EdxOrderPlacementMixin, generics.CreateAPIView):
requested_products
=
request
.
data
.
get
(
'products'
)
if
requested_products
:
is_multi_product_basket
=
True
if
len
(
requested_products
)
>
1
else
False
for
requested_product
in
requested_products
:
# Ensure the requested products exist
sku
=
requested_product
.
get
(
'sku'
)
...
...
@@ -182,8 +183,8 @@ class BasketCreateView(EdxOrderPlacementMixin, generics.CreateAPIView):
# Call signal handler to notify listeners that something has been added to the basket
basket_addition
=
get_class
(
'basket.signals'
,
'basket_addition'
)
basket_addition
.
send
(
sender
=
basket_addition
,
product
=
product
,
user
=
request
.
user
,
request
=
request
,
basket
=
basket
)
basket_addition
.
send
(
sender
=
basket_addition
,
product
=
product
,
user
=
request
.
user
,
request
=
request
,
basket
=
basket
,
is_multi_product_basket
=
is_multi_product_
basket
)
else
:
# If no products were included in the request, we cannot checkout.
return
self
.
_report_bad_request
(
...
...
ecommerce/extensions/basket/utils.py
View file @
e85fd7a9
...
...
@@ -85,13 +85,14 @@ def prepare_basket(request, products, voucher=None):
)
return
basket
is_multi_product_basket
=
True
if
len
(
products
)
>
1
else
False
for
product
in
products
:
if
product
.
is_enrollment_code_product
or
\
not
UserAlreadyPlacedOrder
.
user_already_placed_order
(
request
.
user
,
product
):
basket
.
add_product
(
product
,
1
)
# 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
=
basket
)
basket
=
basket
,
is_multi_product_basket
=
is_multi_product_basket
)
else
:
already_purchased_products
.
append
(
product
)
logger
.
warning
(
...
...
ecommerce/sailthru/signals.py
View file @
e85fd7a9
...
...
@@ -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
# 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
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
product
=
line
.
product
sku
=
line
.
partner_sku
...
...
@@ -72,7 +76,7 @@ def process_checkout_complete(sender, order=None, user=None, request=None, # py
@receiver
(
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
"""Tell Sailthru when payment started.
...
...
@@ -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
# later if the purchase is not completed. Abandoned cart support is only for purchases, not
# 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
),
unit_cost
=
price
,
course_id
=
course_id
,
currency
=
currency
,
site_code
=
site_configuration
.
partner
.
short_code
,
message_id
=
message_id
)
...
...
ecommerce/sailthru/tests/test_signals.py
View file @
e85fd7a9
...
...
@@ -82,6 +82,29 @@ class SailthruSignalTests(CouponMixin, DiscoveryTestMixin, TestCase):
self
.
assertFalse
(
mock_log_error
.
called
)
@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
):
""" Verify the post_checkout receiver is called, and contacts Sailthru. """
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment