Files
django-nepkit/example/demo/views.py
T
sankalp 1338f9e5fe refactor: global project refinement, DRY consolidation, and documentation overhaul
This commit represents a comprehensive improvement of the library's architecture, developer experience, and documentation accuracy.

Core Refactoring:
- apply DRY principle to models.py by introducing BaseNepaliBSField and BaseLocationField
- standardize widget logic in widgets.py using NepaliWidgetMixin
- centralize admin filtering logic into BaseNepaliDateFilter

New Features & API:
- add NepaliMonthFilter for Django Admin and NepaliDateMonthFilter for DRF
- implementation of HTMX-driven location chaining for dynamic address selects
- extend demo project with comprehensive DRF search, ordering, and filter examples

Configuration & Sync:
- implement global NEPKIT settings in conf.py (DEFAULT_LANGUAGE, ADMIN_DATEPICKER, etc.)
- universalize BS_DATE_FORMAT/BS_DATETIME_FORMAT across the entire stack
- synchronize frontend datepicker initialization with backend date formats

Documentation & DX:
- complete rewrite of README.md into high-energy, factual, English-only guides
- project-wide audit and simplification of comments/docstrings for beginner accessibility
- expanded 'Technical Design' and 'FAQ' sections covering data integrity and storage
- added docs/migration_guide.py for bulk AD-to-BS data transitions

Quality & Maintenance:
- fixed all E402 module-level import errors across the library
- verified codebase with project-wide ruff checks (all checks passed)
2026-01-30 17:00:33 +05:45

89 lines
2.6 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
from .serializers import PersonSerializer, CitizenSerializer, AuditedPersonSerializer
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()
return render(request, "demo/person_list.html", {"persons": persons})
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})
# --- 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"]