From 756a17f8db1be523c5c579877f77a9989ef01ac2 Mon Sep 17 00:00:00 2001 From: Katie Smith Date: Tue, 14 Jul 2020 14:45:37 +0100 Subject: [PATCH] Add filter for formatting a number as currency MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is used on the usage page, but is likely to become useful in other places now that letter rates can be greater than £1. --- app/__init__.py | 8 ++++++++ app/main/views/dashboard.py | 9 +-------- app/templates/views/usage.html | 2 +- tests/app/main/test_formatters.py | 21 ++++++++++++++++++++- 4 files changed, 30 insertions(+), 10 deletions(-) diff --git a/app/__init__.py b/app/__init__.py index 9785d5847..1bae233cd 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -521,6 +521,13 @@ def nl2br(value): return '' +def format_number_in_pounds_as_currency(number): + if number >= 1: + return f"£{number:,.2f}" + + return f"{number * 100:.0f}p" + + @login_manager.user_loader def load_user(user_id): return User.from_id(user_id) @@ -798,6 +805,7 @@ def add_template_filters(application): format_notification_status_as_time, format_notification_status_as_field_status, format_notification_status_as_url, + format_number_in_pounds_as_currency, formatters.formatted_list, nl2br, format_phone_number_human_readable, diff --git a/app/main/views/dashboard.py b/app/main/views/dashboard.py index d169de9d2..a634f1a0e 100644 --- a/app/main/views/dashboard.py +++ b/app/main/views/dashboard.py @@ -456,7 +456,7 @@ def format_letter_details_for_month(letter_units_for_month): letter_details = LetterDetails( billing_units=sum(x['billing_units'] for x in rate_group), - rate=format_letter_rate(rate_group[0]['rate']), + rate=rate_group[0]['rate'], cost=(sum(x['billing_units'] for x in rate_group) * rate_group[0]['rate']), postage_description=rate_group[0]['postage'] ) @@ -472,13 +472,6 @@ def get_postage_description(postage): return 'international' -def format_letter_rate(number): - if number >= 1: - return f"£{number:,.2f}" - - return f"{number * 100:.0f}p" - - def get_free_paid_breakdown_for_month( free_sms_fragment_limit, cumulative, diff --git a/app/templates/views/usage.html b/app/templates/views/usage.html index a78c10f79..4b7491be4 100644 --- a/app/templates/views/usage.html +++ b/app/templates/views/usage.html @@ -110,7 +110,7 @@ {% for letter in month.letters%} {% if letter.billing_units %}
  • {{ "{:,} {}".format(letter.billing_units, letter.postage_description) }} {{ message_count_label(letter.billing_units, 'letter', '') }}at - {{ letter.rate }}
  • + {{ letter.rate | format_number_in_pounds_as_currency }} {% endif %} {% endfor %} {% if not (month.free or month.paid or month.letters) %} diff --git a/tests/app/main/test_formatters.py b/tests/app/main/test_formatters.py index 5ef5c28da..8e0198ee2 100644 --- a/tests/app/main/test_formatters.py +++ b/tests/app/main/test_formatters.py @@ -3,7 +3,10 @@ from functools import partial import pytest from flask import url_for -from app import format_notification_status_as_url +from app import ( + format_notification_status_as_url, + format_number_in_pounds_as_currency, +) @pytest.mark.parametrize('status, notification_type, expected', ( @@ -33,3 +36,19 @@ def test_format_notification_status_as_url( assert format_notification_status_as_url( status, notification_type ) == expected() + + +@pytest.mark.parametrize('input_number, formatted_number', [ + (0, '0p'), + (0.01, '1p'), + (0.5, '50p'), + (1, '£1.00'), + (1.01, '£1.01'), + (1.006, '£1.01'), + (5.25, '£5.25'), + (5.7, '£5.70'), + (381, '£381.00'), + (144820, '£144,820.00'), +]) +def test_format_number_in_pounds_as_currency(input_number, formatted_number): + assert format_number_in_pounds_as_currency(input_number) == formatted_number