diff --git a/lms/djangoapps/shoppingcart/models.py b/lms/djangoapps/shoppingcart/models.py index 1ad71ff625..2a3a13e577 100644 --- a/lms/djangoapps/shoppingcart/models.py +++ b/lms/djangoapps/shoppingcart/models.py @@ -179,6 +179,13 @@ class OrderItem(models.Model): """ raise NotImplementedError + @property + def single_item_receipt_template(self): + """ + the template that should be used when there's + only one item in the order + """ + return'shoppingcart/receipt.html' class PaidCourseRegistration(OrderItem): """ @@ -320,3 +327,10 @@ class CertificateItem(OrderItem): self.course_enrollment.mode = self.mode self.course_enrollment.save() self.course_enrollment.activate() + + @property + def single_item_receipt_template(self): + if self.mode == 'verified': + return 'shoppingcart/verified_cert_receipt.html' + else: + return super(CertificateItem, self).single_item_receipt_template diff --git a/lms/djangoapps/shoppingcart/tests/test_models.py b/lms/djangoapps/shoppingcart/tests/test_models.py index 75789964b1..7e83e10055 100644 --- a/lms/djangoapps/shoppingcart/tests/test_models.py +++ b/lms/djangoapps/shoppingcart/tests/test_models.py @@ -183,3 +183,14 @@ class CertificateItemTest(TestCase): cart.purchase() enrollment = CourseEnrollment.objects.get(user=self.user, course_id=self.course_id) self.assertEquals(enrollment.mode, u'verified') + + def test_single_item_template(self): + cart = Order.get_cart_for_user(user=self.user) + cert_item = CertificateItem.add_to_order(cart, self.course_id, self.cost, 'verified') + + self.assertEquals(cert_item.single_item_receipt_template, + 'shoppingcart/verified_cert_receipt.html') + + cert_item = CertificateItem.add_to_order(cart, self.course_id, self.cost, 'honor') + self.assertEquals(cert_item.single_item_receipt_template, + 'shoppingcart/receipt.html') diff --git a/lms/djangoapps/shoppingcart/tests/test_views.py b/lms/djangoapps/shoppingcart/tests/test_views.py index eee685f84f..6ec84c2cc0 100644 --- a/lms/djangoapps/shoppingcart/tests/test_views.py +++ b/lms/djangoapps/shoppingcart/tests/test_views.py @@ -159,7 +159,7 @@ class ShoppingCartViewsTests(ModuleStoreTestCase): self.assertEqual(resp.status_code, 200) self.assertIn('ERROR_TEST!!!', resp.content) - ((template, context), _) = render_mock.call_args + ((template, context), _tmp) = render_mock.call_args self.assertEqual(template, 'shoppingcart/error.html') self.assertEqual(context['order'], self.cart) self.assertEqual(context['error_html'], 'ERROR_TEST!!!') @@ -194,11 +194,11 @@ class ShoppingCartViewsTests(ModuleStoreTestCase): self.assertIn('StreetTesting123', resp.content) self.assertIn('80.00', resp.content) - ((template, context), _) = render_mock.call_args + ((template, context), _tmp) = render_mock.call_args self.assertEqual(template, 'shoppingcart/receipt.html') self.assertEqual(context['order'], self.cart) - self.assertIn(reg_item.orderitem_ptr, context['order_items']) - self.assertIn(cert_item.orderitem_ptr, context['order_items']) + self.assertIn(reg_item, context['order_items']) + self.assertIn(cert_item, context['order_items']) self.assertFalse(context['any_refunds']) @patch('shoppingcart.views.render_to_response', render_mock) @@ -214,9 +214,20 @@ class ShoppingCartViewsTests(ModuleStoreTestCase): self.assertEqual(resp.status_code, 200) self.assertIn('40.00', resp.content) - ((template, context), _) = render_mock.call_args + ((template, context), _tmp) = render_mock.call_args self.assertEqual(template, 'shoppingcart/receipt.html') self.assertEqual(context['order'], self.cart) - self.assertIn(reg_item.orderitem_ptr, context['order_items']) - self.assertIn(cert_item.orderitem_ptr, context['order_items']) + self.assertIn(reg_item, context['order_items']) + self.assertIn(cert_item, context['order_items']) self.assertTrue(context['any_refunds']) + + @patch('shoppingcart.views.render_to_response', render_mock) + def test_show_receipt_success_custom_receipt_page(self): + cert_item = CertificateItem.add_to_order(self.cart, self.course_id, self.cost, 'verified') + self.cart.purchase() + self.login_user() + receipt_url = reverse('shoppingcart.views.show_receipt', args=[self.cart.id]) + resp = self.client.get(receipt_url) + self.assertEqual(resp.status_code, 200) + ((template, _context), _tmp) = render_mock.call_args + self.assertEqual(template, cert_item.single_item_receipt_template) diff --git a/lms/djangoapps/shoppingcart/views.py b/lms/djangoapps/shoppingcart/views.py index 0ed0c5407f..7d01983cb1 100644 --- a/lms/djangoapps/shoppingcart/views.py +++ b/lms/djangoapps/shoppingcart/views.py @@ -99,8 +99,13 @@ def show_receipt(request, ordernum): if order.user != request.user or order.status != 'purchased': raise Http404('Order not found!') - order_items = order.orderitem_set.all() + order_items = OrderItem.objects.filter(order=order).select_subclasses() any_refunds = any(i.status == "refunded" for i in order_items) - return render_to_response('shoppingcart/receipt.html', {'order': order, - 'order_items': order_items, - 'any_refunds': any_refunds}) + receipt_template = 'shoppingcart/receipt.html' + # we want to have the ability to override the default receipt page when + # there is only one item in the order + if order_items.count() == 1: + receipt_template = order_items[0].single_item_receipt_template + return render_to_response(receipt_template, {'order': order, + 'order_items': order_items, + 'any_refunds': any_refunds}) diff --git a/lms/templates/shoppingcart/verified_cert_receipt.html b/lms/templates/shoppingcart/verified_cert_receipt.html new file mode 100644 index 0000000000..0386b6b353 --- /dev/null +++ b/lms/templates/shoppingcart/verified_cert_receipt.html @@ -0,0 +1,60 @@ +<%! from django.utils.translation import ugettext as _ %> +<%! from django.core.urlresolvers import reverse %> +<%! from django.conf import settings %> + +<%inherit file="../main.html" /> + +<%block name="title">
| Qty | Description | Unit Price | Price | Currency | ")}
| ${item.qty} | ${item.line_desc} | +${"{0:0.2f}".format(item.unit_cost)} | +${"{0:0.2f}".format(item.line_cost)} | +${item.currency.upper()} |
| ${_("Total Amount")} | ||||
| ${"{0:0.2f}".format(order.total_cost)} |
+ ${_("Note: items with strikethough like ")}this${_(" have been refunded.")}
+
+ ${order.bill_to_cardtype} ${_("#:")} ${order.bill_to_ccnum}
+ ${order.bill_to_first} ${order.bill_to_last}
+ ${order.bill_to_street1}
+ ${order.bill_to_street2}
+ ${order.bill_to_city}, ${order.bill_to_state} ${order.bill_to_postalcode}
+ ${order.bill_to_country.upper()}
+