2
0
mirror of https://github.com/inventree/InvenTree.git synced 2025-04-28 19:46:46 +00:00

Allow currency symbol to be omitted from render_currency (#6580)

- Closes https://github.com/inventree/InvenTree/issues/6578
This commit is contained in:
Oliver 2024-02-27 10:16:54 +11:00 committed by GitHub
parent ea63a03fe4
commit 8db769968f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 35 additions and 23 deletions

View File

@ -180,7 +180,12 @@ def extract_named_group(name: str, value: str, fmt_string: str) -> str:
return result.group(name) 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. """Format money object according to the currently set local.
Args: Args:
@ -203,10 +208,12 @@ def format_money(money: Money, decimal_places: int = None, format: str = None) -
if decimal_places is not None: if decimal_places is not None:
pattern.frac_prec = (decimal_places, decimal_places) pattern.frac_prec = (decimal_places, decimal_places)
return pattern.apply( result = pattern.apply(
money.amount, money.amount,
locale, locale,
currency=money.currency.code, currency=money.currency.code if include_symbol else '',
currency_digits=decimal_places is None, currency_digits=decimal_places is None,
decimal_quantization=decimal_places is not None, decimal_quantization=decimal_places is not None,
) )
return result

View File

@ -204,6 +204,7 @@ def render_currency(
currency=None, currency=None,
min_decimal_places=None, min_decimal_places=None,
max_decimal_places=None, max_decimal_places=None,
include_symbol=True,
): ):
"""Render a currency / Money object to a formatted string (e.g. for reports). """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 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. 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. 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, '']: if money in [None, '']:
return '-' return '-'
@ -258,7 +260,9 @@ def render_currency(
decimal_places = max(decimal_places, max_decimal_places) 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: def getModelsWithMixin(mixin_class) -> list:

View File

@ -358,30 +358,31 @@ class FormatTest(TestCase):
def test_currency_formatting(self): def test_currency_formatting(self):
"""Test that currency formatting works correctly for multiple currencies.""" """Test that currency formatting works correctly for multiple currencies."""
test_data = ( test_data = (
(Money(3651.285718, 'USD'), 4, '$3,651.2857'), # noqa: E201,E202 (Money(3651.285718, 'USD'), 4, True, '$3,651.2857'), # noqa: E201,E202
(Money(487587.849178, 'CAD'), 5, 'CA$487,587.84918'), # noqa: E201,E202 (Money(487587.849178, 'CAD'), 5, True, 'CA$487,587.84918'), # noqa: E201,E202
(Money(0.348102, 'EUR'), 1, '0.3'), # noqa: E201,E202 (Money(0.348102, 'EUR'), 1, False, '0.3'), # noqa: E201,E202
(Money(0.916530, 'GBP'), 1, '£0.9'), # noqa: E201,E202 (Money(0.916530, 'GBP'), 1, True, '£0.9'), # noqa: E201,E202
(Money(61.031024, 'JPY'), 3, '¥61.031'), # noqa: E201,E202 (Money(61.031024, 'JPY'), 3, False, '61.031'), # noqa: E201,E202
(Money(49609.694602, 'JPY'), 1, '¥49,609.7'), # noqa: E201,E202 (Money(49609.694602, 'JPY'), 1, True, '¥49,609.7'), # noqa: E201,E202
(Money(155565.264777, 'AUD'), 2, 'A$155,565.26'), # noqa: E201,E202 (Money(155565.264777, 'AUD'), 2, False, '155,565.26'), # noqa: E201,E202
(Money(0.820437, 'CNY'), 4, 'CN¥0.8204'), # noqa: E201,E202 (Money(0.820437, 'CNY'), 4, True, 'CN¥0.8204'), # noqa: E201,E202
(Money(7587.849178, 'EUR'), 0, '€7,588'), # noqa: E201,E202 (Money(7587.849178, 'EUR'), 0, True, '€7,588'), # noqa: E201,E202
(Money(0.348102, 'GBP'), 3, '£0.348'), # noqa: E201,E202 (Money(0.348102, 'GBP'), 3, False, '0.348'), # noqa: E201,E202
(Money(0.652923, 'CHF'), 0, 'CHF1'), # noqa: E201,E202 (Money(0.652923, 'CHF'), 0, True, 'CHF1'), # noqa: E201,E202
(Money(0.820437, 'CNY'), 1, 'CN¥0.8'), # noqa: E201,E202 (Money(0.820437, 'CNY'), 1, True, 'CN¥0.8'), # noqa: E201,E202
(Money(98789.5295680, 'CHF'), 0, 'CHF98,790'), # noqa: E201,E202 (Money(98789.5295680, 'CHF'), 0, False, '98,790'), # noqa: E201,E202
(Money(0.585787, 'USD'), 1, '$0.6'), # noqa: E201,E202 (Money(0.585787, 'USD'), 1, True, '$0.6'), # noqa: E201,E202
(Money(0.690541, 'CAD'), 3, 'CA$0.691'), # noqa: E201,E202 (Money(0.690541, 'CAD'), 3, True, 'CA$0.691'), # noqa: E201,E202
(Money(427.814104, 'AUD'), 5, 'A$427.81410'), # noqa: E201,E202 (Money(427.814104, 'AUD'), 5, True, 'A$427.81410'), # noqa: E201,E202
) )
with self.settings(LANGUAGE_CODE='en-us'): 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( 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): class TestHelpers(TestCase):