Allow for the creation of a specialized receipt when
there is only one item in the order
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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')
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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})
|
||||
|
||||
60
lms/templates/shoppingcart/verified_cert_receipt.html
Normal file
60
lms/templates/shoppingcart/verified_cert_receipt.html
Normal file
@@ -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"><title>${_("Receipt for Order")} ${order.id}</title></%block>
|
||||
|
||||
% if notification is not UNDEFINED:
|
||||
<section class="notification">
|
||||
${notification}
|
||||
</section>
|
||||
% endif
|
||||
|
||||
<section class="container cart-list">
|
||||
<p><h1>${_(settings.PLATFORM_NAME + " (" + settings.SITE_NAME + ")" + " Electronic Receipt")}</h1></p>
|
||||
<h2>${_("Order #")}${order.id}</h2>
|
||||
<h2>${_("Date:")} ${order.purchase_time.date().isoformat()}</h2>
|
||||
<h2>${_("Items ordered:")}</h2>
|
||||
|
||||
<table>
|
||||
<thead>
|
||||
<tr>${_("<td>Qty</td><td>Description</td><td>Unit Price</td><td>Price</td><td>Currency</td>")}</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
% for item in order_items:
|
||||
<tr>
|
||||
% if item.status == "purchased":
|
||||
<td>${item.qty}</td><td>${item.line_desc}</td>
|
||||
<td>${"{0:0.2f}".format(item.unit_cost)}</td>
|
||||
<td>${"{0:0.2f}".format(item.line_cost)}</td>
|
||||
<td>${item.currency.upper()}</td></tr>
|
||||
% elif item.status == "refunded":
|
||||
<td><del>${item.qty}</del></td><td><del>${item.line_desc}</del></td>
|
||||
<td><del>${"{0:0.2f}".format(item.unit_cost)}</del></td>
|
||||
<td><del>${"{0:0.2f}".format(item.line_cost)}</del></td>
|
||||
<td><del>${item.currency.upper()}</del></td></tr>
|
||||
% endif
|
||||
% endfor
|
||||
<tr><td></td><td></td><td></td><td>${_("Total Amount")}</td></tr>
|
||||
<tr><td></td><td></td><td></td><td>${"{0:0.2f}".format(order.total_cost)}</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
% if any_refunds:
|
||||
<p>
|
||||
${_("Note: items with strikethough like ")}<del>this</del>${_(" have been refunded.")}
|
||||
</p>
|
||||
% endif
|
||||
|
||||
<h2>${_("Billed To:")}</h2>
|
||||
<p>
|
||||
${order.bill_to_cardtype} ${_("#:")} ${order.bill_to_ccnum}<br />
|
||||
${order.bill_to_first} ${order.bill_to_last}<br />
|
||||
${order.bill_to_street1}<br />
|
||||
${order.bill_to_street2}<br />
|
||||
${order.bill_to_city}, ${order.bill_to_state} ${order.bill_to_postalcode}<br />
|
||||
${order.bill_to_country.upper()}<br />
|
||||
</p>
|
||||
|
||||
</section>
|
||||
Reference in New Issue
Block a user