From 9fddc6946ad42555299ba28de9db3a8b4cdc996c Mon Sep 17 00:00:00 2001 From: Muhammad Shoaib Date: Wed, 26 Nov 2014 17:26:30 +0500 Subject: [PATCH] WL-163-added-the-USD-symbol-himBHin-the-HTML-templates-configuration-settings added the unit tests for the default currency settings --- .../tests/views/test_instructor_dashboard.py | 33 ++++++++- lms/djangoapps/instructor/views/api.py | 1 + .../instructor/views/instructor_dashboard.py | 1 + lms/djangoapps/shoppingcart/models.py | 1 + .../shoppingcart/tests/test_views.py | 71 +++++++++++++++++++ lms/djangoapps/shoppingcart/views.py | 6 ++ .../business_order_confirmation_email.txt | 4 +- .../emails/order_confirmation_email.txt | 4 +- .../emails/registration_codes_sale_email.txt | 2 +- ...stration_codes_sale_invoice_attachment.txt | 7 +- .../instructor_dashboard_2/e-commerce.html | 4 +- .../shoppingcart/billing_details.html | 2 +- lms/templates/shoppingcart/receipt.html | 14 ++-- lms/templates/shoppingcart/shopping_cart.html | 8 +-- 14 files changed, 132 insertions(+), 26 deletions(-) diff --git a/lms/djangoapps/instructor/tests/views/test_instructor_dashboard.py b/lms/djangoapps/instructor/tests/views/test_instructor_dashboard.py index 535676a320..60adb472ae 100644 --- a/lms/djangoapps/instructor/tests/views/test_instructor_dashboard.py +++ b/lms/djangoapps/instructor/tests/views/test_instructor_dashboard.py @@ -11,7 +11,9 @@ from courseware.tests.helpers import LoginEnrollmentTestCase from student.tests.factories import AdminFactory from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase from xmodule.modulestore.tests.factories import CourseFactory - +from shoppingcart.models import PaidCourseRegistration +from course_modes.models import CourseMode +from student.roles import CourseFinanceAdminRole class TestInstructorDashboard(ModuleStoreTestCase, LoginEnrollmentTestCase): """ @@ -24,9 +26,14 @@ class TestInstructorDashboard(ModuleStoreTestCase, LoginEnrollmentTestCase): """ self.course = CourseFactory.create() + self.course_mode = CourseMode(course_id=self.course.id, + mode_slug="honor", + mode_display_name="honor cert", + min_price=40) + self.course_mode.save() # Create instructor account - instructor = AdminFactory.create() - self.client.login(username=instructor.username, password="test") + self.instructor = AdminFactory.create() + self.client.login(username=self.instructor.username, password="test") # URL for instructor dash self.url = reverse('instructor_dashboard', kwargs={'course_id': self.course.id.to_deprecated_string()}) @@ -51,6 +58,26 @@ class TestInstructorDashboard(ModuleStoreTestCase, LoginEnrollmentTestCase): return 'Demographic data is now available in Example.'.format(unicode(self.course.id)) + def test_default_currency_in_the_html_response(self): + """ + Test that checks the default currency_symbol ($) in the response + """ + CourseFinanceAdminRole(self.course.id).add_users(self.instructor) + total_amount = PaidCourseRegistration.get_total_amount_of_purchased_item(self.course.id) + response = self.client.get(self.url) + self.assertTrue('${amount}'.format(amount=total_amount) in response.content) + + @override_settings(PAID_COURSE_REGISTRATION_CURRENCY=['PKR', 'Rs']) + def test_override_currency_settings_in_the_html_response(self): + """ + Test that checks the default currency_symbol ($) in the response + """ + CourseFinanceAdminRole(self.course.id).add_users(self.instructor) + total_amount = PaidCourseRegistration.get_total_amount_of_purchased_item(self.course.id) + response = self.client.get(self.url) + self.assertTrue('{currency}{amount}'.format(currency='Rs', amount=total_amount) in response.content) + + @patch.dict(settings.FEATURES, {'DISPLAY_ANALYTICS_ENROLLMENTS': False}) @override_settings(ANALYTICS_DASHBOARD_URL='') def test_no_enrollments(self): diff --git a/lms/djangoapps/instructor/views/api.py b/lms/djangoapps/instructor/views/api.py index f8176c9ce0..1f6429d28e 100644 --- a/lms/djangoapps/instructor/views/api.py +++ b/lms/djangoapps/instructor/views/api.py @@ -1137,6 +1137,7 @@ def generate_registration_codes(request, course_id): 'sale_price': sale_price, 'quantity': quantity, 'registration_codes': registration_codes, + 'currency_symbol': settings.PAID_COURSE_REGISTRATION_CURRENCY[1], 'course_url': course_url, 'platform_name': microsite.get_value('platform_name', settings.PLATFORM_NAME), 'dashboard_url': dashboard_url, diff --git a/lms/djangoapps/instructor/views/instructor_dashboard.py b/lms/djangoapps/instructor/views/instructor_dashboard.py index 6c97199ac3..95a9b116ea 100644 --- a/lms/djangoapps/instructor/views/instructor_dashboard.py +++ b/lms/djangoapps/instructor/views/instructor_dashboard.py @@ -144,6 +144,7 @@ def _section_e_commerce(course, access): 'section_display_name': _('E-Commerce'), 'access': access, 'course_id': course_key.to_deprecated_string(), + 'currency_symbol': settings.PAID_COURSE_REGISTRATION_CURRENCY[1], 'ajax_remove_coupon_url': reverse('remove_coupon', kwargs={'course_id': course_key.to_deprecated_string()}), 'ajax_get_coupon_info': reverse('get_coupon_info', kwargs={'course_id': course_key.to_deprecated_string()}), 'get_user_invoice_preference_url': reverse('get_user_invoice_preference', kwargs={'course_id': course_key.to_deprecated_string()}), diff --git a/lms/djangoapps/shoppingcart/models.py b/lms/djangoapps/shoppingcart/models.py index db5eee15db..360bcb8a25 100644 --- a/lms/djangoapps/shoppingcart/models.py +++ b/lms/djangoapps/shoppingcart/models.py @@ -309,6 +309,7 @@ class Order(models.Model): 'order_items': orderitems, 'course_names': ", ".join([course_info[0] for course_info in courses_info]), 'dashboard_url': dashboard_url, + 'currency_symbol': settings.PAID_COURSE_REGISTRATION_CURRENCY[1], 'order_placed_by': '{username} ({email})'.format(username=self.user.username, email=getattr(self.user, 'email')), # pylint: disable=E1101 'has_billing_info': settings.FEATURES['STORE_BILLING_INFO'], 'platform_name': microsite.get_value('platform_name', settings.PLATFORM_NAME), diff --git a/lms/djangoapps/shoppingcart/tests/test_views.py b/lms/djangoapps/shoppingcart/tests/test_views.py index 96db9e0e51..923bd98057 100644 --- a/lms/djangoapps/shoppingcart/tests/test_views.py +++ b/lms/djangoapps/shoppingcart/tests/test_views.py @@ -136,6 +136,7 @@ class ShoppingCartViewsTests(ModuleStoreTestCase): resp = self.client.post(reverse('shoppingcart.views.add_course_to_cart', args=[self.course_key.to_deprecated_string()])) self.assertEqual(resp.status_code, 403) + @patch('shoppingcart.views.render_to_response', render_mock) def test_billing_details(self): billing_url = reverse('billing_details') self.login_user() @@ -150,6 +151,13 @@ class ShoppingCartViewsTests(ModuleStoreTestCase): resp = self.client.get(billing_url) self.assertEqual(resp.status_code, 200) + ((template, context), _) = render_mock.call_args # pylint: disable=W0621 + self.assertEqual(template, 'shoppingcart/billing_details.html') + # check for the default currency in the context + self.assertEqual(context['currency'], 'usd') + self.assertEqual(context['currency_symbol'], '$') + + data = {'company_name': 'Test Company', 'company_contact_name': 'JohnDoe', 'company_contact_email': 'john@est.com', 'recipient_name': 'Mocker', 'recipient_email': 'mock@germ.com', 'company_address_line_1': 'DC Street # 1', @@ -160,6 +168,24 @@ class ShoppingCartViewsTests(ModuleStoreTestCase): resp = self.client.post(billing_url, data) self.assertEqual(resp.status_code, 200) + @patch('shoppingcart.views.render_to_response', render_mock) + @override_settings(PAID_COURSE_REGISTRATION_CURRENCY=['PKR', 'Rs']) + def test_billing_details_with_override_currency_settings(self): + billing_url = reverse('billing_details') + self.login_user() + + #chagne the order_type to business + self.cart.order_type = 'business' + self.cart.save() + resp = self.client.get(billing_url) + self.assertEqual(resp.status_code, 200) + + ((template, context), _) = render_mock.call_args # pylint: disable=W0621 + self.assertEqual(template, 'shoppingcart/billing_details.html') + # check for the override currency settings in the context + self.assertEqual(context['currency'], 'PKR') + self.assertEqual(context['currency_symbol'], 'Rs') + def test_add_course_to_cart_already_in_cart(self): PaidCourseRegistration.add_to_order(self.cart, self.course_key) self.login_user() @@ -655,6 +681,28 @@ class ShoppingCartViewsTests(ModuleStoreTestCase): self.assertEqual(len(context['shoppingcart_items']), 2) self.assertEqual(context['amount'], 80) self.assertIn("80.00", context['form_html']) + # check for the default currency in the context + self.assertEqual(context['currency'], 'usd') + self.assertEqual(context['currency_symbol'], '$') + + @patch('shoppingcart.views.render_purchase_form_html', form_mock) + @patch('shoppingcart.views.render_to_response', render_mock) + @override_settings(PAID_COURSE_REGISTRATION_CURRENCY=['PKR', 'Rs']) + def test_show_cart_with_override_currency_settings(self): + self.login_user() + reg_item = PaidCourseRegistration.add_to_order(self.cart, self.course_key) + resp = self.client.get(reverse('shoppingcart.views.show_cart', args=[])) + self.assertEqual(resp.status_code, 200) + + ((purchase_form_arg_cart,), _) = form_mock.call_args # pylint: disable=W0621 + purchase_form_arg_cart_items = purchase_form_arg_cart.orderitem_set.all().select_subclasses() + self.assertIn(reg_item, purchase_form_arg_cart_items) + + ((template, context), _) = render_mock.call_args + self.assertEqual(template, 'shoppingcart/shopping_cart.html') + # check for the override currency settings in the context + self.assertEqual(context['currency'], 'PKR') + self.assertEqual(context['currency_symbol'], 'Rs') def test_clear_cart(self): self.login_user() @@ -841,6 +889,29 @@ class ShoppingCartViewsTests(ModuleStoreTestCase): self.assertIn(reg_item, context['shoppingcart_items'][0]) self.assertIn(cert_item, context['shoppingcart_items'][1]) self.assertFalse(context['any_refunds']) + # check for the default currency settings in the context + self.assertEqual(context['currency_symbol'], '$') + self.assertEqual(context['currency'], 'usd') + + @override_settings(PAID_COURSE_REGISTRATION_CURRENCY=['PKR', 'Rs']) + @patch('shoppingcart.views.render_to_response', render_mock) + def test_show_receipt_success_with_override_currency_settings(self): + reg_item = PaidCourseRegistration.add_to_order(self.cart, self.course_key) + cert_item = CertificateItem.add_to_order(self.cart, self.verified_course_key, self.cost, 'honor') + self.cart.purchase(first='FirstNameTesting123', street1='StreetTesting123') + + self.login_user() + resp = self.client.get(reverse('shoppingcart.views.show_receipt', args=[self.cart.id])) + self.assertEqual(resp.status_code, 200) + + ((template, context), _) = render_mock.call_args # pylint: disable=W0621 + self.assertEqual(template, 'shoppingcart/receipt.html') + self.assertIn(reg_item, context['shoppingcart_items'][0]) + self.assertIn(cert_item, context['shoppingcart_items'][1]) + + # check for the override currency settings in the context + self.assertEqual(context['currency_symbol'], 'Rs') + self.assertEqual(context['currency'], 'PKR') @patch('shoppingcart.views.render_to_response', render_mock) def test_courseregcode_item_total_price(self): diff --git a/lms/djangoapps/shoppingcart/views.py b/lms/djangoapps/shoppingcart/views.py index 806a2d6a97..9326039ca7 100644 --- a/lms/djangoapps/shoppingcart/views.py +++ b/lms/djangoapps/shoppingcart/views.py @@ -156,6 +156,8 @@ def show_cart(request): 'amount': total_cost, 'site_name': site_name, 'form_html': form_html, + 'currency_symbol': settings.PAID_COURSE_REGISTRATION_CURRENCY[1], + 'currency': settings.PAID_COURSE_REGISTRATION_CURRENCY[0], } return render_to_response("shoppingcart/shopping_cart.html", context) @@ -557,6 +559,8 @@ def billing_details(request): 'shoppingcart_items': cart_items, 'amount': total_cost, 'form_html': form_html, + 'currency_symbol': settings.PAID_COURSE_REGISTRATION_CURRENCY[1], + 'currency': settings.PAID_COURSE_REGISTRATION_CURRENCY[0], 'site_name': microsite.get_value('SITE_NAME', settings.SITE_NAME), } return render_to_response("shoppingcart/billing_details.html", context) @@ -636,6 +640,8 @@ def show_receipt(request, ordernum): 'order_type': order_type, 'appended_course_names': appended_course_names, 'appended_recipient_emails': appended_recipient_emails, + 'currency_symbol': settings.PAID_COURSE_REGISTRATION_CURRENCY[1], + 'currency': settings.PAID_COURSE_REGISTRATION_CURRENCY[0], 'total_registration_codes': total_registration_codes, 'registration_codes': registration_codes, 'order_purchase_date': order.purchase_time.strftime("%B %d, %Y"), diff --git a/lms/templates/emails/business_order_confirmation_email.txt b/lms/templates/emails/business_order_confirmation_email.txt index 870ca26c98..40bd104288 100644 --- a/lms/templates/emails/business_order_confirmation_email.txt +++ b/lms/templates/emails/business_order_confirmation_email.txt @@ -27,10 +27,10 @@ ${_("Thank you for your purchase of ")} ${course_names}

${_("Quantity - Description - Price")}
%for order_item in order_items: - ${order_item.qty} - ${order_item.line_desc} - ${"$" if order_item.currency == 'usd' else ""}${order_item.line_cost}

+ ${order_item.qty} - ${order_item.line_desc} - ${currency_symbol}${order_item.line_cost}

%endfor -

${_("Total billed to credit/debit card: {currency_symbol}{total_cost}").format(total_cost=order.total_cost, currency_symbol=("$" if order.currency == 'usd' else ""))}

+

${_("Total billed to credit/debit card: {currency_symbol}{total_cost}").format(total_cost=order.total_cost, currency_symbol=currency_symbol)}

% if order.company_name: diff --git a/lms/templates/emails/order_confirmation_email.txt b/lms/templates/emails/order_confirmation_email.txt index 87d4c26b80..0648cf0c70 100644 --- a/lms/templates/emails/order_confirmation_email.txt +++ b/lms/templates/emails/order_confirmation_email.txt @@ -22,10 +22,10 @@ ${_("The items in your order are:")} ${_("Quantity - Description - Price")} %for order_item in order_items: - ${order_item.qty} - ${order_item.line_desc} - ${"$" if order_item.currency == 'usd' else ""}${order_item.line_cost} + ${order_item.qty} - ${order_item.line_desc} - ${currency_symbol}${order_item.line_cost} %endfor -${_("Total billed to credit/debit card: {currency_symbol}{total_cost}").format(total_cost=order.total_cost, currency_symbol=("$" if order.currency == 'usd' else ""))} +${_("Total billed to credit/debit card: {currency_symbol}{total_cost}").format(total_cost=order.total_cost, currency_symbol=currency_symbol)} % if has_billing_info: ${order.bill_to_cardtype} ${_("#:")} ${order.bill_to_ccnum} diff --git a/lms/templates/emails/registration_codes_sale_email.txt b/lms/templates/emails/registration_codes_sale_email.txt index 217f8cf763..1c74c9b20e 100644 --- a/lms/templates/emails/registration_codes_sale_email.txt +++ b/lms/templates/emails/registration_codes_sale_email.txt @@ -2,7 +2,7 @@ ${_("Thank you for your purchase of {course_name}!").format(course_name=course.display_name)} -${_("An invoice for ${total_price} is attached. Payment is due immediately. Information on payment methods can be found on the invoice.").format(total_price=sale_price)} +${_("An invoice for {currency_symbol}{total_price} is attached. Payment is due immediately. Information on payment methods can be found on the invoice.").format(currency_symbol=currency_symbol, total_price=sale_price)} ${_("A CSV file of your registration codes is attached. Please distribute registration codes to each student planning to enroll using the email template below.")} diff --git a/lms/templates/emails/registration_codes_sale_invoice_attachment.txt b/lms/templates/emails/registration_codes_sale_invoice_attachment.txt index 53ac470b67..dcb01f2aa5 100644 --- a/lms/templates/emails/registration_codes_sale_invoice_attachment.txt +++ b/lms/templates/emails/registration_codes_sale_invoice_attachment.txt @@ -1,5 +1,4 @@ <%! from django.utils.translation import ugettext as _ %> - ${_("INVOICE")} ——————————————————————————————————————————— @@ -24,13 +23,13 @@ ${invoice.city}, ${invoice.state}, ${invoice.zip} ${invoice.country} ${_("Customer Reference Number: {reference_number}").format(reference_number=invoice.customer_reference_number if invoice.customer_reference_number else "")} - ${_("Balance Due: ${sale_price}").format(sale_price=sale_price)} + ${_("Balance Due: {currency_symbol}{sale_price}").format(currency_symbol=currency_symbol, sale_price=sale_price)} ——————————————————————————————————————————— ${_("Course: {course_name}").format(course_name=course.display_name)} -
${_("Price: ${course_price} Quantity: {quantity} Sub-Total: ${sub_total} Discount: ${discount}").format(course_price=course_price, quantity=quantity, sub_total=sub_total, discount=discount)} -${_("Total: ${sale_price}").format(sale_price=sale_price)} +
${_("Price: {currency_symbol}{course_price} Quantity: {quantity} Sub-Total: {currency_symbol}{sub_total} Discount: {currency_symbol}{discount}").format(course_price=course_price, quantity=quantity, sub_total=sub_total, discount=discount, currency_symbol=currency_symbol)} +${_("Total: {currency_symbol}{sale_price}").format(sale_price=sale_price, currency_symbol=currency_symbol)} ——————————————————————————————————————————— diff --git a/lms/templates/instructor/instructor_dashboard_2/e-commerce.html b/lms/templates/instructor/instructor_dashboard_2/e-commerce.html index 7a2dda941d..3d8f924cfb 100644 --- a/lms/templates/instructor/instructor_dashboard_2/e-commerce.html +++ b/lms/templates/instructor/instructor_dashboard_2/e-commerce.html @@ -44,7 +44,7 @@

${_("Course Price")}

- ${_("Course Price: ")}$${section_data['course_price']} + ${_("Course Price: ")}${section_data['currency_symbol']}${section_data['course_price']} %if section_data['access']['finance_admin'] is True: + ${_('Set Price')} %endif @@ -57,7 +57,7 @@

${_("Transactions")}

%if section_data['total_amount'] is not None: - ${_("Total Amount: ")}$${section_data['total_amount']} + ${_("Total Amount: ")}${section_data['currency_symbol']}${section_data['total_amount']} %endif ${_("Click to generate a CSV file for all purchase transactions in this course")} diff --git a/lms/templates/shoppingcart/billing_details.html b/lms/templates/shoppingcart/billing_details.html index d1dbf4e54f..bf35cb7393 100644 --- a/lms/templates/shoppingcart/billing_details.html +++ b/lms/templates/shoppingcart/billing_details.html @@ -36,7 +36,7 @@
- ${_('Total')}: $${"{0:0.2f}".format(amount)} USD + ${_('Total')}: ${currency_symbol}${"{0:0.2f}".format(amount)} ${currency.upper()}
diff --git a/lms/templates/shoppingcart/receipt.html b/lms/templates/shoppingcart/receipt.html index 65edb6d5d9..1e4c1b5f93 100644 --- a/lms/templates/shoppingcart/receipt.html +++ b/lms/templates/shoppingcart/receipt.html @@ -299,11 +299,11 @@ from courseware.courses import course_image_url, get_course_about_section, get_c % if item.status == "purchased":
% if item.list_price != None: -
${_('Price per student:')} $${"{0:0.2f}".format(item.list_price)} +
${_('Price per student:')} ${currency_symbol}${"{0:0.2f}".format(item.list_price)}
-
${_('Discount Applied:')} $${"{0:0.2f}".format(item.unit_cost)}
+
${_('Discount Applied:')} ${currency_symbol}${"{0:0.2f}".format(item.unit_cost)}
% else: -
${_('Price per student:')} $${"{0:0.2f}".format(item.unit_cost)}
+
${_('Price per student:')} ${currency_symbol}${"{0:0.2f}".format(item.unit_cost)}
% endif
@@ -317,12 +317,12 @@ from courseware.courses import course_image_url, get_course_about_section, get_c % elif item.status == "refunded":
% if item.list_price != None: -
${_('Price per student:')} $${"{0:0.2f}".format(item.list_price)} +
${_('Price per student:')} ${currency_symbol}${"{0:0.2f}".format(item.list_price)}
-
${_('Discount Applied:')} $${"{0:0.2f}".format(item.unit_cost)} +
${_('Discount Applied:')} ${currency_symbol}${"{0:0.2f}".format(item.unit_cost)}
% else: -
${_('Price per student:')} $${"{0:0.2f}".format(item.unit_cost)} +
${_('Price per student:')} ${currency_symbol}${"{0:0.2f}".format(item.unit_cost)}
% endif
@@ -348,7 +348,7 @@ from courseware.courses import course_image_url, get_course_about_section, get_c ${_("Note: items with strikethough like this have been refunded.")}
% endif - ${_("Total")}: $${"{0:0.2f}".format(order.total_cost)} USD + ${_("Total")}: ${currency_symbol}${"{0:0.2f}".format(order.total_cost)} ${currency.upper()}
## Allow for a microsite to be able to insert additional text at the bottom of the page diff --git a/lms/templates/shoppingcart/shopping_cart.html b/lms/templates/shoppingcart/shopping_cart.html index e938ad4a33..e87027cb5c 100644 --- a/lms/templates/shoppingcart/shopping_cart.html +++ b/lms/templates/shoppingcart/shopping_cart.html @@ -40,10 +40,10 @@ from django.utils.translation import ugettext as _
% if item.list_price != None: <% discount_applied = True %> -
${_('Price per student:')} $${"{0:0.2f}".format(item.list_price)}
-
${_('Discount Applied:')} $${"{0:0.2f}".format(item.unit_cost)}
+
${_('Price per student:')} ${currency_symbol}${"{0:0.2f}".format(item.list_price)}
+
${_('Discount Applied:')} ${currency_symbol}${"{0:0.2f}".format(item.unit_cost)}
% else: -
${_('Price per student:')} $${"{0:0.2f}".format(item.unit_cost)}
+
${_('Price per student:')} ${currency_symbol}${"{0:0.2f}".format(item.unit_cost)}
% endif
@@ -82,7 +82,7 @@ from django.utils.translation import ugettext as _
%endif - ${_('Total:')} $${"{0:0.2f}".format(amount)} USD + ${_('Total:')} ${currency_symbol}${"{0:0.2f}".format(amount)} ${currency.upper()}