From 8db769968f85c353486305a69d9df59ca1c9fdc1 Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 27 Feb 2024 10:16:54 +1100 Subject: [PATCH] Allow currency symbol to be omitted from render_currency (#6580) - Closes https://github.com/inventree/InvenTree/issues/6578 --- InvenTree/InvenTree/format.py | 13 +++++++--- InvenTree/InvenTree/helpers_model.py | 6 ++++- InvenTree/InvenTree/tests.py | 39 ++++++++++++++-------------- 3 files changed, 35 insertions(+), 23 deletions(-) diff --git a/InvenTree/InvenTree/format.py b/InvenTree/InvenTree/format.py index 6af5cecf04..b03d28f2a8 100644 --- a/InvenTree/InvenTree/format.py +++ b/InvenTree/InvenTree/format.py @@ -180,7 +180,12 @@ def extract_named_group(name: str, value: str, fmt_string: str) -> str: return result.group(name) -def format_money(money: Money, decimal_places: int = None, format: str = None) -> str: +def format_money( + money: Money, + decimal_places: int = None, + format: str = None, + include_symbol: bool = True, +) -> str: """Format money object according to the currently set local. Args: @@ -203,10 +208,12 @@ def format_money(money: Money, decimal_places: int = None, format: str = None) - if decimal_places is not None: pattern.frac_prec = (decimal_places, decimal_places) - return pattern.apply( + result = pattern.apply( money.amount, locale, - currency=money.currency.code, + currency=money.currency.code if include_symbol else '', currency_digits=decimal_places is None, decimal_quantization=decimal_places is not None, ) + + return result diff --git a/InvenTree/InvenTree/helpers_model.py b/InvenTree/InvenTree/helpers_model.py index 3b410819ae..7e87d44314 100644 --- a/InvenTree/InvenTree/helpers_model.py +++ b/InvenTree/InvenTree/helpers_model.py @@ -204,6 +204,7 @@ def render_currency( currency=None, min_decimal_places=None, max_decimal_places=None, + include_symbol=True, ): """Render a currency / Money object to a formatted string (e.g. for reports). @@ -213,6 +214,7 @@ def render_currency( currency: Optionally convert to the specified currency min_decimal_places: The minimum number of decimal places to render to. If unspecified, uses the PRICING_DECIMAL_PLACES_MIN setting. max_decimal_places: The maximum number of decimal places to render to. If unspecified, uses the PRICING_DECIMAL_PLACES setting. + include_symbol: If True, include the currency symbol in the output """ if money in [None, '']: return '-' @@ -258,7 +260,9 @@ def render_currency( decimal_places = max(decimal_places, max_decimal_places) - return format_money(money, decimal_places=decimal_places) + return format_money( + money, decimal_places=decimal_places, include_symbol=include_symbol + ) def getModelsWithMixin(mixin_class) -> list: diff --git a/InvenTree/InvenTree/tests.py b/InvenTree/InvenTree/tests.py index dedf608d7e..67ac06bde0 100644 --- a/InvenTree/InvenTree/tests.py +++ b/InvenTree/InvenTree/tests.py @@ -358,30 +358,31 @@ class FormatTest(TestCase): def test_currency_formatting(self): """Test that currency formatting works correctly for multiple currencies.""" test_data = ( - (Money(3651.285718, 'USD'), 4, '$3,651.2857'), # noqa: E201,E202 - (Money(487587.849178, 'CAD'), 5, 'CA$487,587.84918'), # noqa: E201,E202 - (Money(0.348102, 'EUR'), 1, '€0.3'), # noqa: E201,E202 - (Money(0.916530, 'GBP'), 1, '£0.9'), # noqa: E201,E202 - (Money(61.031024, 'JPY'), 3, '¥61.031'), # noqa: E201,E202 - (Money(49609.694602, 'JPY'), 1, '¥49,609.7'), # noqa: E201,E202 - (Money(155565.264777, 'AUD'), 2, 'A$155,565.26'), # noqa: E201,E202 - (Money(0.820437, 'CNY'), 4, 'CN¥0.8204'), # noqa: E201,E202 - (Money(7587.849178, 'EUR'), 0, '€7,588'), # noqa: E201,E202 - (Money(0.348102, 'GBP'), 3, '£0.348'), # noqa: E201,E202 - (Money(0.652923, 'CHF'), 0, 'CHF1'), # noqa: E201,E202 - (Money(0.820437, 'CNY'), 1, 'CN¥0.8'), # noqa: E201,E202 - (Money(98789.5295680, 'CHF'), 0, 'CHF98,790'), # noqa: E201,E202 - (Money(0.585787, 'USD'), 1, '$0.6'), # noqa: E201,E202 - (Money(0.690541, 'CAD'), 3, 'CA$0.691'), # noqa: E201,E202 - (Money(427.814104, 'AUD'), 5, 'A$427.81410'), # noqa: E201,E202 + (Money(3651.285718, 'USD'), 4, True, '$3,651.2857'), # noqa: E201,E202 + (Money(487587.849178, 'CAD'), 5, True, 'CA$487,587.84918'), # noqa: E201,E202 + (Money(0.348102, 'EUR'), 1, False, '0.3'), # noqa: E201,E202 + (Money(0.916530, 'GBP'), 1, True, '£0.9'), # noqa: E201,E202 + (Money(61.031024, 'JPY'), 3, False, '61.031'), # noqa: E201,E202 + (Money(49609.694602, 'JPY'), 1, True, '¥49,609.7'), # noqa: E201,E202 + (Money(155565.264777, 'AUD'), 2, False, '155,565.26'), # noqa: E201,E202 + (Money(0.820437, 'CNY'), 4, True, 'CN¥0.8204'), # noqa: E201,E202 + (Money(7587.849178, 'EUR'), 0, True, '€7,588'), # noqa: E201,E202 + (Money(0.348102, 'GBP'), 3, False, '0.348'), # noqa: E201,E202 + (Money(0.652923, 'CHF'), 0, True, 'CHF1'), # noqa: E201,E202 + (Money(0.820437, 'CNY'), 1, True, 'CN¥0.8'), # noqa: E201,E202 + (Money(98789.5295680, 'CHF'), 0, False, '98,790'), # noqa: E201,E202 + (Money(0.585787, 'USD'), 1, True, '$0.6'), # noqa: E201,E202 + (Money(0.690541, 'CAD'), 3, True, 'CA$0.691'), # noqa: E201,E202 + (Money(427.814104, 'AUD'), 5, True, 'A$427.81410'), # noqa: E201,E202 ) with self.settings(LANGUAGE_CODE='en-us'): - for value, decimal_places, expected_result in test_data: + for value, decimal_places, include_symbol, expected_result in test_data: result = InvenTree.format.format_money( - value, decimal_places=decimal_places + value, decimal_places=decimal_places, include_symbol=include_symbol ) - assert result == expected_result + + self.assertEqual(result, expected_result) class TestHelpers(TestCase):