Commit a1373f48 by Diana Huang

Update content of the order confirmation e-mail.

parent f819137b
...@@ -21,7 +21,7 @@ from statsd import statsd ...@@ -21,7 +21,7 @@ from statsd import statsd
from xmodule.modulestore.django import modulestore from xmodule.modulestore.django import modulestore
from xmodule.course_module import CourseDescriptor from xmodule.course_module import CourseDescriptor
from .exceptions import InvalidCartItem, PaymentException, PurchasedCallbackException from .exceptions import InvalidCartItem, PurchasedCallbackException
log = logging.getLogger("shoppingcart") log = logging.getLogger("shoppingcart")
...@@ -201,11 +201,19 @@ class OrderItem(models.Model): ...@@ -201,11 +201,19 @@ class OrderItem(models.Model):
@property @property
def single_item_receipt_template(self): def single_item_receipt_template(self):
""" """
the template that should be used when there's The template that should be used when there's only one item in the order
only one item in the order
""" """
return'shoppingcart/receipt.html' return'shoppingcart/receipt.html'
@property
def additional_instruction_text(self):
"""
Individual instructions for this order item.
Currently, only used for e-mails.
"""
return ''
class PaidCourseRegistration(OrderItem): class PaidCourseRegistration(OrderItem):
""" """
...@@ -322,6 +330,13 @@ class CertificateItem(OrderItem): ...@@ -322,6 +330,13 @@ class CertificateItem(OrderItem):
course_enrollment = CourseEnrollment.objects.get(user=order.user, course_id=course_id) course_enrollment = CourseEnrollment.objects.get(user=order.user, course_id=course_id)
except ObjectDoesNotExist: except ObjectDoesNotExist:
course_enrollment = CourseEnrollment.create_enrollment(order.user, course_id, mode=mode) course_enrollment = CourseEnrollment.create_enrollment(order.user, course_id, mode=mode)
# do some validation on the enrollment mode
valid_modes = CourseMode.modes_for_course_dict(course_id)
if mode in valid_modes:
mode_info = valid_modes[mode]
else:
raise InvalidCartItem(_("Mode {mode} does not exist for {course_id}").format(mode=mode, course_id=course_id))
item, _created = cls.objects.get_or_create( item, _created = cls.objects.get_or_create(
order=order, order=order,
user=order.user, user=order.user,
...@@ -332,8 +347,8 @@ class CertificateItem(OrderItem): ...@@ -332,8 +347,8 @@ class CertificateItem(OrderItem):
item.status = order.status item.status = order.status
item.qty = 1 item.qty = 1
item.unit_cost = cost item.unit_cost = cost
item.line_desc = _("{mode} certificate for course {course_id}").format(mode=item.mode, item.line_desc = _("Certificate of Achievement, {mode_name} for course {course_id}").format(mode_name=mode_info.name,
course_id=course_id) course_id=course_id)
item.currency = currency item.currency = currency
order.currency = currency order.currency = currency
order.save() order.save()
...@@ -354,3 +369,9 @@ class CertificateItem(OrderItem): ...@@ -354,3 +369,9 @@ class CertificateItem(OrderItem):
return 'shoppingcart/verified_cert_receipt.html' return 'shoppingcart/verified_cert_receipt.html'
else: else:
return super(CertificateItem, self).single_item_receipt_template return super(CertificateItem, self).single_item_receipt_template
@property
def additional_instruction_text(self):
return _("Note - you have up to 2 weeks into the course to unenroll from the Verified Certificate option \
and receive a full refund. To receive your refund, contact {billing_email}.").format(
billing_email=settings.PAYMENT_SUPPORT_EMAIL)
...@@ -30,28 +30,28 @@ class OrderTest(TestCase): ...@@ -30,28 +30,28 @@ class OrderTest(TestCase):
# create a cart # create a cart
cart = Order.get_cart_for_user(user=self.user) cart = Order.get_cart_for_user(user=self.user)
# add something to it # add something to it
CertificateItem.add_to_order(cart, self.course_id, self.cost, 'verified') CertificateItem.add_to_order(cart, self.course_id, self.cost, 'honor')
# should return the same cart # should return the same cart
cart2 = Order.get_cart_for_user(user=self.user) cart2 = Order.get_cart_for_user(user=self.user)
self.assertEquals(cart2.orderitem_set.count(), 1) self.assertEquals(cart2.orderitem_set.count(), 1)
def test_cart_clear(self): def test_cart_clear(self):
cart = Order.get_cart_for_user(user=self.user) cart = Order.get_cart_for_user(user=self.user)
CertificateItem.add_to_order(cart, self.course_id, self.cost, 'verified') CertificateItem.add_to_order(cart, self.course_id, self.cost, 'honor')
CertificateItem.add_to_order(cart, 'test/course1', self.cost, 'verified') CertificateItem.add_to_order(cart, 'test/course1', self.cost, 'honor')
self.assertEquals(cart.orderitem_set.count(), 2) self.assertEquals(cart.orderitem_set.count(), 2)
cart.clear() cart.clear()
self.assertEquals(cart.orderitem_set.count(), 0) self.assertEquals(cart.orderitem_set.count(), 0)
def test_add_item_to_cart_currency_match(self): def test_add_item_to_cart_currency_match(self):
cart = Order.get_cart_for_user(user=self.user) cart = Order.get_cart_for_user(user=self.user)
CertificateItem.add_to_order(cart, self.course_id, self.cost, 'verified', currency='eur') CertificateItem.add_to_order(cart, self.course_id, self.cost, 'honor', currency='eur')
# verify that a new item has been added # verify that a new item has been added
self.assertEquals(cart.orderitem_set.count(), 1) self.assertEquals(cart.orderitem_set.count(), 1)
# verify that the cart's currency was updated # verify that the cart's currency was updated
self.assertEquals(cart.currency, 'eur') self.assertEquals(cart.currency, 'eur')
with self.assertRaises(InvalidCartItem): with self.assertRaises(InvalidCartItem):
CertificateItem.add_to_order(cart, self.course_id, self.cost, 'verified', currency='usd') CertificateItem.add_to_order(cart, self.course_id, self.cost, 'honor', currency='usd')
# assert that this item did not get added to the cart # assert that this item did not get added to the cart
self.assertEquals(cart.orderitem_set.count(), 1) self.assertEquals(cart.orderitem_set.count(), 1)
...@@ -63,7 +63,7 @@ class OrderTest(TestCase): ...@@ -63,7 +63,7 @@ class OrderTest(TestCase):
('test/course3', 10), ('test/course3', 10),
('test/course4', 20)] ('test/course4', 20)]
for course, cost in course_costs: for course, cost in course_costs:
CertificateItem.add_to_order(cart, course, cost, 'verified') CertificateItem.add_to_order(cart, course, cost, 'honor')
self.assertEquals(cart.orderitem_set.count(), len(course_costs)) self.assertEquals(cart.orderitem_set.count(), len(course_costs))
self.assertEquals(cart.total_cost, sum(cost for _course, cost in course_costs)) self.assertEquals(cart.total_cost, sum(cost for _course, cost in course_costs))
...@@ -73,7 +73,7 @@ class OrderTest(TestCase): ...@@ -73,7 +73,7 @@ class OrderTest(TestCase):
# CertificateItem, which is not quite good unit test form. Sorry. # CertificateItem, which is not quite good unit test form. Sorry.
cart = Order.get_cart_for_user(user=self.user) cart = Order.get_cart_for_user(user=self.user)
self.assertFalse(CourseEnrollment.is_enrolled(self.user, self.course_id)) self.assertFalse(CourseEnrollment.is_enrolled(self.user, self.course_id))
CertificateItem.add_to_order(cart, self.course_id, self.cost, 'verified') item = CertificateItem.add_to_order(cart, self.course_id, self.cost, 'honor')
# course enrollment object should be created but still inactive # course enrollment object should be created but still inactive
self.assertFalse(CourseEnrollment.is_enrolled(self.user, self.course_id)) self.assertFalse(CourseEnrollment.is_enrolled(self.user, self.course_id))
cart.purchase() cart.purchase()
...@@ -84,12 +84,13 @@ class OrderTest(TestCase): ...@@ -84,12 +84,13 @@ class OrderTest(TestCase):
self.assertEquals('Order Payment Confirmation', mail.outbox[0].subject) self.assertEquals('Order Payment Confirmation', mail.outbox[0].subject)
self.assertIn(settings.PAYMENT_SUPPORT_EMAIL, mail.outbox[0].body) self.assertIn(settings.PAYMENT_SUPPORT_EMAIL, mail.outbox[0].body)
self.assertIn(unicode(cart.total_cost), mail.outbox[0].body) self.assertIn(unicode(cart.total_cost), mail.outbox[0].body)
self.assertIn(item.additional_instruction_text, mail.outbox[0].body)
def test_purchase_item_failure(self): def test_purchase_item_failure(self):
# once again, we're testing against the specific implementation of # once again, we're testing against the specific implementation of
# CertificateItem # CertificateItem
cart = Order.get_cart_for_user(user=self.user) cart = Order.get_cart_for_user(user=self.user)
CertificateItem.add_to_order(cart, self.course_id, self.cost, 'verified') CertificateItem.add_to_order(cart, self.course_id, self.cost, 'honor')
with patch('shoppingcart.models.CertificateItem.save', side_effect=DatabaseError): with patch('shoppingcart.models.CertificateItem.save', side_effect=DatabaseError):
with self.assertRaises(DatabaseError): with self.assertRaises(DatabaseError):
cart.purchase() cart.purchase()
...@@ -100,7 +101,7 @@ class OrderTest(TestCase): ...@@ -100,7 +101,7 @@ class OrderTest(TestCase):
def purchase_with_data(self, cart): def purchase_with_data(self, cart):
""" purchase a cart with billing information """ """ purchase a cart with billing information """
CertificateItem.add_to_order(cart, self.course_id, self.cost, 'verified') CertificateItem.add_to_order(cart, self.course_id, self.cost, 'honor')
cart.purchase( cart.purchase(
first='John', first='John',
last='Smith', last='Smith',
...@@ -232,6 +233,16 @@ class CertificateItemTest(TestCase): ...@@ -232,6 +233,16 @@ class CertificateItemTest(TestCase):
self.user = UserFactory.create() self.user = UserFactory.create()
self.course_id = "test/course" self.course_id = "test/course"
self.cost = 40 self.cost = 40
course_mode = CourseMode(course_id=self.course_id,
mode_slug="honor",
mode_display_name="honor cert",
min_price=self.cost)
course_mode.save()
course_mode = CourseMode(course_id=self.course_id,
mode_slug="verified",
mode_display_name="verified cert",
min_price=self.cost)
course_mode.save()
def test_existing_enrollment(self): def test_existing_enrollment(self):
CourseEnrollment.enroll(self.user, self.course_id) CourseEnrollment.enroll(self.user, self.course_id)
......
...@@ -91,7 +91,7 @@ class ShoppingCartViewsTests(ModuleStoreTestCase): ...@@ -91,7 +91,7 @@ class ShoppingCartViewsTests(ModuleStoreTestCase):
def test_show_cart(self): def test_show_cart(self):
self.login_user() self.login_user()
reg_item = PaidCourseRegistration.add_to_order(self.cart, self.course_id) reg_item = PaidCourseRegistration.add_to_order(self.cart, self.course_id)
cert_item = CertificateItem.add_to_order(self.cart, 'test/course1', self.cost, 'verified') cert_item = CertificateItem.add_to_order(self.cart, 'test/course1', self.cost, 'honor')
resp = self.client.get(reverse('shoppingcart.views.show_cart', args=[])) resp = self.client.get(reverse('shoppingcart.views.show_cart', args=[]))
self.assertEqual(resp.status_code, 200) self.assertEqual(resp.status_code, 200)
...@@ -110,7 +110,7 @@ class ShoppingCartViewsTests(ModuleStoreTestCase): ...@@ -110,7 +110,7 @@ class ShoppingCartViewsTests(ModuleStoreTestCase):
def test_clear_cart(self): def test_clear_cart(self):
self.login_user() self.login_user()
PaidCourseRegistration.add_to_order(self.cart, self.course_id) PaidCourseRegistration.add_to_order(self.cart, self.course_id)
CertificateItem.add_to_order(self.cart, 'test/course1', self.cost, 'verified') CertificateItem.add_to_order(self.cart, 'test/course1', self.cost, 'honor')
self.assertEquals(self.cart.orderitem_set.count(), 2) self.assertEquals(self.cart.orderitem_set.count(), 2)
resp = self.client.post(reverse('shoppingcart.views.clear_cart', args=[])) resp = self.client.post(reverse('shoppingcart.views.clear_cart', args=[]))
self.assertEqual(resp.status_code, 200) self.assertEqual(resp.status_code, 200)
...@@ -120,7 +120,7 @@ class ShoppingCartViewsTests(ModuleStoreTestCase): ...@@ -120,7 +120,7 @@ class ShoppingCartViewsTests(ModuleStoreTestCase):
def test_remove_item(self, exception_log): def test_remove_item(self, exception_log):
self.login_user() self.login_user()
reg_item = PaidCourseRegistration.add_to_order(self.cart, self.course_id) reg_item = PaidCourseRegistration.add_to_order(self.cart, self.course_id)
cert_item = CertificateItem.add_to_order(self.cart, 'test/course1', self.cost, 'verified') cert_item = CertificateItem.add_to_order(self.cart, 'test/course1', self.cost, 'honor')
self.assertEquals(self.cart.orderitem_set.count(), 2) self.assertEquals(self.cart.orderitem_set.count(), 2)
resp = self.client.post(reverse('shoppingcart.views.remove_item', args=[]), resp = self.client.post(reverse('shoppingcart.views.remove_item', args=[]),
{'id': reg_item.id}) {'id': reg_item.id})
...@@ -166,7 +166,7 @@ class ShoppingCartViewsTests(ModuleStoreTestCase): ...@@ -166,7 +166,7 @@ class ShoppingCartViewsTests(ModuleStoreTestCase):
def test_show_receipt_404s(self): def test_show_receipt_404s(self):
PaidCourseRegistration.add_to_order(self.cart, self.course_id) PaidCourseRegistration.add_to_order(self.cart, self.course_id)
CertificateItem.add_to_order(self.cart, 'test/course1', self.cost, 'verified') CertificateItem.add_to_order(self.cart, 'test/course1', self.cost, 'honor')
self.cart.purchase() self.cart.purchase()
user2 = UserFactory.create() user2 = UserFactory.create()
...@@ -184,7 +184,7 @@ class ShoppingCartViewsTests(ModuleStoreTestCase): ...@@ -184,7 +184,7 @@ class ShoppingCartViewsTests(ModuleStoreTestCase):
@patch('shoppingcart.views.render_to_response', render_mock) @patch('shoppingcart.views.render_to_response', render_mock)
def test_show_receipt_success(self): def test_show_receipt_success(self):
reg_item = PaidCourseRegistration.add_to_order(self.cart, self.course_id) reg_item = PaidCourseRegistration.add_to_order(self.cart, self.course_id)
cert_item = CertificateItem.add_to_order(self.cart, 'test/course1', self.cost, 'verified') cert_item = CertificateItem.add_to_order(self.cart, 'test/course1', self.cost, 'honor')
self.cart.purchase(first='FirstNameTesting123', street1='StreetTesting123') self.cart.purchase(first='FirstNameTesting123', street1='StreetTesting123')
self.login_user() self.login_user()
...@@ -203,7 +203,7 @@ class ShoppingCartViewsTests(ModuleStoreTestCase): ...@@ -203,7 +203,7 @@ class ShoppingCartViewsTests(ModuleStoreTestCase):
@patch('shoppingcart.views.render_to_response', render_mock) @patch('shoppingcart.views.render_to_response', render_mock)
def test_show_receipt_success_refund(self): def test_show_receipt_success_refund(self):
reg_item = PaidCourseRegistration.add_to_order(self.cart, self.course_id) reg_item = PaidCourseRegistration.add_to_order(self.cart, self.course_id)
cert_item = CertificateItem.add_to_order(self.cart, 'test/course1', self.cost, 'verified') cert_item = CertificateItem.add_to_order(self.cart, 'test/course1', self.cost, 'honor')
self.cart.purchase(first='FirstNameTesting123', street1='StreetTesting123') self.cart.purchase(first='FirstNameTesting123', street1='StreetTesting123')
cert_item.status = "refunded" cert_item.status = "refunded"
cert_item.save() cert_item.save()
...@@ -222,7 +222,7 @@ class ShoppingCartViewsTests(ModuleStoreTestCase): ...@@ -222,7 +222,7 @@ class ShoppingCartViewsTests(ModuleStoreTestCase):
@patch('shoppingcart.views.render_to_response', render_mock) @patch('shoppingcart.views.render_to_response', render_mock)
def test_show_receipt_success_custom_receipt_page(self): def test_show_receipt_success_custom_receipt_page(self):
cert_item = CertificateItem.add_to_order(self.cart, self.course_id, self.cost, 'verified') cert_item = CertificateItem.add_to_order(self.cart, self.course_id, self.cost, 'honor')
self.cart.purchase() self.cart.purchase()
self.login_user() self.login_user()
receipt_url = reverse('shoppingcart.views.show_receipt', args=[self.cart.id]) receipt_url = reverse('shoppingcart.views.show_receipt', args=[self.cart.id])
......
<%! from django.utils.translation import ugettext as _ %> <%! from django.utils.translation import ugettext as _ %>
${_("Hi {name}").format(name=order.user.first_name)}
${_("Thank you for your order! Payment was successful, and you should be able to see the results on your dashboard.")} ${_("Your payment was successful. You will see the charge below on your next credit or debit card statement. The charge will show up on your statement under the company name {platform_name}. If you have billing questions, please read the FAQ or contact {billing_email}. We hope you enjoy your order.").format(platform_name=settings.PLATFORM_NAME,billing_email=settings.PAYMENT_SUPPORT_EMAIL)}
${_("-The {platform_name} Team").format(platform_name=settings.PLATFORM_NAME)}
${_("Your order number is: {order_number}").format(order_number=order.id)} ${_("Your order number is: {order_number}").format(order_number=order.id)}
${_("Items in your order:")} ${_("The items in your order are:")}
${_("Quantity - Description - Price")} ${_("Quantity - Description - Price")}
%for order_item in order_items: %for order_item in order_items:
${order_item.qty} - ${order_item.line_desc} - ${order_item.line_cost} ${order_item.qty} - ${order_item.line_desc} - ${order_item.line_cost}
%endfor %endfor
${_("Total: {total_cost}").format(total_cost=order.total_cost)} ${_("Total billed to credit/debit card: {total_cost}").format(total_cost=order.total_cost)}
${_("If you have any issues, please contact us at {billing_email}").format(billing_email=settings.PAYMENT_SUPPORT_EMAIL)} %for order_item in order_items:
${order_item.additional_instruction_text}
%endfor
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