From c9593f20944b10b264560ff89ede52bd66e89b53 Mon Sep 17 00:00:00 2001
From: Diana Huang
Date: Wed, 28 Aug 2013 10:03:36 -0400
Subject: [PATCH] Allow for the creation of a specialized receipt when there is
only one item in the order
---
lms/djangoapps/shoppingcart/models.py | 14 +++++
.../shoppingcart/tests/test_models.py | 11 ++++
.../shoppingcart/tests/test_views.py | 25 +++++---
lms/djangoapps/shoppingcart/views.py | 13 ++--
.../shoppingcart/verified_cert_receipt.html | 60 +++++++++++++++++++
5 files changed, 112 insertions(+), 11 deletions(-)
create mode 100644 lms/templates/shoppingcart/verified_cert_receipt.html
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">${_("Receipt for Order")} ${order.id}%block>
+
+% if notification is not UNDEFINED:
+
+% endif
+
+
+ ${_(settings.PLATFORM_NAME + " (" + settings.SITE_NAME + ")" + " Electronic Receipt")}
+ ${_("Order #")}${order.id}
+ ${_("Date:")} ${order.purchase_time.date().isoformat()}
+ ${_("Items ordered:")}
+
+
+
+ ${_("| Qty | Description | Unit Price | Price | Currency | ")}
+
+
+ % for item in order_items:
+
+ % if item.status == "purchased":
+ | ${item.qty} | ${item.line_desc} |
+ ${"{0:0.2f}".format(item.unit_cost)} |
+ ${"{0:0.2f}".format(item.line_cost)} |
+ ${item.currency.upper()} |
+ % elif item.status == "refunded":
+ ${item.qty} | ${item.line_desc} |
+ ${"{0:0.2f}".format(item.unit_cost)} |
+ ${"{0:0.2f}".format(item.line_cost)} |
+ ${item.currency.upper()} |
+ % endif
+ % endfor
+ | | | ${_("Total Amount")} |
+ | | | ${"{0:0.2f}".format(order.total_cost)} |
+
+
+ % if any_refunds:
+
+ ${_("Note: items with strikethough like ")}this${_(" have been refunded.")}
+
+ % endif
+
+ ${_("Billed To:")}
+
+ ${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()}
+
+
+