Commit 276d392c by Michael Terry

Point to program dashboard in receipt

When a user purchases a program (rather than a single course run),
we want the receipt to point them at the dashboard of the program,
not the learner's normal course dashboard.

LEARNER-3525
parent 673b502a
...@@ -324,6 +324,10 @@ class SiteConfiguration(models.Model): ...@@ -324,6 +324,10 @@ class SiteConfiguration(models.Model):
""" """
return urljoin(settings.ENTERPRISE_SERVICE_URL, path) return urljoin(settings.ENTERPRISE_SERVICE_URL, path)
def build_program_dashboard_url(self, uuid):
""" Returns a URL to a specific student program dashboard (hosted by LMS). """
return self.build_lms_url('/dashboard/programs/{}'.format(uuid))
@property @property
def student_dashboard_url(self): def student_dashboard_url(self):
""" Returns a URL to the student dashboard (hosted by LMS). """ """ Returns a URL to the student dashboard (hosted by LMS). """
......
...@@ -39,6 +39,11 @@ def get_lms_dashboard_url(): ...@@ -39,6 +39,11 @@ def get_lms_dashboard_url():
return site_configuration.student_dashboard_url return site_configuration.student_dashboard_url
def get_lms_program_dashboard_url(uuid):
site_configuration = _get_site_configuration()
return site_configuration.build_program_dashboard_url(uuid)
def get_lms_enrollment_api_url(): def get_lms_enrollment_api_url():
# TODO Update consumers of this method to use `get_lms_enrollment_base_api_url` (which should be renamed # TODO Update consumers of this method to use `get_lms_enrollment_base_api_url` (which should be renamed
# get_lms_enrollment_api_url). # get_lms_enrollment_api_url).
......
...@@ -16,6 +16,8 @@ from ecommerce.extensions.refund.tests.mixins import RefundTestMixin ...@@ -16,6 +16,8 @@ from ecommerce.extensions.refund.tests.mixins import RefundTestMixin
from ecommerce.tests.mixins import LmsApiMockMixin from ecommerce.tests.mixins import LmsApiMockMixin
from ecommerce.tests.testcases import TestCase from ecommerce.tests.testcases import TestCase
BasketAttribute = get_model('basket', 'BasketAttribute')
BasketAttributeType = get_model('basket', 'BasketAttributeType')
Order = get_model('order', 'Order') Order = get_model('order', 'Order')
...@@ -299,3 +301,39 @@ class ReceiptResponseViewTests(DiscoveryMockMixin, LmsApiMockMixin, RefundTestMi ...@@ -299,3 +301,39 @@ class ReceiptResponseViewTests(DiscoveryMockMixin, LmsApiMockMixin, RefundTestMi
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
order_value_string = 'data-total-amount="{}"'.format(order.total_incl_tax) order_value_string = 'data-total-amount="{}"'.format(order.total_incl_tax)
self.assertContains(response, order_value_string) self.assertContains(response, order_value_string)
@httpretty.activate
def test_dashboard_link_for_course_purchase(self):
"""
The dashboard link at the bottom of the receipt for a course purchase
should point to the user dashboard.
"""
order = self._create_order_for_receipt(self.user)
response = self._get_receipt_response(order.number)
context_data = {
'order_dashboard_url': self.site.siteconfiguration.build_lms_url('dashboard')
}
self.assertEqual(response.status_code, 200)
self.assertDictContainsSubset(context_data, response.context_data)
@httpretty.activate
def test_dashboard_link_for_bundle_purchase(self):
"""
The dashboard link at the bottom of the receipt for a bundle purchase
should point to the program dashboard.
"""
order = self._create_order_for_receipt(self.user)
BasketAttribute.objects.update_or_create(
basket=order.basket,
attribute_type=BasketAttributeType.objects.get(name='bundle_identifier'),
value_text='test_bundle'
)
response = self._get_receipt_response(order.number)
context_data = {
'order_dashboard_url': self.site.siteconfiguration.build_lms_url('dashboard/programs/test_bundle')
}
self.assertEqual(response.status_code, 200)
self.assertDictContainsSubset(context_data, response.context_data)
...@@ -12,12 +12,15 @@ from django.views.generic import RedirectView, TemplateView ...@@ -12,12 +12,15 @@ from django.views.generic import RedirectView, TemplateView
from oscar.apps.checkout.views import * # pylint: disable=wildcard-import, unused-wildcard-import from oscar.apps.checkout.views import * # pylint: disable=wildcard-import, unused-wildcard-import
from oscar.core.loading import get_class, get_model from oscar.core.loading import get_class, get_model
from ecommerce.core.url_utils import get_lms_dashboard_url, get_lms_program_dashboard_url
from ecommerce.extensions.checkout.exceptions import BasketNotFreeError from ecommerce.extensions.checkout.exceptions import BasketNotFreeError
from ecommerce.extensions.checkout.mixins import EdxOrderPlacementMixin from ecommerce.extensions.checkout.mixins import EdxOrderPlacementMixin
from ecommerce.extensions.checkout.utils import get_receipt_page_url from ecommerce.extensions.checkout.utils import get_receipt_page_url
Applicator = get_class('offer.utils', 'Applicator') Applicator = get_class('offer.utils', 'Applicator')
Basket = get_model('basket', 'Basket') Basket = get_model('basket', 'Basket')
BasketAttribute = get_model('basket', 'BasketAttribute')
BasketAttributeType = get_model('basket', 'BasketAttributeType')
Order = get_model('order', 'Order') Order = get_model('order', 'Order')
...@@ -149,6 +152,7 @@ class ReceiptResponseView(ThankYouView): ...@@ -149,6 +152,7 @@ class ReceiptResponseView(ThankYouView):
'payment_method': self.get_payment_method(order), 'payment_method': self.get_payment_method(order),
'display_credit_messaging': self.order_contains_credit_seat(order), 'display_credit_messaging': self.order_contains_credit_seat(order),
}) })
context.update(self.get_order_dashboard_context(order))
context.update(self.get_order_verification_context(order)) context.update(self.get_order_verification_context(order))
return context return context
...@@ -181,6 +185,22 @@ class ReceiptResponseView(ThankYouView): ...@@ -181,6 +185,22 @@ class ReceiptResponseView(ThankYouView):
return True return True
return False return False
def get_program_uuid(self, order):
bundle_attributes = BasketAttribute.objects.filter(
basket=order.basket,
attribute_type=BasketAttributeType.objects.get(name='bundle_identifier')
)
bundle_attribute = bundle_attributes.first()
return bundle_attribute.value_text if bundle_attribute else None
def get_order_dashboard_context(self, order):
program_uuid = self.get_program_uuid(order)
if program_uuid:
order_dashboard_url = get_lms_program_dashboard_url(program_uuid)
else:
order_dashboard_url = get_lms_dashboard_url()
return {'order_dashboard_url': order_dashboard_url}
def get_order_verification_context(self, order): def get_order_verification_context(self, order):
context = {} context = {}
verified_course_id = None verified_course_id = None
......
...@@ -160,7 +160,7 @@ ...@@ -160,7 +160,7 @@
</div> </div>
{% else %} {% else %}
<div id="dashboard-link"> <div id="dashboard-link">
<a class="dashboard-link nav-link" href="{{ lms_dashboard_url }}"> <a class="dashboard-link nav-link" href="{{ order_dashboard_url }}">
{% trans "Go to Dashboard" %} {% trans "Go to Dashboard" %}
</a> </a>
</div> </div>
......
...@@ -26,7 +26,7 @@ ...@@ -26,7 +26,7 @@
data-track-category="verification" data-track-category="verification"
data-track-event="edx.bi.user.verification.immediate" data-track-event="edx.bi.user.verification.immediate"
data-track-type="click" data-track-type="click"
href="{{ lms_dashboard_url }}"> href="{{ order_dashboard_url }}">
{% trans "Go to my dashboard and verify later" %} {% trans "Go to my dashboard and verify later" %}
</a> </a>
</div> </div>
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