From 12de34e354f7ddc308dac720202e4139aef336f3 Mon Sep 17 00:00:00 2001 From: S4NKALP Date: Fri, 30 Jan 2026 19:50:45 +0545 Subject: [PATCH] feat: add Nepali currency field, number to words, and unicode helpers --- django_nepkit/admin.py | 6 +- django_nepkit/templatetags/nepali.py | 3 + django_nepkit/tests/test_admin_currency.py | 13 +- .../tests/test_currency_and_words.py | 14 ++- django_nepkit/utils.py | 112 ++++++++++++++++-- 5 files changed, 128 insertions(+), 20 deletions(-) diff --git a/django_nepkit/admin.py b/django_nepkit/admin.py index 5a953cb..60bfe92 100644 --- a/django_nepkit/admin.py +++ b/django_nepkit/admin.py @@ -3,7 +3,11 @@ from django.utils.translation import gettext_lazy as _ from nepali.datetime import nepalidate, nepalidatetime from django_nepkit.conf import nepkit_settings -from django_nepkit.models import NepaliDateField, NepaliDateTimeField, NepaliCurrencyField +from django_nepkit.models import ( + NepaliDateField, + NepaliDateTimeField, + NepaliCurrencyField, +) from django_nepkit.utils import ( try_parse_nepali_date, try_parse_nepali_datetime, diff --git a/django_nepkit/templatetags/nepali.py b/django_nepkit/templatetags/nepali.py index 6f1a302..6aae52b 100644 --- a/django_nepkit/templatetags/nepali.py +++ b/django_nepkit/templatetags/nepali.py @@ -72,6 +72,7 @@ def nepali_humanize(value, threshold=None, format_str=None): def nepali_currency(value, currency_symbol="Rs."): """Format a number with Nepali-style commas and optional currency symbol.""" from django_nepkit.utils import format_nepali_currency + return format_nepali_currency(value, currency_symbol=currency_symbol) @@ -79,6 +80,7 @@ def nepali_currency(value, currency_symbol="Rs."): def nepali_words(value): """Convert a number to Nepali words.""" from django_nepkit.utils import number_to_nepali_words + return number_to_nepali_words(value) @@ -86,4 +88,5 @@ def nepali_words(value): def nepali_unicode(value): """Convert English digits to Nepali Unicode.""" from django_nepkit.utils import english_to_nepali_unicode + return english_to_nepali_unicode(value) diff --git a/django_nepkit/tests/test_admin_currency.py b/django_nepkit/tests/test_admin_currency.py index 1a78425..eb89db5 100644 --- a/django_nepkit/tests/test_admin_currency.py +++ b/django_nepkit/tests/test_admin_currency.py @@ -1,24 +1,27 @@ -import pytest from django_nepkit.admin import NepaliModelAdmin from django_nepkit.models import NepaliCurrencyField from django.db import models from django.contrib.admin.sites import AdminSite + class MockModel(models.Model): amount = NepaliCurrencyField() + class Meta: - app_label = 'django_nepkit' + app_label = "django_nepkit" + class MockAdmin(NepaliModelAdmin): - list_display = ('amount',) + list_display = ("amount",) + def test_admin_currency_formatting(): admin = MockAdmin(MockModel, AdminSite()) displays = admin.get_list_display(None) - + # The first item should now be a callable (the display function) assert callable(displays[0]) - + # Test the formatter directly obj = MockModel(amount=1234567) assert admin.format_nepali_currency(obj.amount) == "Rs. 12,34,567" diff --git a/django_nepkit/tests/test_currency_and_words.py b/django_nepkit/tests/test_currency_and_words.py index c60fb09..afd3eb4 100644 --- a/django_nepkit/tests/test_currency_and_words.py +++ b/django_nepkit/tests/test_currency_and_words.py @@ -1,7 +1,10 @@ -import pytest -from django_nepkit.utils import format_nepali_currency, number_to_nepali_words, english_to_nepali_unicode +from django_nepkit.utils import ( + format_nepali_currency, + number_to_nepali_words, + english_to_nepali_unicode, +) from django_nepkit.models import NepaliCurrencyField -from django.db import models + def test_format_nepali_currency(): assert format_nepali_currency(1234567) == "Rs. 12,34,567.00" @@ -10,6 +13,7 @@ def test_format_nepali_currency(): assert format_nepali_currency(100.5) == "Rs. 100.50" assert format_nepali_currency(None) == "" + def test_number_to_nepali_words(): assert number_to_nepali_words(0) == "शून्य" assert number_to_nepali_words(1) == "एक" @@ -23,16 +27,18 @@ def test_number_to_nepali_words(): assert number_to_nepali_words(1234567) == "बाह्र लाख चौंतीस हजार पाँच सय सतसट्ठी" # Note: 12,34,567 -> 12 Lakhs 34 Thousand 5 Hundred 67 + def test_english_to_nepali_unicode(): assert english_to_nepali_unicode("123") == "१२३" assert english_to_nepali_unicode("Price: 100") == "Price: १००" assert english_to_nepali_unicode(None) == "" + def test_nepali_currency_field(): field = NepaliCurrencyField(max_digits=10, decimal_places=2) assert field.max_digits == 10 assert field.decimal_places == 2 - + default_field = NepaliCurrencyField() assert default_field.max_digits == 19 assert default_field.decimal_places == 2 diff --git a/django_nepkit/utils.py b/django_nepkit/utils.py index 40e0a82..5d52946 100644 --- a/django_nepkit/utils.py +++ b/django_nepkit/utils.py @@ -143,16 +143,108 @@ def number_to_nepali_words(number: Any) -> str: if num == 0: return "शून्य" - ones = ["", "एक", "दुई", "तीन", "चार", "पाँच", "छ", "सात", "आठ", "नौ", "दश", - "एघार", "बाह्र", "तेह्र", "चौध", "पन्ध्र", "सोह्र", "सत्र", "अठार", "उन्नाइस", "बीस", - "एकाइस", "बाइस", "तेईस", "चौबीस", "पच्चीस", "छब्बीस", "सत्ताइस", "अठाइस", "उनन्तीस", "तीस", - "एकतीस", "बत्तीस", "तेत्तीस", "चौंतीस", "पैंतीस", "छत्तीस", "सैंतीस", "अठतीस", "उनन्चालीस", "चालीस", - "एकचालीस", "बयालीस", "त्रिचालीस", "चवालीस", "पैंतालीस", "छयालीस", "सत्तालीस", "अठचालीस", "उनन्पचास", "पचास", - "एकाउन्न", "बाउन्न", "त्रिपन्न", "चउन्न", "पचपन्न", "छपन्न", "सन्ताउन्न", "अन्ठाउन्न", "उनन्साठी", "साठी", - "एकसाठी", "बासट्ठी", "त्रिसट्ठी", "चौसट्ठी", "पैंसट्ठी", "छयसट्ठी", "सतसट्ठी", "अठसट्ठी", "उनन्सत्तरी", "सत्तरी", - "एकहत्तर", "बाहत्तर", "त्रिहत्तर", "चौरहत्तर", "पचहत्तर", "छयहत्तर", "सतहत्तर", "अठहत्तर", "उनन्असी", "असी", - "एकासी", "बयासी", "त्रियासी", "चौरासी", "पचासी", "छयासी", "सतासी", "अठासी", "उनन्नब्बे", "नब्बे", - "एकानब्बे", "बयानब्बे", "त्रियानब्बे", "चौरानब्बे", "पञ्चानब्बे", "छ्यानब्बे", "सन्तानब्बे", "अन्ठानब्बे", "उनन्सय"] + ones = [ + "", + "एक", + "दुई", + "तीन", + "चार", + "पाँच", + "छ", + "सात", + "आठ", + "नौ", + "दश", + "एघार", + "बाह्र", + "तेह्र", + "चौध", + "पन्ध्र", + "सोह्र", + "सत्र", + "अठार", + "उन्नाइस", + "बीस", + "एकाइस", + "बाइस", + "तेईस", + "चौबीस", + "पच्चीस", + "छब्बीस", + "सत्ताइस", + "अठाइस", + "उनन्तीस", + "तीस", + "एकतीस", + "बत्तीस", + "तेत्तीस", + "चौंतीस", + "पैंतीस", + "छत्तीस", + "सैंतीस", + "अठतीस", + "उनन्चालीस", + "चालीस", + "एकचालीस", + "बयालीस", + "त्रिचालीस", + "चवालीस", + "पैंतालीस", + "छयालीस", + "सत्तालीस", + "अठचालीस", + "उनन्पचास", + "पचास", + "एकाउन्न", + "बाउन्न", + "त्रिपन्न", + "चउन्न", + "पचपन्न", + "छपन्न", + "सन्ताउन्न", + "अन्ठाउन्न", + "उनन्साठी", + "साठी", + "एकसाठी", + "बासट्ठी", + "त्रिसट्ठी", + "चौसट्ठी", + "पैंसट्ठी", + "छयसट्ठी", + "सतसट्ठी", + "अठसट्ठी", + "उनन्सत्तरी", + "सत्तरी", + "एकहत्तर", + "बाहत्तर", + "त्रिहत्तर", + "चौरहत्तर", + "पचहत्तर", + "छयहत्तर", + "सतहत्तर", + "अठहत्तर", + "उनन्असी", + "असी", + "एकासी", + "बयासी", + "त्रियासी", + "चौरासी", + "पचासी", + "छयासी", + "सतासी", + "अठासी", + "उनन्नब्बे", + "नब्बे", + "एकानब्बे", + "बयानब्बे", + "त्रियानब्बे", + "चौरानब्बे", + "पञ्चानब्बे", + "छ्यानब्बे", + "सन्तानब्बे", + "अन्ठानब्बे", + "उनन्सय", + ] units = [ ("", ""),