Files
django-nepkit/example/demo/views.py
T
sankalp c6301686cc feat: add Nepali currency support, number-to-words conversion, and REST API enhancements
- Implement NepaliCurrencyField for model-level currency handling.
- Add format_nepali_currency utility with Lakhs/Crores comma formatting and decimal support.
- Implement number_to_nepali_words and english_to_nepali_unicode helper functions.
- Add nepali_currency, nepali_words, and nepali_unicode template filters.
- Enhance REST API (DRF) support:
    - Added NepaliCurrencySerializerField for formatted currency output.
    - Added NepaliLocalizedSerializerMixin for automatic Devanagari field generation.
    - Added flexible NepaliCurrencyRangeFilter and NepaliDateRangeFilter.
- Integrated automatic currency formatting into NepaliModelAdmin.
- Expanded the example demo app with a Transaction model and updated filters.
- Added comprehensive unit tests for formatting, models, and API components.
- Updated documentation (README.md and todo.md) to reflect new features.
2026-01-30 20:06:39 +05:45

140 lines
3.9 KiB
Python

from django import forms
from django.shortcuts import render, redirect
from rest_framework import viewsets, filters as drf_filters
from django_filters import rest_framework as django_filters
from django_nepkit.filters import NepaliDateYearFilter, NepaliDateMonthFilter
from .models import Person, Citizen, AuditedPerson, Transaction
from .serializers import (
PersonSerializer,
CitizenSerializer,
AuditedPersonSerializer,
TransactionSerializer,
)
from django_nepkit.filters import (
NepaliDateYearFilter,
NepaliDateMonthFilter,
NepaliCurrencyRangeFilter,
NepaliDateRangeFilter,
)
class PersonForm(forms.ModelForm):
class Meta:
model = Person
fields = [
"name",
"birth_date",
"birth_date_ne",
"phone_number",
"province",
"province_ne",
"district",
"district_ne",
"municipality",
"municipality_ne",
]
def person_list(request):
persons = Person.objects.all()
transactions = Transaction.objects.all()
return render(
request,
"demo/person_list.html",
{"persons": persons, "transactions": transactions},
)
def person_create(request):
if request.method == "POST":
form = PersonForm(request.POST)
if form.is_valid():
form.save()
return redirect("demo:person-list")
else:
form = PersonForm()
return render(request, "demo/person_form.html", {"form": form})
class TransactionForm(forms.ModelForm):
class Meta:
model = Transaction
fields = ["title", "amount"]
def transaction_create(request):
if request.method == "POST":
form = TransactionForm(request.POST)
if form.is_valid():
form.save()
return redirect("demo:person-list")
else:
form = TransactionForm()
return render(
request, "demo/person_form.html", {"form": form, "title": "Add Transaction"}
)
# --- API Support (DRF) ---
class PersonViewSet(viewsets.ModelViewSet):
queryset = Person.objects.all()
serializer_class = PersonSerializer
# Sort and Search work automatically with BS date strings
filter_backends = [
django_filters.DjangoFilterBackend,
drf_filters.SearchFilter,
drf_filters.OrderingFilter,
]
ordering_fields = ["birth_date", "created_at"]
search_fields = ["name", "birth_date", "phone_number"]
# Simple exact date filter
filterset_fields = {
"birth_date": ["exact"],
}
class PersonFilter(django_filters.FilterSet):
year = NepaliDateYearFilter(field_name="birth_date")
month = NepaliDateMonthFilter(field_name="birth_date")
class Meta:
model = Person
fields = ["province", "district"]
filterset_class = PersonFilter
class CitizenViewSet(viewsets.ModelViewSet):
queryset = Citizen.objects.all()
serializer_class = CitizenSerializer
filter_backends = [drf_filters.OrderingFilter]
ordering_fields = ["province", "district"]
class AuditedPersonViewSet(viewsets.ModelViewSet):
queryset = AuditedPerson.objects.all()
serializer_class = AuditedPersonSerializer
filter_backends = [drf_filters.SearchFilter, drf_filters.OrderingFilter]
search_fields = ["name", "birth_date"]
ordering_fields = ["created_at"]
class TransactionViewSet(viewsets.ModelViewSet):
queryset = Transaction.objects.all()
serializer_class = TransactionSerializer
filter_backends = [django_filters.DjangoFilterBackend]
class TransactionFilter(django_filters.FilterSet):
amount_range = NepaliCurrencyRangeFilter(field_name="amount")
date_range = NepaliDateRangeFilter(field_name="date")
class Meta:
model = Transaction
fields = ["title", "amount", "date"]
filterset_class = TransactionFilter